Python Pygame:使用滚动级别更新矩形

Python Pygame:使用滚动级别更新矩形,python,scroll,2d,pygame,Python,Scroll,2d,Pygame,我目前正在PyGame中制作一个2D侧滚run'n'jump平台游戏。大部分的东西都工作正常,事实上非常好-我正在利用快速pyGame精灵对象和组 我想知道的是人们通常如何处理滚动游戏中的矩形。我显然有一个比可见区域大得多的关卡,玩家、敌人、子弹等都有自己的(x,y)坐标,用来描述他们在关卡中的位置 但是现在,由于我们使用了“spriteGroup.draw(surface)”调用,它将不会在正确的位置显示它们,除非每个对象的矩形都已调整,以便在屏幕上显示正确的部分。换句话说,每当玩家/敌人/子

我目前正在PyGame中制作一个2D侧滚run'n'jump平台游戏。大部分的东西都工作正常,事实上非常好-我正在利用快速pyGame精灵对象和组

我想知道的是人们通常如何处理滚动游戏中的矩形。我显然有一个比可见区域大得多的关卡,玩家、敌人、子弹等都有自己的(x,y)坐标,用来描述他们在关卡中的位置

但是现在,由于我们使用了“spriteGroup.draw(surface)”调用,它将不会在正确的位置显示它们,除非每个对象的矩形都已调整,以便在屏幕上显示正确的部分。换句话说,每当玩家/敌人/子弹/其他任何东西更新时,都需要传递相机信息,以便更新其Rect

这是最好的方法吗?它可以工作,但我不喜欢在每次更新时将相机信息传递给每个对象以偏移矩形

很明显,理想的方法(我认为)是使用带有“真实”坐标的矩形,将所有的东西放到一个和关卡一样大的缓冲区,然后将可见部分放到屏幕上,但实际上这会大大降低游戏的速度

如有任何意见/见解,将不胜感激


谢谢

您可以扩展de Sprite.Group,以便它接收相机信息。 然后执行以下选项之一: A.覆盖更新方法,使其更新每个精灵的屏幕坐标。 B.重写draw方法,使其更新每个精灵的屏幕坐标,然后调用其父draw方法

我认为A更容易、更干净

我真的不喜欢把相机的信息传给每一个人 对象以偏移矩形

摄影机可以是全局的,也可以是全局Game()类实例的成员。那么您的sprite类的draw方法就不需要参数了

您可以覆盖自己绘制,因此它可以:

dest = game.camera.topleft + self.rect.topleft
screen.blit( self.surface, dest )

这使项目符号的矩形保持在世界坐标中,而BLIT使用屏幕坐标。

我发现的一种方法是跟踪scrollx和scrolly。然后,在移动矩形时,只需将scrollx和ScrollY添加到坐标。

您可以有两个变量
level\u l
level\u d
,它们可以看到您在该层中的位置,然后检查哪些精灵在可见区域
标高+高度
标高+宽度


然后在屏幕上绘制它们。

简单的方法如下:

创建CameraX和CameraY变量,并在屏幕上blit对象时使用:

blit(surface, (x -CameraX, y -CameraY))
任何受摄影机影响的对象都应该这样绘制,但请记住,有些对象可能希望保持不受影响(如健康栏或状态窗口)

只要记住每次你想移动相机的时候都要这样做

#Move Camera Right
CameraX += 10
#Move Camera Left
CameraX -= 10
#Move Camera Down
CameraY += 10
#Move Camera Up
CameraY -= 10

请记住,如果它们得到负值,它们可能无法正常工作,您可能还必须定义一些限制(您不希望您的相机超出地图的限制

我从未使用过Pygame,但我假设您可以使用平移矩阵将所有内容保持为“真实”坐标,而不必创建与关卡一样大的缓冲区。其实不是这样。Pygame允许您一次绘制多个精灵,但不允许您转换它们的坐标。可能的重复