我正试图让画布上的球对象发生碰撞,然后适当移动。我有一些额外的运动变量对我的问题不重要,但我想保持它们的方式。我的球:
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's init中的变量让我更改了球的各种属性,在绘图中我将速度设置为随机int范围,因为我喜欢它。
我决定使用tkinters获取重叠func来获取球的项目ID,这样我就可以使碰撞对象独立。我的问题是结果是一个元组,我不能用它来提取项目ID,以便对它执行一些移动操作。我的碰撞检查代码在draw函数内部,如下所示:
pos = self.canvas.coords(self.id)
inside = canvas.find_overlapping(pos [0],pos [1],pos [2],pos [3])
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
另请注意,元组也返回self.id,因为它本身就是,所以我排除了第一个元组索引:
idcolliders = inside[1:]
当我打印idcolliders时,我收到一个用于ballobject的元组流 - 最后一个,包含当前在其'coords中的所有id。 有没有办法从这个元组中获取一个ID结果,并把它放在一个函数中来改变它(特别是移动它),当它存在时,它不会抛出错误而不是它?
答案 0 :(得分:0)
您可以使用tkinter的bbox来获取项目canvas.bbox(item)的4个元组x1,y1,x2,y2,然后在数学计算中使用它来检查是否有其他元素物品或您的物品在另一个物品元组内。