我目前正在尝试使用pygame开发一款游戏,而且我的某些列表存在一些问题。非常简单,我希望在走出屏幕时删除镜头。我目前的代码完美无缺,直到我拍摄不止一个。
当前代码:
#ManageShots
for i in range (len(ShotArray)):
ShotArray[i].x += 10
windowSurface.blit(ShotImage, ShotArray[i])
if(ShotArray[i].x > WINDOWWIDTH):
ShotArray.pop(i)
错误讯息:
ShotArray[i].x += 10
IndexError: list index out of range
答案 0 :(得分:5)
从列表中弹出一个项目会将之后的所有项目移动到一个位置。因此,您最终得到的索引i
很容易超出范围。
循环后从列表中删除项目,或反向循环遍历列表:
for shot in reversed(ShotArray):
shot.x += 10
windowSurface.blit(ShotImage, shot)
if shot.x > WINDOWWIDTH:
ShotArray.remove(shot)
答案 1 :(得分:2)
问题是len(SortArray)
在循环开始时被评估一次。但是,您可以通过调用ShotArray.pop(i)
来更改列表的长度。
i = 0
while i < len(ShotArray):
ShotArray[i].x += 10
windowSurface.blit(ShotImage, ShotArray[i])
if(ShotArray[i].x > WINDOWWIDTH):
ShotArray.pop(i)
else:
i += 1
答案 2 :(得分:2)
你可能想要这样的东西:
# update stuff
for shot in ShotArray:
shot.x += 10
windowSurface.blit(ShotImage, shot)
# replace the ShotArray with a list of visible shots
ShotArray[:] = [shot for shot in ShotArray if shot.x < WINDOWWIDTH]
不要改变你迭代的列表的长度,这会导致混乱。