wechseln kann
Code: Select all
using Godot;
using Godot.Collections;
public partial class CharacterBody2d : CharacterBody2D
{
int tile_size = 16;
bool moving;
Vector2 input_dir = Vector2.Zero;
Vector2 last_dir = Vector2.Down;
AnimatedSprite2D charAnim;
Marker2D directionMarker;
Area2D actionableFinder;
public Tween tween;
public override void _Ready()
{
charAnim = GetNode("AnimatedSprite2D");
directionMarker = FindChild("Direction") as Marker2D;
actionableFinder = GetNode("Direction/Area2D");
if (actionableFinder == null)
{
GD.PrintErr("Actionale Node is empty");
}
else
{
GD.Print("Found: " + actionableFinder.Name);
}
}
public override void _UnhandledInput(InputEvent @event)
{
if (Input.IsActionJustPressed("ui_accept"))
{
Array actionables = actionableFinder.GetOverlappingAreas();
if (actionables.Count > 0)
{
(actionables[0] as Actionable).Action();
input_dir = Vector2.Zero;
GD.Print("Hey Man!");
}
}
if (moving) return;
input_dir = Vector2.Zero;
if (Input.IsActionPressed("ui_down"))
{
input_dir = Vector2.Down;
directionMarker.Rotation = Mathf.DegToRad(0);
charAnim.Play("WalkFront");
}
else if (Input.IsActionPressed("ui_up"))
{
input_dir = Vector2.Up;
directionMarker.Rotation = Mathf.DegToRad(180);
charAnim.Play("WalkBack");
}
else if (Input.IsActionPressed("ui_right"))
{
input_dir = Vector2.Right;
directionMarker.Rotation = Mathf.DegToRad(270);
charAnim.FlipH = true;
charAnim.Play("WalkSide");
}
else if (Input.IsActionPressed("ui_left"))
{
input_dir = Vector2.Left;
directionMarker.Rotation = Mathf.DegToRad(90);
charAnim.FlipH = false;
charAnim.Play("WalkSide");
}
if (input_dir != Vector2.Zero)
{
if (!moving)
{
last_dir = input_dir;
Move();
}
}
}
public override void _PhysicsProcess(double delta)
{
if (!moving && input_dir == Vector2.Zero)
{
if (last_dir == Vector2.Down) charAnim.Play("IdleFront");
else if (last_dir == Vector2.Up) charAnim.Play("IdleBack");
else if (last_dir == Vector2.Left)
{
charAnim.FlipH = false;
charAnim.Play("IdleSide");
}
else if (last_dir == Vector2.Right)
{
charAnim.FlipH = true;
charAnim.Play("IdleSide");
}
}
}
protected void Move()
{
if (moving) return;
Vector2 motion = input_dir * tile_size;
bool canMove = !TestMove(Transform.Translated(motion), Vector2.Zero);
if (canMove)
{
moving = true;
Vector2 target_pos = Position + motion;
tween = CreateTween();
tween.TweenProperty(this, "position", target_pos, 0.35);
tween.TweenCallback(Callable.From(() => moving = false));
}
}
}