2016-11-23 51 views
0

我已經開始用python最近研究tkinter,並開始製作一個馬里奧式的遊戲,涉及一個玩家(矩形)移動,碰撞平臺等,並收集硬幣。我的玩家擊中地面的檢測系統涉及玩家座標的* .find_overlapping方法,如果他們重疊地面或者說每個人說另一個平臺,那麼它將玩家的座標設置爲在所述對象的頂部。我如何將一個列表中的值作爲if語句的範圍包含在另一個列表中?

def collide(): 
    playerBox = screen.find_overlapping(screen.coords(player)[0], screen.coords(player)[1] 
            , screen.coords(player)[2], screen.coords(player)[3]) 

    if playerBox in [(1, 3)]: 
     screen.coords(player, screen.coords(player)[0], screen.coords(root.floor)[1] - defaultHeight 
         , screen.coords(player)[2], screen.coords(root.floor)[1]) 

(這就是(1,3)返回重疊代表與地面(樓面玩家重疊),以及defaultHeight是56,如果你想知道,讓玩家的高度保持不變。)

但是,如果玩家與硬幣接觸,然後他們在地面下跌,並保持在表面之下。爲了解決這個問題,我已經取得了硬幣看起來像的對象開始列表(從旁邊的實際硬幣創建創建一個字典制造):

coinList = [4, 5, 6...] #For however many coins are made (As the first coin is the fourth object on screen, this may change though) 

我希望能夠以包括此coinList進入if語句如上所示,類似於:

if playerBox in [(1, 3), (1, 3, coinList)]: 

這不工作,但我不明白爲什麼或如何這可以工作。

我很樂意爲解決此問題提供任何其他建議!

在此先感謝。

PS:很抱歉,如果我的文章格式不正確或者信息不夠,請隨時索取更多信息。

+0

你能給什麼'playerBox'將是一個例子(A值進行比較?一個包含值列表?一個包含元組的列表?)以及你在''in ...'子句中看起來像什麼(比如說,'[(1,3),(1,3,4,5,6)]' )?我不太清楚你真正想要得到什麼結果,說實話:) – Deneb

+0

如果你使用Python 3.x,那麼你所要做的就是寫'if playerBox in [(1,3),(1 ,3,* coinList)]:'* star將把列表取消到元組中。 (如果這是你想要的) – Nf4r

回答

0

find_overlapping返回與玩家rect重疊的對象的元組。你必須每個元素一個接一個

playerBox = screen.find_overlapping(*screen.coords(player)) 

all_elements = [1, 3] + coinList 

found = False 
for x in playerBox: 
    if x in all_elements: 
     found = True 
     break 

if found: 
    screen.coords(player, ...) 

或者你可以使用set()

playerBox = screen.find_overlapping(*screen.coords(player)) 

all_elements = [1, 3] + coinList 

if set(playerBox) & set(all_elements): 
    screen.coords(player, ...) 
相關問題