Pygame不能在For循环|||中列出单个项目错误(Blit的目的地无效)

时间:2017-11-30 15:16:39

标签: python pygame

我正在努力做一个小小的游戏,我在回家的路上遇到了问题。真的,我需要做的就是把这个列表搞定为图像。

myList由brick.get_rect()

组成
   # myList = myCollider(myList, ballRect)
    for i in range(len(myList)):
        if(ballRect.colliderect(myList[i])):
            print("ok")
            del myList[i]

    #for i in range(0, len(myList)):

     #   screen.blit(brick, myList[i])
    for i in range(len(myList)):
        screen.blit(brick, myList[i])

    screen.blit(platform, platformRectangle)
    screen.blit(ball, ballRect)

此外,所有代码都有效,直到我添加此

del myList[i]

如果删除它,代码就可以工作,并且在碰撞时激活,就像我想要的那样,但由于某种原因,这似乎不起作用。

为什么不会把我的名单搞砸?

此外,游戏一直有效,直到定义的碰撞发生并且del myList [i]被激活。

完整错误:

Traceback (most recent call last):
  File "C:\Users\Jackson\source\repos\C200-Breakout-Team26\JackCrap\EXT.py", line 152, in <module>
    Play(400, 400, black, 1)
  File "C:\Users\Jackson\source\repos\C200-Breakout-Team26\JackCrap\EXT.py", line 129, in Play
    if(ballRect.colliderect(myList[i])):
IndexError: list index out of range

1 个答案:

答案 0 :(得分:1)

如果你想从列表中删除元素,那么你应该使用del myList[i]但是当你在for循环中使用它时会出现问题,所以最好为你必须保留的元素创建列表。

keep = []

for item in myList:
    if ballRect.colliderect(item):
        print("ok")
    else:
        keep.append(item)

myList = keep

for item in myList:
    screen.blit(brick, item)

编辑:使用列表理解删除元素

myList = [item for item in myList if not ballRect.colliderect(item)]

编辑:请参阅Sprite的文档

如果您将元素保留在pygame.sprite.Group()中,那么您可以使用pygame.sprite.spritecollide来检查球与所有砖块之间的碰撞并自动移除砖块。

bricksball必须是self.rect

的班级
pygame.sprite.spritecollide(ball_sprite, block_sprites_group, True)