python - 如何在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
谢谢
解决方案
为特定方向的动画创建精灵列表:
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
递增walkcount
并move
从中获取图像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
推荐阅读
- python - 无法设置虚拟环境或查看是否安装了 Anaconda,无法访问 bash 文件夹,“找不到命令”
- docker - 码头工人:standard_init_linux.go:211
- c# - 在 ASP.NET MVC 中合并 dataTable 时没有返回数据
- makefile - 仅在某些文件更改时运行 Phony 目标
- spring - 如何访问 Spring Boot 中 application.properties 文件中定义的内容?
- python - “InSkillProduct”对象不可下标
- c# - 在节点 js 上使用 firebase admin sdk 上传图像
- ios - iOS:集合视图自定义标签布局动态Height Swift
- c++ - c++模板 - 多个重载函数实例与参数列表匹配
- powershell - 由 WinRar 自解压存档执行的脚本未按预期运行