如何指定与对象无关的碰撞检测

2024-05-03 09:54:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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函数内部,如下所示:

^{pr2}$

内部=canvas.find_重叠(位置[0]、位置[1]、位置[2]、位置[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

还要注意元组也返回自身id因为它本身,所以我排除了第一个元组索引:

idcolliders = inside[1:]

当我打印idcolliders时,我收到ballobject one-last的元组流,其中包含当前在其坐标内的所有id。 如果它不存在的话,它就不会改变它的结果了?在


Tags: posselfidcanvasmovexmoveystartxstarty
1条回答
网友
1楼 · 发布于 2024-05-03 09:54:48

你可以用tkinter的bbox来得到你的物品的4个元组,x1,y1,x2,y2画布.bbox(item),然后在数学计算中使用它来检查其他项或您的项是否在另一个items元组中。在

相关问题 更多 >