mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-20 09:16:01 +08:00
55 lines
1.7 KiB
C#
55 lines
1.7 KiB
C#
using Godot;
|
|
using System;
|
|
|
|
public partial class BoneNode : Node2D
|
|
{
|
|
private SpineSprite spineboy;
|
|
private SpineBoneNode centerBone;
|
|
private RayCast2D centerRay;
|
|
private SpineBoneNode targetBone;
|
|
private RayCast2D targetRay;
|
|
private SpineBoneNode hipBone;
|
|
private float centerHipDistance = 0;
|
|
|
|
public override void _Ready()
|
|
{
|
|
spineboy = GetNode<SpineSprite>("SpineSprite");
|
|
centerBone = GetNode<SpineBoneNode>("SpineSprite/HoverboardCenterBone");
|
|
centerRay = GetNode<RayCast2D>("SpineSprite/HoverboardCenterBone/CenterRay");
|
|
targetBone = GetNode<SpineBoneNode>("SpineSprite/HoverboardTargetBone");
|
|
targetRay = GetNode<RayCast2D>("SpineSprite/HoverboardTargetBone/TargetRay");
|
|
hipBone = GetNode<SpineBoneNode>("SpineSprite/HipBone");
|
|
spineboy.GetAnimationState().SetAnimation("hoverboard", true, 0);
|
|
spineboy.UpdateSkeleton(0);
|
|
centerHipDistance = hipBone.GlobalPosition.Y - centerBone.GlobalPosition.Y;
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
if (targetRay.IsColliding())
|
|
{
|
|
var newPosition = targetBone.GlobalPosition;
|
|
newPosition.Y = targetRay.GetCollisionPoint().Y - 30;
|
|
targetBone.Position = newPosition;
|
|
}
|
|
|
|
if (centerRay.IsColliding())
|
|
{
|
|
var newPosition = centerBone.GlobalPosition;
|
|
newPosition.Y = centerRay.GetCollisionPoint().Y - 30;
|
|
centerBone.Position = newPosition;
|
|
}
|
|
|
|
if (Math.Abs(hipBone.GlobalPosition.Y - centerBone.GlobalPosition.Y) - Math.Abs(centerHipDistance) < 20)
|
|
{
|
|
var newPosition = hipBone.GlobalPosition;
|
|
newPosition.Y = centerBone.GlobalPosition.Y + centerHipDistance;
|
|
hipBone.Position = newPosition;
|
|
}
|
|
|
|
var position = spineboy.GlobalPosition;
|
|
position.X += (float)delta * 150;
|
|
spineboy.GlobalPosition = position;
|
|
}
|
|
}
|