【问题标题】:Issue with pygame.transform.rotate(), Index is apparently out of rangepygame.transform.rotate() 的问题,索引显然超出范围
【发布时间】:2018-05-22 21:56:55
【问题描述】:

所以我正在开发一个基本的 PacMan 游戏,并试图让我的玩家运行它的 sprite_sheet 以显示动画。当我向右移动它时它可以完美地工作(这是图像的原始方向),但是对于我 pygame.transform.rotate() 图像的任何其他方向,它返回以下内容: self.image = (PAC_UP[self.spritesheet_index % 4]) IndexError: 列表索引超出范围

不知道为什么会发生这种情况(显然它与轮换有关)。任何关于旋转以及为什么会发生这种情况的解释都将不胜感激!

谢谢! 这是我的代码:

class sprite_sheet():
    def __init__ (self, filename):
        self.spritesheet = pygame.image.load(filename)

    def get_image(self, x, y, width, height):
        image = pygame.Surface((width, height))
        image.set_colorkey(BLACK)
        image.blit(self.spritesheet, (0,0), (x, y, width, height))
        return image


PAC_RIGHT = []
for x in range(4):
    image = (sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24))
    PAC_RIGHT.append(image)


PAC_UP = []
for x in range(4):
    image = sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(pygame.transform.rotate(image, 90))

PAC_LEFT = []
for x in range(4):
    image = sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(pygame.transform.rotate(image, 180))

PAC_DOWN = []
for x in range(4):
    image = sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(pygame.transform.rotate(image, 270))





class Player (pygame.sprite.Sprite):

    def __init__(self, game, x, y):
        self.groups = game.all_sprites

        pygame.sprite.Sprite.__init__(self, self.groups)

        self.game = game
        self.image = sprite_sheet('pacman-spritesheet.png').get_image(0, 0, 24, 24)

        self.x = x * TILESIZE
        self.y = y * TILESIZE


        self.rect = self.image.get_rect()

        self.vx, self.vy = 0, 0

        self.spritesheet_index = 0

        self.first_time = pygame.time.get_ticks()
        self.delay = 43




    def get_keys(self):
        self.vx, self.vy = 0, 0
        keys = pygame.key.get_pressed()

        self.spritesheet_index += 1



        if keys[pygame.K_LEFT]:
            self.vx = -PLAYER_SPEED
            self.second_time = pygame.time.get_ticks()

            if self.second_time-self.first_time > self.delay:
                self.image = (PAC_LEFT[self.spritesheet_index % 4])
                self.first_time = pygame.time.get_ticks()

        if keys[pygame.K_RIGHT]:
            self.vx = PLAYER_SPEED
            self.second_time = pygame.time.get_ticks()

            if self.second_time-self.first_time > self.delay:
                self.image = (PAC_RIGHT[self.spritesheet_index % 4])
                self.first_time = pygame.time.get_ticks()

        if keys[pygame.K_UP]:
            self.vy = -PLAYER_SPEED
            self.second_time = pygame.time.get_ticks()

            if self.second_time-self.first_time > self.delay:

                self.image = (PAC_UP[self.spritesheet_index % 4])
                self.first_time = pygame.time.get_ticks()

        if keys[pygame.K_DOWN]:
            self.vy = PLAYER_SPEED
            self.second_time = pygame.time.get_ticks()

            if self.second_time - self.first_time > self.delay:
                self.image = (PAC_DOWN[self.spritesheet_index % 4])
                self.first_time = pygame.time.get_ticks()

【问题讨论】:

  • 因为PAC_UP 是空的。你只是填写PAC_RIGHT
  • 这是复制粘贴的结果。当您有需要重复多次的代码并且您觉得需要复制粘贴时,请考虑将其设为函数。它将减少文件中的代码量,使其更易于阅读,更易于更改,并且会避免此类复制粘贴错误。
  • @TedKleinBergman 好的,谢谢,正计划制作一个函数,只是想了解基础知识。感谢您的洞察力(即使我的问题非常简单)

标签: python-3.x pygame sprite pygame-surface


【解决方案1】:

看起来您只是将精灵图像添加到 PAC_UP 列表中:

PAC_RIGHT = []
for x in range(4):
    image = (sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24))
    PAC_RIGHT.append(image)


PAC_UP = []
for x in range(4):
    image = sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(pygame.transform.rotate(image, 90))

修改您的代码以附加到适当的列表PAC_DOWNPAC_LEFTPAC_RIGHT

此外,这似乎是一个复制粘贴错误。与其复制粘贴,不如创建一个函数来加载图像。

这是一个未经测试的例子:

def load_sprite_images(rotation, filename='pacman-spritesheet.png'):
    """Load four sprite images from the specified file"""
    images = []
    for x in range(4):
        image = (sprite_sheet(filename).get_image(x*24, 0, 24, 24))
        images.append(pygame.transform.rotate(image, rotation))
    return images

PAC_RIGHT = load_sprite_images(0)
PAC_UP = load_sprite_images(90)
PAC_LEFT = load_sprite_images(180)
PAC_RIGHT = load_sprite_images(270)

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多