我目前正在PyGame中制作2D侧滚动run'n'jump平台游戏。事实上大多数东西都运行正常 - 我正在利用快速的pyGame Sprite对象&基团。
我有兴趣知道人们通常如何处理Rects来滚动游戏。我显然有一个比可见区域大得多的等级,玩家,敌人,子弹等每个都有自己的(x,y)坐标,描述它们在关卡中的位置。
但是现在,因为我们使用“spriteGroup.draw(surface)”调用,所以它不会在正确的位置显示它们,除非已经调整了每个对象Rects以便在屏幕上显示正确的部分。换句话说,每次更新玩家/敌人/子弹/其他任何内容时,都需要传递相机信息,以便更新其Rect。
这是最好的使用方法吗?它可以工作,但我不太喜欢在每次更新时将相机信息传递给每个对象以偏移Rects。
显然,理想的方法(我认为)是使用具有“真实”坐标的Rects,将所有内容blit到与级别一样大的缓冲区,然后将可见部分blit到屏幕,但实际上会减慢游戏速度很多。
任何意见/见解都将受到赞赏。
由于
答案 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_l
和level_d
来查看您在关卡中的位置,然后检查哪些精灵位于可见区域中
level_d+height
和level_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
请记住,如果他们得到负值,他们可能无法正常工作,你也可能必须定义一些限制(你不希望你的相机移动到地图的极限