2010-11-01 51 views
2

我目前正在PyGame中制作2D横向滚动run'n'jump平台游戏。大多数的东西工作正常,事实上 - 我利用快速pyGame Sprite对象组。Pygame:使用滚动级别更新Reces

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

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

这是最好的方法使用?它可以工作,但我并不喜欢在每次更新时将相机信息传递给每个对象以抵消Rects。很明显理想的方法(我认为)是使用具有“真实”坐标的Rects,将所有事物都投射到与水平相同的缓冲区,然后将可见部分投射到屏幕上,但在实践中会减慢比赛下来很多。

任何意见/见解将不胜感激。

谢谢

+0

我从不超过地图的极限运动使用Pygame,但我假设你可以使用翻译矩阵将所有内容保存在“真实”坐标中,而无需创建像关卡一样巨大的缓冲区。 – Doggett 2010-11-01 23:41:58

+0

嗯,不是真的,这是重点。 Pygame可以让你一次画出许多精灵,但不会让你转换它们的坐标。 – RedCap 2010-11-02 02:30:56

+0

[添加滚动到平台游戏中的pygame]可能的重复(http://stackoverflow.com/questions/14354171/add-scrolling-to-a-platformer-in-pygame) – sloth 2015-09-11 07:33:16

回答

1

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

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

0

我真的不喜欢通过摄像头信息,以每一个 对象在每一次更新,以抵消Rects。

摄像头可能是全局的,或者是全局Game()类实例的成员。然后你的精灵类的绘制方法不需要参数。

您可以覆盖绘制自己,所以它的作用:

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

这样可以使子弹的RECT在世界坐标,但使用的屏幕坐标位块传输。

0

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

0

可以有2个变量level_llevel_d内见你身在何处的水平,然后检查这些精灵是在可见光区域
level_d+heightlevel_l+width
并绘制在屏幕上。

0

最简单的方法来做到这一点是这样的:

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

blit(surface, (x -CameraX, y -CameraY)) 

是被受任何对象相机应该可以得出这样的,但请记住,有一些你可能要保持uneffected(如健康棒或状态窗口)

只要记住每次要移动相机的对象,这

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

请记住,如果他们得到负值,它们可能无法正常工作,还必须定义可能一些限制(你不想你的相机