Godot C# - 如何实现双跳

问题描述 投票:0回答:1

我想用 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(); 
   }
}

提前谢谢您。

c# game-physics game-development godot godot4
1个回答
0
投票

这里的问题是你如何接受你的意见。对于跳跃,用

Input.IsActionPressed
检查跳转键的所有按下情况可能并不合适,而是用 Input.IsActionJustPressed 检查跳转键的
first
按下。由于
PhysicsProcess
在短时间内被多次调用,因此很可能在下次调用时玩家仍然按住该键,从而导致两次几乎同时的跳跃。这对于左右移动之类的事情来说很好,这应该是一个连续的动作,但对于跳跃来说却不太合适,因为跳跃应该是一个离散的动作。

    var right = Input.IsActionPressed("move_right");
    var left = Input.IsActionPressed("move_left");
    var jump = Input.IsActionJustPressed("move_jump");

这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.