我想用 C# 在 Godot 中实现双跳机制,但它没有按预期工作。也许有人在我的代码中发现了问题并可以给我提示! :)
我的角色跳跃一次然后直接向下,而不是进行二段跳。 感谢您的帮助。
using Godot;
public partial class Player : CharacterBody2D
{
private float _runSpeed = 750;
private float _jumpSpeed = -1000;
private float _gravity = 2500;
private int _jump_counter = 0;
private int _extra_jumps = 1;
public override void _PhysicsProcess(double delta)
{
var velocity = Velocity;
velocity.X = 0;
var right = Input.IsActionPressed("move_right");
var left = Input.IsActionPressed("move_left");
var jump = Input.IsActionPressed("move_jump");
//TODO -> Implement double jump
if (jump && _jump_counter < _extra_jumps){
velocity.Y = _jumpSpeed;
_jump_counter += 1;
GD.Print(_jump_counter + " " + _extra_jumps);
}
if (right){
velocity.X += _runSpeed;
}
if (left){
velocity.X -= _runSpeed;
}
if (IsOnFloor()){
_jump_counter = 0;
}
Velocity = velocity;
var animatedSprite2D = GetNode<AnimatedSprite2D>("Sprite2D");
if (velocity.Length() > 0)
{
velocity = velocity.Normalized() * _runSpeed;
animatedSprite2D.Play();
}
else
{
animatedSprite2D.Stop();
}
if (velocity.X != 0)
{
animatedSprite2D.Animation = "walking";
animatedSprite2D.FlipV = false;
// See the note below about boolean assignment.
animatedSprite2D.FlipH = velocity.X < 0;
}
velocity = Velocity;
velocity.Y += _gravity * (float)delta;
Velocity = velocity;
MoveAndSlide();
}
}
提前谢谢您。
这里的问题是你如何接受你的意见。对于跳跃,用
Input.IsActionPressed
检查跳转键的所有按下情况可能并不合适,而是用 Input.IsActionJustPressed
检查跳转键的 first按下。由于
PhysicsProcess
在短时间内被多次调用,因此很可能在下次调用时玩家仍然按住该键,从而导致两次几乎同时的跳跃。这对于左右移动之类的事情来说很好,这应该是一个连续的动作,但对于跳跃来说却不太合适,因为跳跃应该是一个离散的动作。
var right = Input.IsActionPressed("move_right");
var left = Input.IsActionPressed("move_left");
var jump = Input.IsActionJustPressed("move_jump");
这应该可以解决问题。