所以我一直在使用Python
制作游戏,特别是PyGame module
。一切都进展得很顺利(除了Python
的速度,我是对的:P),我从这里得到了很多成就,但我刚刚遇到了...... 。 减速带。也许是一座山。我还不确定。问题是:
如何使用我当前的引擎实现相机?
这对你来说可能没什么意义,所以让我解释一下我current engine
正在做什么:我有一张spritesheet我用于所有图像。地图由一组Tile
个对象组成,这些对象填满了显示屏(800 x 640)。该地图还包含对所有Entity
和Particles
的引用。所以现在我想创建一个摄像头,这样地图对象可以比显示器更大。要做到这一点,我已经设计出我需要某种跟随播放器的摄像机(播放器位于屏幕中央)。我之前已经在游戏中看到了这个,甚至还读过其他一些类似的帖子,但我还需要知道 我是否需要对所有游戏代码进行重组以实现此目的? 我的第一次尝试是在玩家移动时让所有对象在屏幕上移动,但我觉得有更好的方法可以做到这一点,因为这会搞砸碰撞检测等等。
所以,如果有人知道对这样的问题的任何好的引用,或者解决它的方法,那么我的所有耳朵......呃......眼睛。
由于
答案 0 :(得分:3)
您可能会感兴趣this link。
从本质上讲,您需要做的是区分“实际”坐标和每个对象的“显示”坐标。
你要做的是使用游戏中每个实体的实际坐标来完成大部分工作。如果它有所帮助,想象一下你有一个巨大的屏幕,可以一次显示所有内容,并正常计算一切。如果您还将相机设计为实体,这可能会有所帮助,这样您就可以像对待任何其他物体一样更新相机的位置。
更新所有内容后,您将转到相机对象,并确定窗口中可见的图块,对象,粒子等,并将其实际的世界坐标转换为正确显示它们所需的像素坐标。
如果操作正确,您还可以执行缩放等操作,也可以修改相机显示的图像,而不会影响游戏性。
从本质上讲,你希望在游戏玩法和物理逻辑/代码以及渲染/显示代码之间有一个非常明确的区别,这样你的游戏就可以做任何你想做的事情,你可以随心所欲地渲染它,只需要很少的交叉两者之间。
所以好消息是,你可能不需要改变游戏本身的运作方式。坏消息是,您可能必须进入并重写您的渲染/绘图代码,以便相对于相机绘制所有内容,而不是全世界。
答案 1 :(得分:0)
由于我无法查看您的代码,因此我无法评估此答案对您的有用程度。
我对侧卷轴,可移动地图等的方法是将所有瓷砖blit到pygame.Surface上,跨越整个关卡/地图等的尺寸或者至少是它的一大块。这样我每帧只需要一个表面就已经准备好了。
对于碰撞检测,我将单独列表中涉及的切片的x / y值(而不是整个矩形)保持不变。然后更新主要是围绕数字而不是表面移动。
如果您认为有用,请随时询问更多详细信息:)