【问题标题】:LWJGL - Making the 3D FPS camera jumpLWJGL - 使 3D FPS 相机跳跃
【发布时间】:2014-05-03 16:02:21
【问题描述】:

所以我正在做我的第一个 3D 项目,一切都很顺利,直到我决定让 FPS 角色(相机)跳跃。我尝试了一些方法,但在我成功完成大多数的工作之前,所有这些方法看起来都不是很好。现在的问题是“大部分时间” - 这应该是所有时间。

问题是当我连续点击跳转按钮时,它开始发疯。当我超过它时,我试图将位置始终设置回零,但有时它仍然会发疯,尽管频率较低。有什么建议可以让它一直工作吗? (我正在使用没有引擎的 OpenGL 和 java)

跳跃部分代码:

if (Keyboard.isKeyDown(Keyboard.KEY_SPACE) && !jumping
    && position.y >= temp) { //temp - floor height 
jumping = true;
}
gravity = (float) ((walkingSpeed * 0.00003) * delta);//delta - time
//System.out.println(delta);
if (position.y < temp) { //In the air
    speed = speed + gravity;
    position.y = position.y + speed;
}
if (jumping) {
    speed = speed - (float) ((walkingSpeed * 0.0006) * delta);
    position.y = position.y + speed;
    jumping = false;
}
if (position.y > temp) //**Supposed** to solve the problem
    position.y = temp;

【问题讨论】:

  • 不清楚您的问题到底是什么。问题是你可以在半空中跳跃吗?您可能应该将jumping 状态保持为 true 直到落地,而不是在对速度进行瞬时更改后立即将其重置。正确地这样做当然需要某种碰撞检测,但您可以天真地假设地面是一个水平面并针对初始高度进行测试(我认为您现在正在这样做)。
  • 顺便说一下,一些 FPS 游戏允许您进行二段跳,因此与其将 jumping 设为布尔值,不如考虑使用整数计数器。
  • @AndonM.Coleman - 我已经阻止了在半空中的跳跃,是的,我现在正将地板看成水平面。我的问题是当我不断点击空格键时。起初,它有规律地跳跃,但一段时间后它开始突然从我写的或相反的地方跳跃 X10。我不知道为什么会这样,我需要一个建议如何做得更好\修复它。关于二段跳——不是现在。我首先需要基础知识。我正在做一个普通房间里的简单步行,稍后我会扩展它。
  • 嗯,是的。这里的问题是,如果您连续按住空格键,它不会阻止您无限次跳跃。只应在落地后将jumping 设置为 false。否则,当空格键按下时发生的每一帧都会让你跳跃。
  • @AndonM.Coleman - 不,这不是让我再次跳跃的问题。我跳下来摔倒,只有当我触到地板时我才能再次跳(看看代码中的第一个 if 语句)。我会尽力解释得更好。例如,我应该从 y=0 跳到 y=3 并且它可以工作。但有时当我单击一次空​​格键时,它会突然跳转到 y=17。这发生在我之前连续单击空格键之后(例如,有时它也会跳到 y=0.5)。那里发生了一些事情,即使在常规跳跃中也会让它变得异常,我必须重新打开游戏才能让它再次工作。

标签: java opengl 3d game-physics


【解决方案1】:

您的代码中有许多问题与您所描述的不同步:

  1. 几乎所有东西的符号都颠倒了
  2. 您正在测试 always 评估为 true (!jumping)
  3. 的条件

// Only start a jump while on the ground (position.y <= temp)
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE) && position.y <= temp) {
  speed = speed + (float) ((walkingSpeed * 0.0006));
  // Don't care about the delta time when you jump, just add a fixed amount of
  // positive vertical velocity (which gravity will work out over time).
}

// You had gravity going the wrong direction initially
gravity = (float) -((walkingSpeed * 0.00003) * delta);

//System.out.println(delta);
speed      = speed + gravity;
position.y = position.y + speed;

if (position.y < temp) { // Don't sink into the ground
  position.y = temp;
  speed      = 0.0; // Scrub off acceleration due to gravity
}

【讨论】:

  • 他的屏幕坐标可能在屏幕顶部为 0,因此 -y 向上。不是真正的问题,只是反直觉。
  • @schmop:实际上,这都是对一些冗长的 cmets 的回应,他指的是从 Y=0 跳转到 Y=3。这意味着他的头脑/讨论的方向与代码中的方向不同。
  • @AndonM.Coleman - 刚刚看到并尝试了......我错了,它真的是 -y.... 无论如何,我尝试了该代码,但出现了同样的问题。我想问题出在其他地方?我应该提供更多代码吗?我真的迷路了。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多