具有OpenGl和C++的2D平台游戏摄像机

2D platform game camera with OpenGl and C++

本文关键字:平台 游戏 摄像机 2D OpenGl C++ 具有      更新时间:2023-10-16

我正在尝试使用OpenGl和C++过剩来制作2D平台游戏。您可以使用左右箭头键移动玩家,并随着空间跳跃。我通过文本文件将所有平台加载到游戏中并打印到屏幕上。这一切都很好用。我遇到的问题是相机。当按下右箭头键时,我有玩家x位置增加。问题是,当这种情况发生时,我无法让实际的相机也移动。这让我觉得与其移动播放器,不如使用 glTranslatef 将所有平台向左平移。这对我来说似乎有点奇怪,我只是想知道这是否应该这样做。所以我想最后一个问题是,我应该翻译整个场景还是移动玩家?

移动摄像机以跟随玩家,方法是向与玩家相反的方向glTranslate

您应该将摄像机视为类似于玩家和其他可移动物品的游戏内对象,将关卡视为具有固定位置的静态对象。这使得放置游戏内物品和其他东西变得更加容易。

实际上当你在OpenGL中"移动相机"时,因为实际上没有相机,内部所做的就是这样,将场景中的所有东西都向相反的方向移动。

至于解决方案,如果您使用过剩,您可以使用

gluLookAt(x,  y,  z,
          ex, ey, ez,
          0,  1,  0)
其中 (x, y, z) 是您希望摄像机所在的坐标,(

ex, ey, ez) 是您希望摄像机查看的方向矢量(参考 (x, y, z) 坐标),(0, 1, 0) 是向上矢量。此函数执行所有必要的矩阵转换。更多信息在这里

如果您不使用 glut,而只使用原始 OpenGL,则同一链接还解释了您必须使用的等效 opengl 调用,以实现与 gluLookAt 完全相同的效果

因此,当您想移动相机时(可能只能左右移动,因为它是一个平台游戏),您只需更改 x 值

我使用以下方法得到了这个工作。

gl.PushMatrix()
gl.Translatef((1280/2)-float32((player.Body.Position().X)), 0, 0.0)
//Rest of drawing Code Code
gl.PopMatrix()

这是使用OpenGL + Chipmunk Physics(在GoLang中,但应该适用,因为这些只是c绑定)。 在这种情况下,1280 是屏幕宽度。