简体   繁体   English

builtins.IndexError:列表索引超出范围 pygame animation

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM