我正在努力做一个小小的游戏,我在回家的路上遇到了问题。真的,我需要做的就是把这个列表搞定为图像。
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
答案 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来检查球与所有砖块之间的碰撞并自动移除砖块。
但bricks
和ball
必须是self.rect
pygame.sprite.spritecollide(ball_sprite, block_sprites_group, True)