Pygame:使用滚动级别更新Rects

时间:2010-11-01 23:21:59

标签: python scroll 2d pygame

我目前正在PyGame中制作2D侧滚动run'n'jump平台游戏。事实上大多数东西都运行正常 - 我正在利用快速的pyGame Sprite对象&基团。

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

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

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

显然,理想的方法(我认为)是使用具有“真实”坐标的Rects,将所有内容blit到与级别一样大的缓冲区,然后将可见部分blit到屏幕,但实际上会减慢游戏速度很多。

任何意见/见解都将受到赞赏。

由于

5 个答案:

答案 0 :(得分:1)

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

我认为它更简单,更清洁。

答案 1 :(得分:0)

  

我真的不喜欢将相机信息传递给每一个人   在每次更新时反对Rects的对象。

相机可能是全局的,或者是全局Game()类实例的成员。然后你的精灵类的draw方法不需要参数。

你可以自己覆盖绘图,所以它可以:

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

这使子弹的矩形保持在世界坐标中,然后使用屏幕坐标进行blits。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用2个变量level_llevel_d来查看您在关卡中的位置,然后检查哪些精灵位于可见区域中 level_d+heightlevel_l+width
 并在屏幕上绘制它们。

答案 4 :(得分:0)

这样做的简单方法就是:

创建一个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

请记住,如果他们得到负值,他们可能无法正常工作,你也可能必须定义一些限制(你不希望你的相机移动到地图的极限