我是OpenGL和C++的新手,我正在尝试开发一个小游戏。我试图实现的想法是一个2D射击游戏,玩家面对鼠标指向的方向。我在网上寻找了一些帮助和例子,但找不到太多。我从哪里开始,有没有人有一些好的伪代码来使这项工作?谢谢!
无论您使用什么 API 来创建窗口/GL 上下文,都允许您处理事件,即鼠标运动事件,以便您可以跟踪鼠标在屏幕坐标上的位置。然后,您可能会使用正交投影,并且您的摄像机可能不是静态的,而是随着播放器一起移动。
考虑到这些变量,这里列出了您需要的内容。
-
首先,您需要获取鼠标屏幕坐标。
-
将它们转换为世界坐标。
-
计算从玩家到这一点的向量。
1 - 对于第一点,例如,我将使用 SDL,因为这是我在自己的项目中通常使用的。否则,我将尝试使代码尽可能通用。
...
while ( SDL_PollEvent( &event ) ) {
if ( event.type == SDL_MOUSEMOTION ) {
mouseScreen.x = event.motion.x;
mouseScreen.y = event.motion.y;
}
}
...
2 - 对于第二点,让我们了解一些背景和假设。通常设置相机会像这样,
viewport( 0, screenWidth, 0, screenHeight );
...
ortho( projection, cameraLeft, cameraRight, cameraBottom, cameraTop )
translate( view, -cameraPosition )
//cameraWidth = cameraRight - cameraLeft;
在大多数 2D 游戏中,您的屏幕尺寸将与相机尺寸相同。如果您更改相机尺寸,则相机看起来就像在放大/缩小,因此我们会将其考虑在内。
现在让我们假设相机的原点位于屏幕的中心。在这种情况下,您的正交函数如下所示,
// halfCamWidth = cameraWidth/2;
// halfCamHeight = cameraHeight/2;
ortho( projection, -halfCamWidth, halfCamWidth, -halfCamHeight, halfCamHeight );
它可能是左下角。但这完全取决于您决定如何制作游戏。使用左下角,您可以通过执行以下操作将相机居中放在一个点 (x,y) 上,
cameraPosition.x = x - cameraWidth/2;
cameraPosition.y = y - cameraHeight/2;
而如果你使用中心作为原点,你会这样做
cameraPosition.x = x;
cameraPosition.y = y;
这使我们的计算稍微容易一些。因此,如果您使用不同的引用,我将留给您。
回到转换,我们现在可以通过两步从屏幕坐标转换为世界坐标。首先,我们需要在相机投影中调整鼠标位置。(请注意整数运算,因为您可能必须将维度转换为浮点数)
mouseWorld.x = cameraLeft + ( mouseScreen.x / screenWidth ) * cameraWidth;
mouseWorld.y = cameraBottom + ( mouseScreen.y / screenHeight ) * cameraHeight;
这个公式得到x在[-halfCameraWidth, halfCameraWidth]
以内和y在[-halfCameraHeight, halfCameraHeight]
内的相关值,基本上在正交函数的极限之内。也许如果事件处理可以检测到窗口外的鼠标位置,您会得到此间隔之外的值,但这对于此公式来说不是问题。
其次,我们现在需要将这个点放在相机的中心周围,
mouseWorld.x = mouseWorld.x + cameraPosition.x;
mouseWorld.y = mouseWorld.y + cameraPosition.y;
现在我们有了世界地位。
3 - 最后,第三点,我们计算从玩家到这一点的向量。
Vector2 playerToMouseDirection = ( mouseWorld - player.position );
playerToMouseDirection.normalize();
仅此而已。
如果您的播放器立即旋转,您就完成了。如果你想让你的玩家旋转得更慢,你必须找到一种方法来线性插值矢量(或角度)。祝你好运。