2016-11-23 29 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, ...) 
相关问题