2D游戏引擎 - 实现摄像机
我最近在用 Python
制作一个游戏,具体来说是用 PyGame模块
。一切进展得还不错(除了 Python
的速度,哈哈),我也取得了一些成就,但我现在遇到了一点麻烦。可能是个小问题,也可能是个大问题,我还不太确定。问题是:
我该如何在我现在的引擎中实现一个摄像机?
这对你来说可能没什么意义,所以让我解释一下我的 当前引擎
是怎么运作的:我有一个精灵表,用来存放所有的图像。地图是由一个双数组的 Tile
对象组成,填满了显示区域(800 x 640)。地图还包含了所有 Entity
和 Particles
的引用。现在我想创建一个摄像机,这样地图对象就可以比显示区域大。为此,我想出了一个办法,就是需要一个跟随玩家的摄像机(让玩家在屏幕中央)。我之前在游戏中见过这样的实现,也看过一些类似的帖子,但我还想知道我是否需要重构所有游戏代码才能实现这个功能?我第一次尝试是让所有物体在玩家移动时也跟着移动,但我觉得这样做不太好,因为这会影响碰撞检测等问题。
所以,如果有人知道类似问题的好参考资料,或者有什么解决办法,我非常乐意听听……呃,眼睛在这里等着。
谢谢
2 个回答
因为我看不到你的代码,所以我无法判断这个回答对你有多大帮助。
我处理侧滚动、可移动地图等的方式是,把所有的瓦片(地图上的小块)都放到一个pygame.Surface上,这个表面覆盖了整个关卡或地图,或者至少是其中的一大部分。这样的话,我每帧只需要处理一个已经准备好的表面。
在检测碰撞时,我会把涉及到的瓦片的x/y坐标(而不是整个矩形)放在一个单独的列表里。更新的时候主要就是移动这些数字,而不是处理表面了。
如果你觉得有用,随时可以问我更多细节哦 :)
你可能会对这个链接感兴趣。
简单来说,你需要区分每个物体的“实际”坐标和“显示”坐标。
你可以先用游戏中每个实体的实际坐标来完成大部分工作。想象一下,你有一个巨大的屏幕,可以同时显示所有内容,然后正常计算所有东西。如果能把相机也设计成一个实体,那就更好了,这样你就可以像更新其他物体一样更新相机的位置。
一旦所有内容都更新完毕,你就去查看相机对象,确定在窗口中可以看到哪些瓦片、物体、粒子等等,然后把它们的实际世界坐标转换成你需要的像素坐标,以便正确显示。
如果这样做得当,你还可以对相机显示的图像进行缩放或其他修改,而不会影响游戏的玩法。
总之,你需要清楚地区分游戏的玩法和物理逻辑代码,以及渲染/显示代码,这样你的游戏可以自由运行,而你可以以任何方式渲染它,两者之间的交叉尽量少。
好消息是,你可能不需要改变游戏本身的工作方式。坏消息是,你可能需要重新编写渲染/绘图代码,以便所有内容都是相对于相机绘制的,而不是相对于世界。