你好,我正在开发AlienInvasion游戏,我对pygame.sprite.Group
有点困惑。它如何知道该调用哪个pygame.sprite.Group()
?
我习惯于引用这样的类self.ship = Ship(self)
但这个人这样称呼它。它怎么知道自己在调用哪个精灵组?我目前只有一个精灵组ATM,所以这是有道理的,但如果我有更多呢self.bullets = pygame.sprite.Group()
然后稍后我可以从中引用这样的方法self.bullets.update()
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
self.ship = Ship(self)
self.bullets = pygame.sprite.Group()
def _update_bullets(self):
"""update position of bullets and get rid of old bullets"""
# update bullet positions
self.bullets.update()
class Bullet(Sprite):
"""A class to manage bullets fired from the ship"""
def __init__(self, ai_game):
"""Create a bullet object at the ship's current position."""
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
self.color=self.settings.bullet_color
当你这样做时:
self.bullets = pygame.sprite.Group()
您正在创建一个新的Group
对象,并将其指定给当前对象上的属性bullets
。该组不知道它是从哪里引用的。当你开始向它添加精灵时,它会跟踪这些精灵。这是Group
对象的工作,它就像list
或其他容器。Group
有一些专门的方法,可以让你一次与多个精灵交互(比如Group.update()
,它在它包含的每个精灵上调用update()
(。
在Bullet
类中不显示任何将它们添加到Group
中的代码。这意味着您的项目符号实际上还不会包含在您命名为bullets
的Group
中。也许您应该对每个项目符号都这样做,因为它是创建的。您可能想要这样的东西(为了简洁起见,删除了文档字符串(:
class Bullet(Sprite):
def __init__(self, ai_game):
super().__init__(ai_game.bullets) # pass the group here!
... # do the rest of your initialization
Sprite.__init__
方法接受任意数量的参数,预计为Group
s。它将新创建的sprite添加到每个组中,这听起来正是您想要的。
Sprite
类还有另一种与Group
交互的有用方法,您可能希望稍后在代码中使用它:Sprite.kill()
将精灵从其所有组中删除,如果精灵不再与您的游戏相关(例如,一颗子弹没有击中目标并飞离屏幕(,这很方便。