我正在学习制作简单的游戏,并且已经成功编码了非常基本的弹跳动作,其中,按下跳键后,玩家回到地面并再次弹跳,从而产生了一种愚蠢的错觉物理。 我遇到的问题是如何实现它,以便播放器弹跳的速度不是一次而是两次。 换句话说,现在的代码非常简单(稍后再介绍):有一个“已跳转”标志,一旦跳转,该标志就为真,并在下一帧进行检查以查看是否是的,如果是的话,我只是将一些速度添加到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

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

1回复

LWJGL仅旋转一个对象

我试图旋转我使用LWJGL在Java中创建的场景中的两个对象之一。 现在,当我尝试旋转一个对象时,它不会绕其中心旋转,而是绕大圆圈旋转。 在Google上搜索后,我现在知道它应该像这样工作: 但这对我不起作用。 对象没有旋转。 这是我的渲染代码: 我现在尝试修复此问题数
1回复

LWJGL仅渲染一个对象

如标题所示,我试图使用LWJGL同时渲染两个三维对象,但是,只有第二个三维对象正在渲染。 我做了一些搜索,并在每次渲染之前和之后添加了glPushMatrix()和glPopMatrix() 。 另外,我尝试使用ArrayList动态而不是静态地渲染每个对象。 实际的渲染代码,每帧调用一
2回复

LWJGL在屏幕上仅旋转一个对象

我正在尝试旋转屏幕上的两个对象中的一个。 我该怎么做? 我只能让它旋转屏幕上的所有对象。 码: 我到目前为止的代码。
1回复

lwjgl,仅在屏幕上旋转一个对象?

因此,我试图仅旋转一个对象,我已经阅读了有关如何旋转的其他文章,但所有文章都只是这样说:1.调用glLoadIdentity(); 2.绘制形状3.旋转 我尝试了他们告诉我的操作,但似乎对我不起作用? 这是我的代码。 在称为faces的数组中,有4个quad,其中3个具有nee
1回复

对象上的LWJGL纹理-Java

我在矩形多边形上绘制纹理时遇到问题。 这是我当前的代码。 它似乎只是在块周围像一条细线一样绘制。 有谁知道我该如何解决?
1回复

带有LWJGL的GLFW-一次glfwGetKey

我正在用Java和LWJGL3开发游戏。 但是我不知道如何解决我的问题,我尝试在互联网上进行搜索,但是有关LWJGL的信息很少,我找不到有关GLFW的任何信息。 比方说,例如,我有一个带有4个按钮的菜单(新游戏,选项,积分,退出)和一个count变量,可以知道选择了哪个。 每次按下向上
1回复

LWJGL窗口每秒仅更新一次帧吗?

据我了解,它应该尝试每秒重绘窗口100次。 相反,它每秒精确地更新一次。 这只是从今天开始,据我所知,我尚未对将影响此代码的代码进行任何更改。 可能是任何一个循环都花费了特别长的时间,还是其中一个限制了时间?
2回复

java lwjgl如何使鼠标不可见

我正在制作3D游戏,并且我刚刚能够使用鼠标移动摄像头,然后将鼠标放回中心。 但是我不想让用户在屏幕中央看到讨厌的鼠标! 所以我要问的是:如何使鼠标不可见? /如何使光标消失? 我以为会有Mouse.setVisible(false); 但似乎不存在。 提前致谢。 我也想做而不做空白
1回复

LWJGL使对象始终面朝上

无论3D对象在相机中的位置如何,都需要使它们朝上。 好像相机距离很远并且可以放大。这就是我的意思(看一下支柱和墙壁):http: //youtu.be/Pn9fh93oV-c 这是我到目前为止的内容:
1回复

LWJGL绑定着色器两次使渲染无任何效果

我正在尝试使用LWJGL创建基本的渲染引擎,而我最近遇到了一个障碍。 每当我尝试更改在一个帧中两次绘制对象的着色器均匀性时,该程序只会显示清晰的颜色。 我认为搞砸的地方是SceneLoader类的第82行,但我不知道。 这是我第一次使用Lwjgl,因此对它的任何帮助将不胜感激。 谢谢!