我最近已经进入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中是否有某些内容可以提供帮助?
提前感谢您的回答。
答案 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矢量(长度给出速度)。这样可以轻松表示任意方向和速度。