二维运动理论

时间:2010-11-06 13:58:19

标签: c++ opengl theory sdl

我最近已经进入OpenGL / SDL并在2D / 3D Space中玩弄对象,因为我确信这个领域的大多数新手都会做一些关于“最佳”做事方式的询问。我引用最好的,因为我假设没有最好的方式,这是个人偏好。

所以,我有一个实体,一个简单的GL_QUAD,我想要移动。我有键盘事件设置,我可以获得按键/释放事件,而不是问题。

我有一个实体类,这是我的GL_QUAD,伪实现....

class Entity
{
    void SetVelocity(float x, float y);
}

然后我有这个事件处理程序代码......

if theEvent.Key = UPARROW AND theEvent.State = PRESSED
    Entity.SetVelocity(0.0f, -1.0f);
else if theEvent.Key = UPARROW AND theEvent.State = RELEASED
    Entity.SetVelocity(0.0f, 0.0f);

我的问题是,这是移动我的实体的最佳方式吗?这让我认为通过分别调整X / Y速度的方法,我们可以使它变得更复杂一些。如果我开始向左移动,SetVelocity会忘记X速度吗?所以我永远不会对角旅行。

例如......

class Entity
{
    void SetXVelocity(float x);
    void SetYVelocity(float y);
}

if theEvent.Key = UPARROW AND theEvent.State = PRESSED
    Entity.SetYVelocity(-1.0f);
else if theEvent.Key = UPARROW AND theEvent.State = RELEASED
    Entity.SetYVelocity(0.0f);
if theEvent.Key = LEFTARROW AND theEvent.State = PRESSED
    Entity.SetXVelocity(-1.0f);
else if theEvent.Key = LEFTARROW AND theEvent.State = RELEASED
    Entity.SetXVelocity(0.0f);

这样,如果我有一个XVelocity,然后我按下UPARROW,我仍然会有我的XVelocity,以及一个新的YVelocity,因此对角移动。

有更好的方法吗?我在这里错过了一些非常简单的东西吗?

我正在使用SDL 1.2,OpenGL,C ++。不确定SDL / OpenGL中是否有某些内容可以提供帮助?

提前感谢您的回答。

4 个答案:

答案 0 :(得分:3)

这个问题非常普遍,因为它取决于你想要如何模拟你世界中物体的运动。

通常每个物体的速度都是根据加速度计算的,并且最大限度上限。这意味着按键会改变指定帧的对象加速度,然后计算并应用于对象的当前速度。

这是通过 update 阶段完成的,该阶段遍历所有对象并根据对象加速度计算速度变化。这样你就不用费心去修改速度本身了,但是让你的引擎根据每个对象的状态进行计算..

答案 1 :(得分:2)

在一段时间内应用加速度,因此在@jack的示例中,您将在一秒的时间段内应用加速度10m / s ^ 2。

您还应该修改您的应用程序,使其成为time based,而不是基于框架。

看一下这个basic game physics介绍,我也真的看看GameDev.net Physics Tutorials

答案 2 :(得分:0)

我假设您希望移动工作的方式是您希望玩家仅在持有钥匙时移动。 简而言之:您的解决方案很好。

一些潜在的问题需要考虑:如果左右按下会发生什么?

答案 3 :(得分:0)

嗯,你在这里描述的是一个简单的finite state machine。您可以使用不同的方向移动(根本不移动)作为状态,将键事件作为转换。这通常可以使用state pattern很好地实现,但这在C ++(许多样板代码)中通常非常痛苦,并且可能超出您的场景的顶部。

当然,还有其他方式来表示您实体的速度和方向,例如:作为2D矢量(长度给出速度)。这样可以轻松表示任意方向和速度。