具有 OpenGL 和 C++ 的 2D 平台游戏相机
Posted
技术标签:
【中文标题】具有 OpenGL 和 C++ 的 2D 平台游戏相机【英文标题】:2D platform game camera with OpenGl and C++ 【发布时间】:2012-07-02 21:52:02 【问题描述】:我正在尝试使用 OpenGl 和 C++ 过剩来制作 2D 平台游戏。您可以使用左右箭头键移动您的播放器并使用空间跳跃。我通过文本文件将所有平台加载到游戏中并打印到屏幕上。这一切都很好。我遇到的问题是相机。当按下右箭头键时,我让玩家 x 位置增加。问题是,当这种情况发生时,我也无法让实际的相机移动。这让我觉得我应该使用 glTranslatef 将所有平台平移到左侧,而不是移动播放器。这对我来说似乎有点奇怪,我只是想知道这是否应该这样做。所以我想最后一个问题是,我应该翻译整个场景还是移动玩家?
【问题讨论】:
【参考方案1】:移动相机以glTranslate
ing 与玩家相反的方向跟随玩家。
您应该将相机视为类似于玩家和其他可移动物品的游戏对象,而将关卡视为具有固定位置的静态对象。这使得放置游戏内物品和其他东西变得更加容易。
【讨论】:
【参考方案2】:实际上,当您在 OpenGL 中“移动相机”时,由于实际上没有相机,内部所做的就是将场景中的所有内容都向相反方向移动。
至于解决方法,如果你用的是glut,你可以用
gluLookAt(x, y, z,
ex, ey, ez,
0, 1, 0)
其中 (x, y, z) 是您希望相机所在的坐标,(ex, ey, ez) 是您希望相机查看的方向向量(参考 (x, y, z) 坐标) 和 (0, 1, 0) 是向上向量。此函数执行所有必要的矩阵变换。更多信息here
如果您不使用 glut,而仅使用原始 OpenGL,则相同的链接还解释了您必须使用的等效 opengl 调用来实现与 gluLookAt 完全相同的效果
所以当你想移动相机时(可能只是左右移动,因为它是一个平台游戏)你只需要改变 x 值
【讨论】:
所以如果我想让相机直视前方,我会选择 gluLookAt(0,0,0,0,0,1,0,1,0)? 完全正确(假设在您的情况下“直线前进”是指 Z 轴方向),但请注意查看视锥体限制。如果您不知道,它基本上意味着无法绘制紧靠在相机前面的对象(即坐标 (0, 0, 0.1))。因此,将相机向后移动几个单位通常是更好的选择,例如:gluLookAt(0, 0, -5, 0, 0, 1, 0, 1, 0)(调整 -5通过实验),然后您就可以在原点开始绘制,这简化了您的工作 无法绘制直接在摄像机前面的对象(即坐标 (0, 0, 0.1)) 虽然透视投影是正确的,但事实并非如此用于正交投影。使用取决于参数的正交矩阵,您可以看到与眼睛平行甚至在眼睛后面的东西。 +1 其他正确答案。 是的,忘记了正射投影(没有真正使用过它们)。谢谢指正【参考方案3】:我使用以下方法完成了这项工作..
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 在这种情况下是屏幕宽度。
【讨论】:
以上是关于具有 OpenGL 和 C++ 的 2D 平台游戏相机的主要内容,如果未能解决你的问题,请参考以下文章
简单的 C++,Linux 的 opengl 游戏引擎? [关闭]
在创建 2D OpenGL-ES 2.0 游戏的基本、简单的方法中寻求帮助