在python中区分类的实例

时间:2014-09-14 05:57:29

标签: python class pygame

我正在处理名为Enemy的类的多个实例。我在Game类中使用我的main方法调用它们,所以它看起来像这样。

class Game(object):
     def main(self, screen):
        if condition is true:
            Enemy(arguments)
        elif condition is true:
            Enemy(arguments)

class Enemy(pygame.sprite.Sprite):
    def __init__(self, location, kind, number, *groups):
        self.kind = kind
        self.number = str(number)
        # Stuff that determines where and which kind

每当敌人被召唤它就会产生一个敌人。

稍后我点击检测,需要知道哪个敌人被击中,所以它更新字典。但是为了更新Enemy(和其它类似的)字典,我需要访问敌人的每个实例,并知道我访问哪一个,因为每个实例都有不同的位置变量,在任何给定的时间据我所知,它们都是单独更新的。您需要的任何其他信息我都乐于给予。

编辑:现在看着它我觉得我简化了太多,所以我要翻译一段字典更新代码,这样你就可以看一下。注意我是编码的相对新手,对类来说更是如此,所以这可能不是很好。

class Game(object):
    def main(self, screen):
        while 1:    

            self.hashMap[(topLeftx / acc, topLefty / acc)] = ["Enemy " + Enemy.number]

            topLeftx = Enemy.rect[0]
            topLefty = Enemy.rect[1]
            width = Enemy.rect[2]
            height = Enemy.rect[3]
            acc = 10

            if width > acc:
                x = math.floor(width / acc)
            for a in range(1, int(x) + 1):
                if ((topLeftx / acc) + a, (topLefty / acc)) in self.hashMap.keys():
                    self.hashMap[((topLeftx / acc) + a, (topLefty / acc))].append("Enemy" + Enemy.number)
                else:
                    self.hashMap[((topLeftx / acc) + a, (topLefty / acc))] = ["Enemy" + Enemy.number]

            if height > acc:
                y = math.floor(height / acc)
                for b in range(1, int(y) + 1):
                    if ((topLeftx / acc), (topLefty / acc) + b) in self.hashMap.keys():
                        self.hashMap[((topLeftx / acc), (topLefty / acc) + b)].append("Enemy" + Enemy.number)
            else:
                self.hashMap[((topLeftx / acc), (topLefty / acc) + b)] = ["Enemy" + Enemy.number]

这是我试图为敌人做的事情,但它失败了

 AttributeError: type object 'Enemy' has no attribute 'number'

即使它是在敌人中定义的。 '号码'这是我对ID的看法,但它并没有成功。是否有任何调整可以使这项工作或全新的东西?

重新编辑 - 我忘记了main方法中有一个循环。所有命中检测也应该在主方法中。我没有将Enemy的调用存储为实例,我该如何实现呢?谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

用于区分班级实例的最简单方法'是使用ID(例如,每个敌人都有一个唯一的ID,区别于其他ID)。 因为你在字典(dict)中有这些敌人,他们的id可能是他们的字典键。

这可能有助于我了解您的点击检测如何用于更完整的答案。

希望这有帮助。

答案 1 :(得分:0)

据推测,您正在遍历Enemy个对象的列表。当您检测到“点击”时,您应立即获得被点击的Enemy的实例。如果您已经足够仔细地实现了此算法,则不需要任何其他方法来识别该特定Enemy实例。

答案 2 :(得分:0)

您的错误是,而不是使用引用Enemy.… Enemy(实际上没有任何number属性),代码应引用Enemy 实例(根据您的构造函数具有number属性)。

同样,在您的Game.main()方法中,您应该对您创建的Enemy个实例执行某些操作(比如将它们保存在某处):它们是具有number属性的对象,所以它们是处理代码应该处理的对象。