Grid -basierte Bewegung in Godot 4.3 C# fühlen sich abgehackt und nicht ganz reaktionsschnellC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Grid -basierte Bewegung in Godot 4.3 C# fühlen sich abgehackt und nicht ganz reaktionsschnell

Post by Anonymous »

Ich versuche, einen Pokemon -Gameboy -wie -Grid -Basis -Bewegung in Godot zu kreieren, aber die Bewegung ist abgehackt, es fühlt sich seltsam an, als wenn sich der Charakter nach einem Fliese bewegt, gibt es eine kurze Pause, nach der er fortfährt. Versuch, die Richtung zu drehen, ist ziemlich der Aufwand, da Sie für ein wenig Zeit stehen müssen, bevor Sie sich mit einem anderen Lokus befassen. Add-On, weshalb die Eingabe innerhalb des nicht abgewandelten Eingangs befindet und Tweening für die tatsächliche Bewegung verwendet und überprüft wird, ob ich tatsächlich zum nächsten Kachel < /p>
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));
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post