2014-02-09 34 views
0

我有一個程序,用戶控制一個塊並通過管道導航,類似於遊戲飛揚的鳥。我想知道tkinter是否有辦法告訴我一個矩形是否碰到另一個矩形。我知道有一個畫布的find_overlapping方法,但是當我在管道的矩形上使用find_overlapping時,它給了我管道的ID!我想知道帆布物品是否有辦法知道其他帆布物品是否正在觸摸它!如何查找是一個帆布項目正在觸摸另一個帆布項目,Tkinter

感謝

這裏是我的代碼:

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() 

回答

1

Canvas.find_overlapping回報與在BBOX形狀的所有ID的元組。如果只有你的id被返回,那可能是因爲它是唯一的。

您可以使用bbox這樣的另一個形狀:canvas.find_overlapping(*canvas.bbox(aShape))

請注意,重疊在矩形上工作,例如在圓上可能是錯誤的。

+0

不,但是當我使用它,它返回管道的ID,因爲管道是完全在它的邊界框! – user2658538

+0

事實上,您正在測試的碰撞形狀將位於find_overlapping輸出中,但元組中可能有其他形狀。因此,碰撞測試可能(如您在示例中所做的那樣)測試find_overlapping輸出的長度。 – FabienAndre