首页 > 解决方案 > 如何在pygame的平铺游戏中添加平滑动画

问题描述

我正在pygame中制作一个基于瓷砖的游戏,我希望在玩家类的瓷砖之间有一个平滑的行走动画。我已经做到了,以便玩家将面对正确的方向。

我试图在切换动画之间有一点延迟,但效果不佳。它只是僵住了一瞬间。

class Player(pygame.sprite.Sprite):
    def __init__(self, game, x, y):
        self.groups = game.all_sprites
        self._layer = PLAYER_LAYER
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.game = game
        self.image = self.game.spritesheet.get_image(0,32,32,32)
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.x = x
        self.y = y
        self.dir = 'UP'

    def move(self, x_change, y_change):
        if x_change > 0:
            self.dir = 'RIGHT'
        if x_change < 0:
            self.dir = 'LEFT'
        if y_change > 0:
            self.dir = 'DOWN'
        if y_change < 0:
            self.dir = 'UP'

        if not self.collide(x_change, y_change):
            self.x += x_change
            self.y += y_change

            if self.dir == 'UP':
                self.image = self.game.spritesheet.get_image(64,96,32,32)
                self.image.set_colorkey(BLACK)
                time.sleep(1)
                self.image = self.game.spritesheet.get_image(32,96,32,32)
                self.image.set_colorkey(BLACK)
            if self.dir == 'LEFT':
                self.image = self.game.spritesheet.get_image(96,32,32,32)
                self.image.set_colorkey(BLACK)
            if self.dir == 'RIGHT':
                self.image = self.game.spritesheet.get_image(64,64,32,32)
                self.image.set_colorkey(BLACK)
            if self.dir == 'DOWN':
                self.image = self.game.spritesheet.get_image(0,32,32,32)
                self.image.set_colorkey(BLACK)

    def collide(self, x_change, y_change):
        for block in self.game.blocks:
            if block.x == self.x + x_change and block.y == self.y + y_change and block.collidable:
                return True
        return False

    def update(self):
        self.rect.x = self.x * SCALE
        self.rect.y = self.y * SCALE

谢谢

标签: pythonpygame

解决方案


为特定方向的动画创建精灵列表:

self.image_up = [self.game.spritesheet.get_image(64,96,32,32),
                 self.game.spritesheet.get_image(32,96,32,32)]

添加一个属性walkcount

self.walkcount = 0

递增walkcountmove从中获取图像self.image_up,索引为self.walkcount

if self.walkcount >= len(self.image_up)
    self.walkcount = 0 
self.image = self.image_up[self.walkcount]
self.walkcount += 1

Player

class Player(pygame.sprite.Sprite):
    def __init__(self, game, x, y):
        self.groups = game.all_sprites
        self._layer = PLAYER_LAYER
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.game = game
        self.image = self.game.spritesheet.get_image(0,32,32,32)
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.x = x
        self.y = y
        self.dir = 'UP'
        self.image_up = [self.game.spritesheet.get_image(64,96,32,32),
                        self.game.spritesheet.get_image(32,96,32,32)]
        self.image_left = [self.game.spritesheet.get_image(96,32,32,32)]
        self.image_right = [self.game.spritesheet.get_image(64,64,32,32)]
        self.image_down = [self.game.spritesheet.get_image(0,32,32,32)]
        self.walkcount = 0

    def move(self, x_change, y_change):
        if x_change > 0:
            self.dir = 'RIGHT'
        if x_change < 0:
            self.dir = 'LEFT'
        if y_change > 0:
            self.dir = 'DOWN'
        if y_change < 0:
            self.dir = 'UP'

        if not self.collide(x_change, y_change):
            self.x += x_change
            self.y += y_change

            image_list = None
            if self.dir == 'UP':
                image_list = self.image_up
            elif self.dir == 'LEFT':
                image_list = self.image_left
            elif self.dir == 'RIGHT':
                image_list = self.image_right
            elif self.dir == 'DOWN':
                image_list = self.image_down 

            if image_list:
                if self.walkcount >= len(image_list)
                    self.walkcount = 0 
                self.image = image_list[self.walkcount]
                self.walkcount += 1
                self.image.set_colorkey(BLACK)

    def collide(self, x_change, y_change):
        for block in self.game.blocks:
            if block.x == self.x + x_change and block.y == self.y + y_change and block.collidable:
                return True
        return False

    def update(self):
        self.rect.x = self.x * SCALE
        self.rect.y = self.y * SCALE

推荐阅读