我正在自学C ++并玩2D平铺贴图。
我一直在阅读此scrolling
帖子 here ,该帖子基于此 tiling tutorial 。
使用上面的教程和Pearson, Computer Graphics with OpenGL
书中的一些帮助,我编写了一个小程序,用于绘制40x40
平铺世界和Sprite
(也是图块)。
就绘制/渲染顺序而言,地图(或世界)本身就是背层,而Sprite是最前面(或顶部)层。我假设这是一个很好的方式,因为2个瓷砖比瓷砖和自定义精灵或矩形更容易交互。这是对的吗?
我已经实施了Keyhandling()
功能,可让您使用map
移动viewport
内的keyboards arrow keys
。我有一个名为offsetx, offsety
的变量,当按下一个键时会增加或减少。根据我是将变量分配给map
还是sprite
,我可以在屏幕上的任何方向上进行更多操作。
两者似乎都不能很好地工作,所以我将变量分配给(map和sprite),但是sprite为正值,而map为负值。因此,按下按键时,这允许我的精灵在一个方向上移动,同时地图以相反的方向移动。
我的问题是,精灵很快移动到离开窗口并且不足以将更多的地图带入场景。 (窗口一次只显示约1/8th
个图块。)
我一直在思考,我认为解决此问题的一种有效/有效的方法是将sprite
修复到屏幕的中心,当按下某个键时{{1}移动...我不确定如何实现这一点。
这会是一个好方法吗?或者它是否也会移动视口或相机?
答案 0 :(得分:1)
你不想在角色移动时相对于Sprite移动所有内容。考虑一个更复杂的世界,你在地图上还有其他东西,例如其他精灵。最简单的方法是保持地图固定,并相对于地图移动每个精灵(如果它是一个可移动的精灵)。只要你的角色在世界各地移动,移动世界上的一切都没有多大意义。
如果你想要将你的角色永远放在中心来渲染你的世界,那就完全没问题了。最好的办法是移动相机。这样您还可以轻松地放大/缩小相机,旋转相机等,轻松跟踪世界上所有物体。
小心使用“viewport”一词。这意味着OpenGL中的一个非常具体的东西。 (即,查看函数glViewport
)。如果你的书以不同的方式使用它,那很好。我只是指出这一点,因为我并不是100%清楚你的意思。