0

我正在使用 python 和 tkinter 开发一款竞赛游戏。到目前为止,一切都很顺利,因为我有运动,还有射击……很好的射击。我能够创建子弹并将它们移动到我想要的方向。但是,我想在它们离开屏幕时删除它们。这就是我遇到麻烦的部分。下面是我的射击代码(绑定到鼠标左键)和我的移动代码:

def shoot(self,e):
    theplayer=self.find_withtag("player")

    bullet=self.create_image([self.coords(theplayer)],image=self.playerUp,tag="bullet")
    self.bullets.append(bullet)

def movebullet(self):
    for bullet in self.bullets:
        x1,x2,y1,y2=self.bbox(bullet)

        if x1>1200:
            self.move(bullet,14,0)
        else:
            self.delete(bullet)

我认为删除代码会起作用,但它给了我一个错误,上面写着:“x1,x2,y1,y2=self.bbox(bullet) TypeError: 'NoneType' object is not iterable"

我不确定这意味着什么,而且拍摄实际上不适用于此。但是,在我尝试删除项目符号之前它起作用了。我真的很感谢任何人对此的帮助。谢谢

4

2 回答 2

2

如果没有看到 self.delete() 方法的代码和 self 是一个实例的类声明的代码,就很难判断到底哪里出了问题。

猜测一下,我会说您正在删除已移出屏幕的子弹的实例对象,但您并没有将其从列表子弹 [] 中删除,因此下次调用 movebullet(self) 时,它会遍历self.bullets 并在它试图移动现在不存在的子弹时摔倒。

尝试:

else:
    self.bullets.remove(bullet)
    self.delete(bullet)
于 2013-05-21T16:03:48.583 回答
1

当您看到'NoneType' object is not iterable时,这意味着您正在尝试迭代具有该值的东西None:您不能迭代单个值None

在语句中x1,x2,y1,y2=self.bbox(bullet),您正在迭代 的结果self.bbox(bullet),并且该函数显然None在某些情况下返回。您需要获取此函数的值,并not None在对其返回的内容执行任何操作之前检查它是否存在,例如将其拆分为单独的变量。

例如,您可能希望将代码更改为:

bbox = self.bbox(bullet)
if bbox is not None:
    x1,y1,x2,y2 = bbox
    ...

可能正在发生的事情是,当子弹第一次离开屏幕时,您可以将其删除,但您忘记将其从项目符号列表中删除。下次您遍历项目符号列表时,列表中的某些项目已被删除。

修复应该很简单:当您删除一个项目符号时,您需要将其从列表中删除。

于 2013-05-21T16:05:39.980 回答