9



我正在尝试完成重力,其中包括通话时间以及加速度。
我尝试过使用通常的重力,它看起来像这样:

velocity += gravity * dt;
position += velocity * dt;


对于普通的平台游戏来说,这可能已经足够了,但我正在尝试制作一款受“直升机游戏”启发的游戏,你必须在不接触墙壁的情况下穿过隧道。

我想做的不同的是,我希望能够在下降的过程中保存上升速度,这将在再次上升的路上使用,所以我会在开始时有一些加速。
我还想要一些通话时间,所以当你到达顶部时,如果我使用代码示例中的重力,它不会像它那样快速地迫使你下来。

这张图说明了我想要的曲线:
链接到曲线

请注意,整个控制是通过一个键完成的,所以例如,如果你按住空格,你会飞起来,如果你松开它,你会潜水。
角色也永远不会向左或向右移动,因为它在屏幕上的 X 位置是静态的,所以不能使用向量。

我花了几个小时试图让它工作,但没有成功。我也尝试在互联网上搜索,但没有任何运气。

游戏“鲸鱼足迹”得到了我想要的重力。
这是游戏视频的链接:http

://www.youtube.com/watch?v= 5OQ0OWcuDJs实际代码
我希望任何人都可以帮助我解决这个问题。

4

3 回答 3

4

重力是把物体往下拉的力。你的玩家是把物体拉起来的力量。因此,您的代码必须是:

if(keyPressed) {
  velocity += POWER_OF_PLAYER;
}

velocity += G;
position += velocity;

这足以创建一条曲线,如您所示。当然POWER_OF_PLAYER必须是不同的符号,并且绝对值必须更大才能使这项工作。

G = -9.81
POWER_OF_PLAYER = 20

省电是一个简单的检查。

if(keyPressed) {
  if(powerSaved > 0) {
    velocity += POWER_OF_PLAYER;
    powerSaved -= SOMETHING;
  }
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) {
  powerSaved += SOMETHING;
}

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER应该小于或等于 0。

PS我假设你的Y轴从地面开始并射向天空。相应地放置了标志。

于 2011-11-25T00:36:04.313 回答
0

看起来鱼的速度是恒定的。

尝试以下操作:

velocity是固定的,不应该改变(除非鱼吃加速加电)。 angle = 0相当于平飞。

angle -= gravity * dt;
if (angle < - Math.PI / 2) {
  angle = Math.PI / 2;
}
if (keyPressed) { 
  angle += power * dt;
}

if (angle < - Math.PI / 2) {
  // Stop the player from doing a looping
  angle = - Math.PI / 2;
}
if (angle > Math.PI / 2) {
  // Stop the player from doing an inverted looping
  angle = Math.PI / 2;
}
// Move the fish (vertical component of velocity)
position += velocity * dt * Math.sin(angle);
// Move the background (horizontal component of velocity)
background_position -= velocity * dt * Math.sin(angle);
于 2011-11-25T13:58:49.327 回答
0

听起来像结合基于水平速度的“提升”并让按钮按下触发“鼻子上扬”运动会很好地工作。

所以lift将是一些常数k乘以水平速度Vx,垂直速度Vy将是时间变化的差gravitylift乘以时间dt

lift = k * Vx
Vy += ( lift - gravity ) * dt

def noseup
  k = 0.01 #some small chunk
  dx = k * Vx
  dy = k * Vy
  Vx -= dy
  Vy += dx

当飞机(或其他)机头向上时,它基本上会降低一个轴上的速度,同时增加另一个轴上的速度。

现在我考虑一下,把它扔到某个地方可能不是一个坏主意,drag它必须取决于绝对速度V = ( Vx**2 + Vy**2 )**0.5......在这种情况下,重量是比重力更好的词(不那么混乱,单位明智的)但我猜它有效。

不完全是“物理学”,而是一个应该可以很好地工作的近似值。玩弄 k 的值,看看你是否可以让它做你想做的事。

顺便说一句,对于超级蹩脚的伪代码感到抱歉:-P

于 2011-11-26T04:58:04.307 回答