[英]builtins.IndexError: list index out of range pygame animation
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()
In this program, I am trying to make it so that when you press arrow keys, the character walks, and when you press space, the animation extends to attack.在这个程序中,我试图让当你按下箭头键时,角色走,当你按下空格键时,animation 延伸到攻击。 I tried to do this by redrawing the game window for a second time and the arrow keys work but when I press space it gives me a builtins.IndexError: list index out of range pygame animation.
我试图通过第二次重绘游戏 window 来做到这一点,并且箭头键可以工作,但是当我按下空格时,它给了我一个 builtins.IndexError: list index out of range pygame Z6F1C25ED1523962F1BBF9DEE9ZBE.509
Before using the index to get an item from the list, compare the index to the length of the list:在使用索引从列表中获取项目之前,将索引与列表的长度进行比较:
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()
Or use the %
(modulo) operator.或使用
%
(模)运算符。 The modulo operator calculates the remainder of a division.模运算符计算除法的余数。
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()
Do the same for redrawGameWindow2
:对
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
# [...]
You're using the //
floor division operator to clamp the animation index instead of modulo %
.您正在使用
//
floor 除法运算符来钳制 animation 索引而不是模%
。
So when you press space on the 12th frame you get an out of range error 12 // 3 = 4
因此,当您在第 12 帧按空格时,您会得到一个超出范围的错误
12 // 3 = 4
Instead you need to use walkLeft[walkCount % len(walkLeft)]
相反,您需要使用
walkLeft[walkCount % len(walkLeft)]
0 % 4 = 0
1 % 4 = 1
[..]
4 % 4 = 0
5 % 4 = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.