区分python中类的实例

2024-09-30 16:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个叫做敌人的类的多个实例。我从游戏类的主方法调用它们,所以看起来是这样的。你知道吗

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

每当敌人被召唤时,它就会产生一个敌人。你知道吗

稍后我有命中检测,需要知道哪个敌人被击中,所以它更新字典。但是要为敌人(以及其他类似的类)更新字典,我需要访问敌人的每个实例,并知道我正在访问哪个实例,因为每个实例在任何给定的时间都有不同的位置变量,而且它们都在单独地、正确地更新。如果你需要更多的信息,我很乐意提供。你知道吗

编辑:现在来看,我确实认为我简化了太多,所以我要转储一段字典更新代码,以便您可以查看它。注意,我是一个相对的新手,在编码和更多的类,所以这可能不是所有做得很好。你知道吗

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'

即使它是在敌人的定义。“号码”是我做身份证的方式,但没有成功。有什么好办法能让这一切顺利吗?你知道吗

重新编辑-我忘了main方法中有一个循环。所有的命中检测也应该是主要的方法。我没有将对敌人的呼叫存储为实例,我应该如何准确地实现它?谢谢你的帮助!你知道吗


Tags: 实例方法inrectselfnumberifclass
3条回答

您的错误是,您的代码应该引用一个Enemy实例(它确实没有任何number属性),而不是使用Enemy.…(它引用了Enemy)。你知道吗

类似地,在Game.main()方法中,应该对创建的Enemy实例进行处理(比如将它们保存在某个地方):它们是具有number属性的对象,因此它们是处理代码应该处理的对象。你知道吗

假设您正在遍历一个Enemy对象列表。当您检测到一个“命中”时,您应该立即拥有被命中的Enemy的实例。如果您已经足够仔细地实现了这个算法,那么就不需要任何其他方法来识别特定的Enemy实例。你知道吗

“区分类实例”的最简单方法是使用id(例如,每个敌人都有一个唯一的id,可以将其与其他敌人区分开来)。 因为字典(dict)中有这些敌人,所以他们的id可以是dict键。你知道吗

它可能会帮助我了解你的命中检测如何工作,以获得更完整的答案。你知道吗

希望这有帮助。你知道吗

相关问题 更多 >