【问题标题】:'NoneType' has no attribute 'colliderect'“NoneType”没有属性“colliderect”
【发布时间】: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。因为eenemies 列表中的一个元素,您在其中附加了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


【解决方案1】:

问题可以是因为你从for statege中的列表中删除。

解决方案:使用未删除的元素创建新列表,然后将其分配给987654323 @

但是PygameGroup保持Sprites

pygame.sprite.spritecollide(sprite, group, dokill, collided = None)

哪个:

返回包含与另一个精灵相交的组中的所有精灵的列表。通过比较Sprite.Rect属性来确定每个Sprite的属性来确定交叉点。

dockill参数是一个bool。如果设置为true,则碰撞的所有精灵将从组中删除

【讨论】:

  • 您还可以循环在eNEMES列表的副本上。 for e in enemies[:]:
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2014-07-05
  • 2018-05-05
  • 2013-02-11
相关资源
最近更新 更多