我是OpenGL和C ++的新手,我正在尝试开发一款小游戏。我想要实现的想法是2D射击游戏,其中玩家面向鼠标指向的方向。我在网上寻求一些帮助和示例,但找不到多少。我从哪里开始,有没有人有一些好的伪代码来使这项工作?谢谢!
答案 0 :(得分:2)
无论您使用什么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游戏中,您的屏幕尺寸将与相机尺寸相同。如果您更改相机尺寸,它看起来就像是相机正在放大/缩小,因此我们会考虑到这一点。
现在让我们假设相机的原点位于屏幕的中心。在这种情况下,你的ortho函数看起来像这样,
// 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;
此公式为[-halfCameraWidth, halfCameraWidth]
中的x和[-halfCameraHeight, halfCameraHeight]
内的y提供相关值,基本上在正交函数的限制范围内。也许如果事件处理可以检测到窗口外的鼠标位置,那么您将获得超出此间隔的值,但这对于此公式来说不是问题。
其次,我们现在需要将此点放在相机的中心周围,
mouseWorld.x = mouseWorld.x + cameraPosition.x;
mouseWorld.y = mouseWorld.y + cameraPosition.y;
现在我们拥有世界地位。
3 - 最后,第三点,我们计算从玩家到此时的向量。
Vector2 playerToMouseDirection = ( mouseWorld - player.position );
playerToMouseDirection.normalize();
就是这样。
如果您的播放器立即旋转,您就完成了。如果你希望你的播放器旋转得更慢,你必须找到一种线性插值矢量(或角度)的方法。祝你好运。