Python 如何分配与对象无关的碰撞检测

Python 如何分配与对象无关的碰撞检测,python,tkinter,tuples,collision-detection,collision,Python,Tkinter,Tuples,Collision Detection,Collision,我试图让画布上的球对象发生碰撞,并适当移动。我有一些额外的动作变量,它们对我的问题并不重要,但我希望它们保持原样。我的球: class Ball(Coords): def __init__(self,canvas,color,drawX1,drawY1,drawX2,drawY2,startX,startY,moveX,moveY): self.canvas = canvas self.drawX1 = drawX1 self.drawY1 = drawY1 se

我试图让画布上的球对象发生碰撞,并适当移动。我有一些额外的动作变量,它们对我的问题并不重要,但我希望它们保持原样。我的球:

class Ball(Coords):
def __init__(self,canvas,color,drawX1,drawY1,drawX2,drawY2,startX,startY,moveX,moveY):
    self.canvas = canvas
    self.drawX1 = drawX1
    self.drawY1 = drawY1
    self.drawX2 = drawX2
    self.drawY2 = drawY2
    self.startX = startX
    self.startY = startY
    self.moveX = moveX
    self.moveY = moveY
    self.id = canvas.create_oval(drawX1,drawY1,drawX2,drawY2, fill=color)
    self.canvas.move(self.id,self.startX,self.startY)



def draw(self,ran1,ran2):
    self.ran1 = ran1
    self.ran2 = ran2
    ranspeed = random.randint(ran1,ran2)
    pos = self.canvas.coords(self.id)       
    self.canvas_height = self.canvas.winfo_height()
    self.canvas_width = self.canvas.winfo_width()
    self.canvas.move(self.id,self.moveX,self.moveY)
ball的init中的变量只允许我更改球的各种属性,在draw中,我将速度设置为随机整数范围,因为我喜欢这种方式

我决定使用tkinters get overlapping func来获取球的项目ID,以便使碰撞对象独立。我的问题是,结果是一个元组,我无法使用它来提取项目ID,以便对其执行一些移动操作。我的碰撞检查代码在draw函数中,如下所示:

pos = self.canvas.coords(self.id)
内部=画布。查找重叠(位置[0]、位置[1]、位置[2]、位置[3])

当我打印idcolliders时,我会收到BallobObject one-last的元组流,其中包含当前在其“coords”中的所有id。
有没有一种方法可以从这个元组中获取一个ID结果,并将它放入一个函数中,以便在它存在时更改它(特别是移动它),这样就不会在它不存在时抛出错误?

您可以使用tkinter's为您的项目画布获取4个元组x1、y1、x2、y2。bbox(项目)然后在数学计算中使用它来检查其他项或您的项是否在另一个项元组中。

虽然我确信您可以使用tkinter执行此操作,但我建议您改用pygame?我认为你可能会有一个更容易的时间(至少从长远来看),即使你可能需要学习一个全新的模块。Pygame内置了处理碰撞检测的类和函数,最终可能会比tkinter画布快得多。幸运的是,学习一个新模块会很费时,但更重要的是,我不知道pygame是否能满足我对这个程序的需求。我仍然需要能够以数字方式合成“球”,这在使用.png或.bmp时非常困难。有没有办法将pygame与tkinters canvas连接起来?我怀疑是否有办法将它们连接在一起,但您的算法可能很容易适应pygame。图形需要从图像文件导入,您可以使用pygames
draw
方法在pygame中绘制。谢谢,是的,它确实工作得很好,但它本身也有问题DAh,我很高兴能帮上忙。祝你好运
    if pos[0] <= 0:         
        self.moveX = ranspeed
    if pos[1] <= 0:
        self.moveY = ranspeed
    if pos[2] >= self.canvas_width:
        self.moveX = ranspeed*-1
    if pos[3] >= self.canvas_height:
        self.moveY = ranspeed*-1
idcolliders = inside[1:]