【问题标题】:How to use sprite groups in pygame如何在pygame中使用精灵组
【发布时间】:2012-12-13 00:24:50
【问题描述】:

所以我在我的程序中已经到了需要为一些玩家可以碰撞而不会死亡的精灵创建一个组(就像我在屏幕上可能有的其他精灵一样)。

我搜索了 Google,但似乎官方的 pygame 文档没有用和/或难以理解。我正在寻求任何对此有所了解的人的帮助。

首先,我需要了解如何创建群组。它会进入初始游戏设置吗?

然后在创建组时将精灵添加到组。 pygame 网站在这个问题上是这样说的:

Sprite.add(*groups)

那么...如何使用它?假设我有一个名为 gem 的精灵。我需要将 gem 添加到 gems 组。是吗:

gem = Sprite.add(gems)

我对此表示怀疑,但是在网站上没有任何示例可以关闭,我不知所措。

此外,我希望能够编辑某个组的属性。这是通过像我一样定义一个班级来完成的吗?或者它是我在现有精灵的定义中定义的,但带有“if sprite in group”?

【问题讨论】:

  • 如果您可以用描述您的问题的内容替换问题的标题,那就太好了。

标签: python pygame sprite


【解决方案1】:

回答您的第一个问题;要创建一个组,您可以执行以下操作:

gems = pygame.sprite.Group()

然后添加一个精灵:

gems.add(gem)

关于您要编辑的组的属性取决于它们是什么。例如,您可以定义这样的内容来指示组的方向:

gems.direction = 'up'

【讨论】:

  • 嗯。短而甜。也合乎逻辑,现在我知道如何使用它了。谢谢!
  • 没问题。您可能会发现这篇文章很有用 - devshed.com/c/a/Python/…
  • 这个答案对我帮助很大。谢谢!
【解决方案2】:

我知道这个问题已经得到解答,但最好的方法就像 kelwinfc 建议的那样。我会详细说明,以便更容易理解。

# First, create you group
gems = pygame.sprite.Group()

class Jewel (pygame.sprite.Sprite): # Inherit from the Sprite
    def __init__ (self, *args): # Call the constructor with whatever arguments...
        # This next part is key. You call the super constructor, and pass in the 
        # group you've created and it is automatically added to the group every 
        # time you create an instance of this class
        pygame.sprite.Sprite.__init__(self, gems) 

        # rest of class stuff after this.

>>> ruby = Jewel()  
>>> diamond = Jewel()  
>>> coal = Jewel()

# All three are now in the group gems. 
>>> gems.sprites()
[<Jewel sprite(in 1 groups)>, <Jewel sprite(in 1 groups)>, <Jewel sprite(in 1 groups)>]

您还可以使用gems.add(some_sprite) 添加更多内容,同样使用gems.remove(some_sprite) 删除它们。

【讨论】:

  • 我经历了所有这些来发布,然后意识到你已经理解了这个方法。 :/ 哦,好吧,哈哈。
  • IMO 使用这样的全局变量,尤其是在类 __init__() 方法中,是一种极差的编程习惯。
  • @martineau 我不得不承认 6 年后我还没有完全掌握各种实践的所有注意事项。你介意解释一下这种用法有多糟糕吗?不是说我完全不同意,只是想从根本上理解你所指出的。我什至不再使用 Python 进行编程,而且我不希望将旧习惯带入我的其他项目。
  • jtsmith:对于number of reasons,全局变量一直被认为是不好的,它们都与 Python 没有任何关系——但尽管如此,它们还是经常使用,因为它使代码更短。无论如何,在这种情况下,我认为只需将gems 作为参数传递给Jewel 的构造函数方法,就可以轻松避免这种情况。所以我认为在这个被这么多新手程序员使用的网站上这样做没有太多理由。
  • @Mitchell:最简单的方法是将组显式传递给Jewel 子类初始化程序。然而,让任何类的实例将自己添加到某种组中听起来像是一个糟糕的设计(这可能会诱使您开始使用全局变量来做事)。这就是为什么公认的答案——将它添加到初始化器之外的组中——确实可能是最好的。
【解决方案3】:

只需使用组列表调用 super __init__ 函数。例如:

def __init__(self):
    pygame.sprite.Sprite.__init__(self, self.groups)

然后,在你的层次结构的每个类中,你应该定义一个属性 self.groups 并且超级构造函数将把每个实例添加到它的组中。这是我认为最干净的解决方案。否则,只需使用每个类中的组列表显式调用超级构造函数。

【讨论】:

    【解决方案4】:

    更简单的是,您可以将精灵直接传递给构造函数:

    gems = pygame.sprite.Group(gem1, gem2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多