2011-11-24 106 views
9



重力与通话时间,加速度和速度获得

我试图完成重力,其中包括通话时间,也加速。
我一直在使用通常的重力尝试,它看起来是这样的:

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


这可能会工作的正常成熟的游戏不够好,但我试图让以“直升机游戏的启发游戏“,你必须穿过隧道,而不必接触墙壁。

我想要做的不同,就是我希望能够在下降的过程中保存速度,这将在再次使用时加以利用,所以我会在开始时加速。
我也想要某种类型的广播时间,所以当你点击顶部时,它不会像你使用代码示例中的重力一样快速地强制你。

这张图片举例说明了我想要的曲线:
Link to curve

请注意,整个控制是通过一个按键完成的,例如,如果您按住空间,则会飞起来,如果您释放它,则会跳水。
这个角色也不会左右移动,因为它在屏幕上会有一个静态的X位置,所以无法使用矢量。

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

游戏“鲸鱼之旅”得到了我想要的引力。
这里是一个游戏视频的链接:http://www.youtube.com/watch?v=5OQ0OWcuDJs

我不是那么大的一个物理学家,所以它会很酷,如果你可以给一个实际的代码
的例子,我希望任何人都可以帮我把这个出。

+0

不是一个坏的问题,但显示出一些代码,说明你已经尝试了什么对不起BTW - 和*说明如何*这是行不通的 - 会帮助你获得答案。 :) –

+0

我不是一个物理学家,但我的猜测是,你需要深入一点物理学才能达到你想要的。所以我认为飞机的物理学应该进入大方向。也许[this](http://www.ucmp.berkeley.edu/vertebrates/flight/physics.html)可以帮助你至少找到正确的词来寻找解决问题的方法。同样在最新的蝙蝠侠 - 阿甘市游戏中,你也有类似的机制,或许值得一试。 – dowhilefor

+0

@djacobson它大部分只是随机代码,因为我不知道该去哪里,所以它没有任何好处:) – Basic

回答

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轴从地面开始射向天空。相应的标志。

+0

我很确定我已经尝试了这一点,但我会给它与您的代码去看看它是否有效:) – Basic

+0

这是标准公式,游戏的物理是不同的。 –

+0

你的数学错了。重力是一种力量,即它具有单位质量*加速度,而速度随时间变化的距离单位,所以设置'velocity + = GRAVITY'基本上是不正确的。 – rcollyer

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); 
+0

当使用你的代码时,玩家只需走直线,除非按下键时,它会略微下降。 – Basic

+0

尝试使角度变化更小 - 'angle - = gravity * dt/100.0;''和angle + = power * dt/100.0;'' –

0

这听起来像是结合了基于水平速度,并有按键按下触发一个“noseup”运动将工作足够好“电梯”。

所以lift将是一些恒定k乘以水平速度Vx和垂直速度Vygravitylift倍的变化的差在时间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