无论您使用什么 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;
这个公式为我们提供了 [-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();
就是这样。
如果您的播放器立即旋转,您就完成了。如果你想让你的播放器旋转得更慢,你必须找到一种线性插值向量(或角度)的方法。祝你好运。