我最近开始接触OpenGL/SDL,并在2D/3D空间中摆弄对象,我相信这一领域的大多数新手都会有一些疑问,关于做某事的“最佳”方法。我引用最好的,因为我假设没有最好的方法,这是个人喜好。
所以,我有一个实体,一个简单的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,因此对角线移动。
有没有更好的方法?我是不是遗漏了一些非常简单的东西?
我使用的是SDL1.2、OpenGL、C++。不确定SDL/OpenGL中是否有什么可以提供帮助的东西?
提前感谢你的回答。
发布于 2010-11-06 22:05:37
这个问题真的很普遍,因为它取决于您希望如何对您的世界中对象的运动进行建模。
通常每个物体都有它的速度,它是基于加速度计算的,并被限制到最大值。这意味着按键改变指定帧的对象加速度,然后计算该加速度并将其应用于对象的当前速度。
这是通过一个更新阶段完成的,该阶段遍历所有对象,并根据对象加速度计算速度变化。通过这种方式,您不必费心修改速度本身,而是让您的引擎根据每个对象的状态进行计算。
发布于 2010-11-06 22:19:40
加速度是在一段时间内应用的,因此在@jack的示例中,您将在一秒的时间内应用10m/s^2的加速度。
您还应该修改您的应用程序,使其成为time based,而不是基于框架。
看一下这篇basic game physics介绍,我也会真正了解一下GameDev.net Physics Tutorials
发布于 2010-11-06 22:09:49
我假设你想要移动的方式是,你想让玩家只在按住一个键的时候才移动。简而言之:您的解决方案很好。
一些需要考虑的潜在陷阱:如果同时按下左和右,会发生什么?
https://stackoverflow.com/questions/4113370
复制相似问题