【发布时间】:2016-05-08 13:40:46
【问题描述】:
我在这里的第一个问题和python初学者
我想做简单的射击游戏(鸡入侵者类型)。应该在碰撞时“杀死”敌人的矩形(敌人)和较小的矩形(弹药)列表。我在屏幕上的随机位置创建了矩形列表。
enemies = []
for i in range(ENEMYCOUNT):
enemySize = random.randint(ENEMYMINSIZE, ENEMYMAXSIZE)
newEnemy = pygame.Rect(random.randint(0, WINDOWWIDTH - enemySize),
random.randint(0, WINDOWWIDTH-200), enemySize, enemySize)
enemies.append(newEnemy)
我的“弹药”是鼠标点击时出现的不可见矩形列表,然后它们向上移动
ammo = []
for i in range(1, 5):
ammo.append(pygame.Rect(0, 0, 0, 0))
我为单个敌人和单个弹药做过,它按预期工作。 现在我想制造更多的敌人并检查是否有任何敌人被弹药击中
for e in enemies:
for a in ammo:
if e.colliderect(a):
enemies.remove(e)
但我一直得到
如果 e.colliderect(a): AttributeError:“NoneType”对象没有属性“colliderect”
我正在学习“inventwithpython”一书并复制我需要的部分代码,但我无法解决这个问题。我看不到问题,因为我的两个列表都是由 Rect 对象组成的。 任何帮助将不胜感激
【问题讨论】:
-
问题是
e属于NoneType,字面意思是e = None。因为e是enemies列表中的一个元素,您在其中附加了newEnemy对象(在我们的例子中为pygame.Rect)。所以你应该确保那些Rect对象被正确初始化并且不是None类型的 -
您可能需要检查this 关于您的第三个代码 sn-p。
-
问题可能是因为您从
for语句中使用的列表中删除。这是一个非常流行的问题。解决方案:使用未删除的元素创建新列表,然后将其分配给enemies。 -
@albert 我想通了,但我不明白为什么会这样,因为当我在双 for 循环中添加 'print(type(e), type(a))' 时,它会打印 '
' 编辑:我发现在 e = e.inflate(-1, -1) 我的 e(Rect type) 变成 NoneType 所以这是问题,但为什么会发生这种情况在文档中说它返回矩形pygame.org/docs/ref/rect.html#pygame.Rect.inflate_ip
标签: python pygame attributeerror nonetype