我正在学习制作简单的游戏,并且已经成功编码了非常基本的弹跳动作,其中,按下跳键后,玩家回到地面并再次弹跳,从而产生了一种愚蠢的错觉物理。 我遇到的问题是如何实现它,以便播放器弹跳的速度不是一次而是两次。 换句话说,现在的代码非常简单(稍后再介绍):有一个“已跳转”标志,一旦跳转,该标志就为真,并在下一帧进行检查以查看是否是的,如果是的话,我只是将一些速度添加到y轴速度,然后播放器就会弹起。 但是我似乎找不到编码第二次弹跳的方法,因为所有事情都是逐帧进行的。 我需要为第二次弹跳添加甚至更低的速度,但是只有在第一次弹跳发生之后,我现在所能获得的只是这些速度之和,只有一个弹跳。 我不知道该如何诱使程序增加第一个速度,“等待”直到它到达地面,然后添加第二个速度,然后绘制下一帧。

这是一次弹跳的代码(有效)

       if (y <= 48) { // if player is on the ground
        yspeed = 0;
        y = 48;

        // Friction on ground

        if ((!Keyboard.isKeyDown(Keyboard.KEY_LEFT)) && xspeed < 0) xspeed = xspeed * 0.925;
        if ((!Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) && xspeed > 0) xspeed = xspeed * 0.925;

        if (jumped == true) 
        {
            yspeed += 4.2;
            jumped = false;
        }



        // Jump

        if (Keyboard.isKeyDown(Keyboard.KEY_UP)) 
        {
            yspeed = 10;
            jumped = true;

        }

===============>>#1 票数:1 已采纳

我将代码重新排列为如下形式:

boolean airborne = false;

while (true) // the main game loop
{
    if (y <= 48 && airborne) // if player just hit the ground
    {
        //  Perform the "bounce" by changing their vertical direction and decreasing its magnitude
        ySpeed = -ySpeed/2.0;

        //  This will stop them from bouncing infinitely.  After the bounce gets too small,
        //  they will finally land on the ground.  I suggest you play around with this number to find one that works well
        if (Math.abs(ySpeed) <= 0.5)
        {
            //  Stop the bouncing
            ySpeed = 0;

            //  Place them on the ground
            airborne = false;
            y = 48;
        }
    }
    //  Apply friction if they are on the ground
    if (!airborne)
    {
        // Friction on ground
        if ((!Keyboard.isKeyDown(Keyboard.KEY_LEFT)) && xspeed < 0) xspeed = xspeed * 0.925;
        if ((!Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) && xspeed > 0) xspeed = xspeed * 0.925;
    }
    //  Apply a jump action if they're pressing the jump button while on the ground
    if (Keyboard.isKeyDown(Keyboard.KEY_UP) && !airborne) 
    {
        airborne = true;
        yspeed = 10;
    }
}

因此,在这种情况下,您不必跟踪它们是否刚刚执行了跳转,而是跟踪它们是否处于空中。

我假设您有某种重力常数,每帧都要从ySpeed变量中减去。 在每一帧中,如果它们在地面上,或者它们在地面上不施加重力,您都希望将其ySpeed重置为零。

  ask by Leo translate from so

未解决问题?本站智能推荐: