python - 如何查找一个 Canvas 项目是否正在接触另一个 Canvas 项目,Tkinter

标签 python canvas tkinter flappy-bird-clone

我有一个程序,用户可以控制一个 block 并通过管道进行导航,类似于游戏 flappybird。我想知道 tkinter 是否有办法告诉我一个矩形是否接触或撞击另一个矩形。我知道 Canvas 有一个 find_overlapping 方法,但是当我在管道的矩形上使用 find_overlapping 时,它给了我管道的 ID!我想知道 Canvas 项目是否有办法知道另一个 Canvas 项目是否正在接触它!

谢谢

这是我的代码:

from Tkinter import *
from random import *
root=Tk()
c=Canvas(root,width=600,height=600)
speed=20
num=1
first=True
b=0
pipes=[]
done=False
class Pipe():
    def __init__(self,canvas,pipes,length,width=75,color="Green",position=600,speed=5):
        self.speed=speed
        self.canvas=canvas
        self.length=length
        self.width=width
        self.color=color
        self.position=position
        self.current1=self.canvas.create_rectangle((self.position,0,self.position+self.width,self.length),outline=self.color,fill=self.color)
        self.current2=self.canvas.create_rectangle((self.position,600,self.position+self.width,self.length+150),outline=self.color,fill=self.color)
        self.pipes=pipes
        self.pipes.append(self.current1)
        self.pipes.append(self.current2)
    def move(self):
        global done
        if (len(self.canvas.find_overlapping(self.position,0,self.position+self.width,self.length))==1 and len(self.canvas.find_overlapping(self.position,600,self.position+self.width,self.length+150))==1) and not done:
            self.position-=3
            self.canvas.coords(self.current1,(self.position,0,self.position+self.width,self.length))
            self.canvas.coords(self.current2,(self.position,600,self.position+self.width,self.length+150))
            if self.position>-75:
                self.canvas.after(self.speed,self.move)
            else:
                self.pipes.remove(self.current1)
                self.pipes.remove(self.current2)
                self.canvas.delete(self.current1)
                self.canvas.delete(self.current2)
        else:
            print self.canvas.find_overlapping(self.position,0,self.position+self.width,self.length)
            print
            print self.canvas.find_overlapping(self.position,600,self.position+self.width,self.length+150)
            done=True
class Player():
    def __init__(self,canvas,x=150,y=300,size=40):
        self.size=size
        self.faller=True
        self.x=x
        self.y=y
        self.fell=5
        self.canvas=canvas
        #For now
        self.current=self.canvas.create_rectangle((self.x-20,self.y-20,self.x+20,self.y+20),tags="user",outline="Blue",fill="Blue")
        self.canvas.after(100,self.fall)
        self.canvas.bind("<1>",self.jump)
    def fall(self):
        global done
        if self.faller and not done:
            self.y+=self.fell
            self.fell*=1.001
            self.canvas.coords(self.current,(self.x-20,self.y-20,self.x+20,self.y+20))
            self.canvas.after(30,self.fall)
        elif done:
            a=600-self.y+20
            a/=50
            while self.y<580:
                self.y+=a
                self.canvas.coords(self.current,(self.x-20,self.y-20,self.x+20,self.y+20))

    def jump(self,e):
        if not done:
            self.faller=False
            for x in range(10):
                self.canvas.after(100,self.move)
            self.faller=True
            self.fell=5
    def move(self):
        self.y-=7.5
        self.canvas.coords(self.current,(self.x-20,self.y-20,self.x+20,self.y+20))
    def changey(self,a):
        self.y=a
def run():
    global b,first,done
    if not done:

        if first:
            b=randint(5,450)
            first=False
        else:
            if b<225:
                b=randint(5,b+225)
            if b>225:
                b=randint(b-225,450)
            else:
                b=randint(0,600)
        a=Pipe(c,pipes,b)
        a.move()
        c.after(2000,run)
    else:
        return
root.focus_set()
user=Player(c)
c.after(2000,run)
c.pack()
root.mainloop()

最佳答案

Canvas.find_overlapping返回一个元组,其中包含 bbox 中所有形状的 id。如果只返回您的 ID,可能是因为它是唯一的。

您可以将其与其他形状的 bbox 一起使用,如下所示:canvas.find_overlapping(*canvas.bbox(aShape))

请注意,重叠适用于矩形,但在圆形等情况下可能会出错。

关于python - 如何查找一个 Canvas 项目是否正在接触另一个 Canvas 项目,Tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21662109/

相关文章:

javascript - "Undo"用于编写文本的 Canvas 转换

python - 在 Python3 中选择一个文件

python-2.7 - 如何使用python中的按钮取消选择复选框?

python - 无法使用 rauth 库访问 LinkedIn 连接

python - 数据帧的频率

python - 当我添加新命令进行撰写时,Docker Compose 与 Django 错误

python - 如何检测 ttk.Treeview 列的大小调整?

多进程上的 Python sys.excepthook

html - HTML5 Canvas 中的自定义线条描边

wpf在调整 Canvas 父级时拉伸(stretch)一条线