【问题标题】:How does pygame.sprite.Group() know which sprite group to call? Also calling the sprite group also calls the class?pygame.sprite.Group() 如何知道要调用哪个精灵组?还调用精灵组也调用类?
【发布时间】:2021-12-29 08:03:29
【问题描述】:

您好,我正在开发 AlienInvasion 游戏,我对 pygame.sprite.Group 有点困惑。它如何知道要调用哪个pygame.sprite.Group()

我习惯于引用这样的类。
self.ship = Ship(self)

但是这个是这样称呼的。它如何知道它正在调用哪个精灵组?我目前只有 1 个精灵组 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

【问题讨论】:

    标签: python oop pygame


    【解决方案1】:

    当你这样做时:

    self.bullets = pygame.sprite.Group()
    

    您正在创建一个新的Group 对象并将其分配给当前对象的属性bullets。该组不知道它是从哪里引用的。当您开始向其中添加精灵时,它将跟踪这些精灵。这是Group 对象的工作,它就像list 或其他容器。 Group 有一些专门的方法,虽然可以让您一次性与多个精灵进行交互(例如 Group.update(),它在它包含的每个精灵上调用 update())。

    您不会在 Bullet 类中显示任何将它们添加到 Group 的代码。这意味着您的子弹实际上不会包含在您已命名为bulletsGroup 中。可能您应该为每个项目符号执行此操作,因为它是创建的。你可能想要这样的东西(为简洁起见,删除了文档字符串):

    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__ 方法接受任意数量的参数,它期望为 Groups。它将新创建的精灵添加到每个组中,这听起来正是您想要的。

    Sprite 类有另一种与Groups 交互的有用方法,您可能希望稍后在代码中使用它:Sprite.kill() 从其所有组中删除精灵,如果精灵已停止,这很方便与您的游戏相关(例如,未命中目标并飞出屏幕的子弹)。

    【讨论】:

    • 啊,@Blckknght 谢谢!我想我明白你的解释了。因为后来我这样做了。 def _fire_bullet(self): """创建一个新子弹并将其添加到子弹组中。""" if len(self.bullets)
    • 啊,是的,如果您有该代码,则无需更改 Bullet.__init__(如果您没有显示 Bullet 代码,我会假设您有类似的东西)。所以这只是一个了解Group 工作原理的问题,我很高兴我的解释对此有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多