BoneNode.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Godot;
  2. using System;
  3. public partial class BoneNode : Node2D
  4. {
  5. private SpineSprite spineboy;
  6. private SpineBoneNode centerBone;
  7. private RayCast2D centerRay;
  8. private SpineBoneNode targetBone;
  9. private RayCast2D targetRay;
  10. private SpineBoneNode hipBone;
  11. private float centerHipDistance = 0;
  12. public override void _Ready()
  13. {
  14. spineboy = GetNode<SpineSprite>("SpineSprite");
  15. centerBone = GetNode<SpineBoneNode>("SpineSprite/HoverboardCenterBone");
  16. centerRay = GetNode<RayCast2D>("SpineSprite/HoverboardCenterBone/CenterRay");
  17. targetBone = GetNode<SpineBoneNode>("SpineSprite/HoverboardTargetBone");
  18. targetRay = GetNode<RayCast2D>("SpineSprite/HoverboardTargetBone/TargetRay");
  19. hipBone = GetNode<SpineBoneNode>("SpineSprite/HipBone");
  20. spineboy.GetAnimationState().SetAnimation("hoverboard", true, 0);
  21. spineboy.UpdateSkeleton(0);
  22. centerHipDistance = hipBone.GlobalPosition.Y - centerBone.GlobalPosition.Y;
  23. }
  24. public override void _Process(double delta)
  25. {
  26. if (targetRay.IsColliding())
  27. {
  28. var newPosition = targetBone.GlobalPosition;
  29. newPosition.Y = targetRay.GetCollisionPoint().Y - 30;
  30. targetBone.Position = newPosition;
  31. }
  32. if (centerRay.IsColliding())
  33. {
  34. var newPosition = centerBone.GlobalPosition;
  35. newPosition.Y = centerRay.GetCollisionPoint().Y - 30;
  36. centerBone.Position = newPosition;
  37. }
  38. if (Math.Abs(hipBone.GlobalPosition.Y - centerBone.GlobalPosition.Y) - Math.Abs(centerHipDistance) < 20)
  39. {
  40. var newPosition = hipBone.GlobalPosition;
  41. newPosition.Y = centerBone.GlobalPosition.Y + centerHipDistance;
  42. hipBone.Position = newPosition;
  43. }
  44. var position = spineboy.GlobalPosition;
  45. position.X += (float)delta * 150;
  46. spineboy.GlobalPosition = position;
  47. }
  48. }