Pygame:更新滚动关卡的矩形
我现在正在用PyGame制作一个2D横版跑跳平台游戏。大部分功能都运行得不错,实际上效果很好——我利用了快速的PyGame精灵对象和组。
我想知道的是,大家通常是怎么处理滚动游戏中的矩形(Rects)的。显然,我的关卡比可见区域要大得多,玩家、敌人、子弹等每个对象都有自己的(x,y)坐标,描述它们在关卡中的位置。
但是,现在因为我们使用“spriteGroup.draw(surface)”这个调用,它不会在正确的位置显示这些对象,除非每个对象的矩形都经过调整,以便正确的部分显示在屏幕上。换句话说,每次更新玩家、敌人、子弹或其他任何东西时,都需要传递相机的信息,以便更新它们的矩形。
这真的是最好的方法吗?虽然这样有效,但我不太喜欢在每次更新时都把相机信息传递给每个对象来调整矩形。
显然,我认为理想的方法是使用带有“真实”坐标的矩形,把所有东西绘制到一个和关卡一样大的缓冲区,然后只把可见的部分绘制到屏幕上,但实际上这样会让游戏变得非常慢。
任何评论或见解都非常感谢。
谢谢
5 个回答
我找到了一种方法,就是记录一个scrollx和一个scrolly。然后,在你移动矩形的时候,只需要把scrollx和scrolly加到坐标上就可以了。
我不太喜欢在每次更新的时候,把相机的信息传递给每一个对象来调整矩形的位置。
相机可以是全局的,或者是一个全局游戏类(Game())的成员。这样,你的精灵类(sprite class)的绘制方法就不需要额外的参数了。
你可以自己重写绘制方法,让它这样做:
dest = game.camera.topleft + self.rect.topleft
screen.blit( self.surface, dest )
这样可以保持子弹的矩形在世界坐标系中,同时使用屏幕坐标系进行绘制。
你可以扩展 Sprite.Group 这个类,让它能够接收到相机的信息。然后你可以选择以下两种方法之一:
A. 重写更新方法,这样就能更新每个精灵在屏幕上的坐标。
B. 重写绘制方法,这样不仅能更新每个精灵在屏幕上的坐标,还能调用它的父类的绘制方法。
我觉得选 A 更简单,也更干净。