内置.IndexError:列出超出范围的pygame动画索引


import pygame
pygame.init()
win = pygame.display.set_mode((1280,800))
pygame.display.set_caption("First Game")
walkLeft = [pygame.image.load('/Users/arnav/Downloads/Jokerattack1.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack2.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack3.png')]
walkRight = [pygame.image.load('/Users/arnav/Downloads/Jokerattack1Right.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack2Right.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack3Right.png')]
Joker1 = pygame.image.load('/Users/arnav/Downloads/Joker.png')
char = pygame.transform.scale(Joker1, (80, 132)) 
bg1 = pygame.image.load('/Users/arnav/Downloads/GothamCity.jpg')
bg = pygame.transform.scale(bg1, (1280, 800))
x = 0
y = 400
width = 40
height = 60
vel = 5
clock = pygame.time.Clock()
isJump = False
jumpCount = 10
left = False
right = False
walkCount = 0
def redrawGameWindow():
global walkCount
win.blit(bg, (0,0))  
if walkCount + 1 >= 9:
walkCount = 0

if left:  
win.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1                          
elif right:
win.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0

pygame.display.update() 

run = True
while run:
clock.tick(12)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[ord('a')] and x > vel: 
x -= vel
left = True
right = False
elif keys[pygame.K_RIGHT] or keys[ord('d')] and x < 900 - vel - width:  
x += vel
left = False
right = True

else: 
left = False
right = False
walkCount = 0

if not(isJump):
if keys[pygame.K_UP] or keys[ord('w')]:
isJump = True
left = False
right = False
walkCount = 0
else:
if jumpCount >= -10:
y -= (jumpCount * abs(jumpCount)) * 0.5
jumpCount -= 1
else: 
jumpCount = 10
isJump = False


def redrawGameWindow2():
global walkCount
if keys[pygame.K_SPACE]:
walkLeft = [pygame.image.load('/Users/arnav/Downloads/Jokerattack1.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack2.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack3.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack4.png')]
walkRight = 
[pygame.image.load('/Users/arnav/Downloads/Jokerattack1Right.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack2Right.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack3Right.png'), 
pygame.image.load('/Users/arnav/Downloads/Jokerattack3Right.png')]
win.blit(bg, (0,0))  
if walkCount + 1 >= 12:
walkCount = 0

if left:  
win.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1                          
elif right:
win.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0

pygame.display.update()             

redrawGameWindow2() 


pygame.quit()

在这个程序中,我试图让它,当你按下箭头键时,角色行走,当你按空格时,动画扩展到攻击。我试图通过第二次重新绘制游戏窗口来做到这一点,箭头键起作用,但当我按下空格时,它会给我一个内置的提示。IndexError:列出超出范围的pygame动画索引。

您使用的是//楼层划分运算符来钳制动画索引,而不是模%

因此,当你在第12帧按下空格时,你会得到一个超出范围的错误12 // 3 = 4

相反,您需要使用walkLeft[walkCount % len(walkLeft)]

0 % 4 = 0
1 % 4 = 1
[..]
4 % 4 = 0
5 % 4 = 1

在使用索引从列表中获取项目之前,请将索引与列表的长度进行比较:

def redrawGameWindow():
global walkCount
win.blit(bg, (0,0))  

if left:  
if walkCount // 3 >= len(walkLeft): 
walkCount = 0
win.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1                          
elif right:
if walkCount // 3 >= len(walkRight): 
walkCount = 0
win.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0

pygame.display.update() 

或者使用%(模(运算符。模运算符计算除法的余数。

def redrawGameWindow():
global walkCount
win.blit(bg, (0,0))  

if left:  
win.blit(walkLeft[(walkCount//3) % len(walkLeft)], (x,y))
walkCount += 1                          
elif right:
win.blit(walkRight[(walkCount//3) % len(walkRight)], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0

pygame.display.update() 

redrawGameWindow2:执行相同操作

def redrawGameWindow2():
# [...]
if left:  
win.blit(walkLeft[(walkCount//3) % len(walkLeft)], (x,y))
walkCount += 1                          
elif right:
win.blit(walkRight[(walkCount//3) % len(walkRight)], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0
# [...]

最新更新