我正在处理名为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的调用存储为实例,我该如何实现呢?谢谢你的帮助!
答案 0 :(得分:2)
用于区分班级实例的最简单方法'是使用ID(例如,每个敌人都有一个唯一的ID,区别于其他ID)。 因为你在字典(dict)中有这些敌人,他们的id可能是他们的字典键。
这可能有助于我了解您的点击检测如何用于更完整的答案。
希望这有帮助。
答案 1 :(得分:0)
据推测,您正在遍历Enemy
个对象的列表。当您检测到“点击”时,您应立即获得被点击的Enemy
的实例。如果您已经足够仔细地实现了此算法,则不需要任何其他方法来识别该特定Enemy
实例。
答案 2 :(得分:0)
您的错误是,而不是使用引用Enemy.…
类的Enemy
(实际上没有任何number
属性),代码应引用Enemy
实例(根据您的构造函数具有number
属性)。
同样,在您的Game.main()
方法中,您应该对您创建的Enemy
个实例执行某些操作(比如将它们保存在某处):它们是具有number
属性的对象,所以它们是处理代码应该处理的对象。