Pygame碰撞仅作用于一个对象

mon*_*tem 3 python pygame collision

我正在pygame上编写平台游戏,但遇到一个问题,即仅检测到我的平台冲突之一。

这是我在计算机科学课程中的期末考试。我曾尝试使用组碰撞,但仅适用于sprite,如果我想走那条路线,则必须重写大量代码。

# in main loop
for i in platforms: 
    if i.rect.colliderect(c) and c.isjump == False: 
        # If player is on platform and not jumping
        c.falling = False 
        c.isjump = False
        c.jumpcount = 10
        c.onplat = True
    else:
        c.falling = True
        c.onplat = False
Run Code Online (Sandbox Code Playgroud)

此处的所有内容均正常运行(并且不会产生任何错误),除非我进行测试,否则只有一个平台阻止播放器掉落,而其他平台则逐步通过播放器。如果需要,我可以显示更多代码。

Rab*_*d76 6

如果您确定了一个“停止”播放器的平台,那么您就需要break循环:

for i in platforms: 
    if i.rect.colliderect(c) and c.isjump == False: 
       c.falling = False 
       c.isjump = False
       c.jumpcount = 10
       c.onplat = True

       break # <----- break the loop

    else:
       c.falling = True
       c.onplat = False
Run Code Online (Sandbox Code Playgroud)

否则,下一个平台的结果将覆盖结果,并且列表中的最后一个平台在任何情况下都将设置结果。

注意,您可以通过查找any平台来简化代码:

if c.isjump == False and any([i for i in platforms if i.rect.colliderect(c)]):
   c.falling = False 
   c.jumpcount = 10
   c.onplat = True
Run Code Online (Sandbox Code Playgroud)