我正在努力完成重力,其中包括通话时间和加速度。
我尝试使用通常的重力,看起来像这样:
velocity += gravity * dt;
position += velocity * dt;
这对于正常的平台游戏来说可能已经足够好了,但是我试图让游戏受到“直升机游戏”的启发,你必须在隧道中导航,而不要碰到墙壁。我希望做的不同之处在于,我希望能够在下降的过程中节省速度,这将在上升的过程中使用,所以我会在开始时加速。
我也想要一些通话时间,所以如果我使用了代码示例中的重力,那么当你触及顶部时它不会像你那样快速地降低你的力量。
这图像说明了我想要的曲线:
请注意,整个控制是由一个键完成的,所以例如如果你按住它就会飞起来空间,如果你松开则潜水。
角色也不会向左或向右移动,因为它在屏幕上会有一个静态X位置,因此不能使用矢量。
我花了好几个小时试图让它工作,但没有成功。我也试过在互联网上搜索,但没有任何运气。
游戏“鲸鱼小道”得到了我想要的引力。
这是一个游戏视频的链接:http://www.youtube.com/watch?v=5OQ0OWcuDJs
我不是那么大的物理人员,所以如果你能举一个实际代码的例子就很酷了我希望任何人都可以帮助我弄清楚这一点。
答案 0 :(得分: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。
P.S。我假设你的Y轴从地面开始射向天空。相应的迹象。
答案 1 :(得分: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);
答案 2 :(得分:0)
这听起来像是基于水平速度的“升力”并且按下按钮触发“鼻子”运动就足够了。
所以lift
将是一个常数k
乘以水平速度Vx
,垂直速度Vy
将是gravity
和{{1}的差异时间变化lift
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
...并且重量是在这种情况下,一个比重力更好的词(不那么混乱,单位明智),但我认为它有效。
不完全是“物理学”,而是一个非常接近的近似值。玩弄k的值,看看你能不能做到你想做的事。
顺便说一下,对于超级糟糕的伪代码:-P