Проблема с pygame.transform.rotate (), индекс явно вне диапазона - PullRequest
0 голосов
/ 23 мая 2018

Итак, я работаю над основной игрой 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()

1 Ответ

0 голосов
/ 23 мая 2018

Похоже, вы только добавляете свои изображения спрайтов в список 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_DOWN, PAC_LEFT & PAC_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)
...