用pygame的精灵和精灵序列图自制的角色移动程序,循环播放图片的animate因为没有看懂案例是自制的。出现报错,请问如何实现在不按键时实现图像停止?
问题描述:
代码参考****中的:pygame教程——1.4英雄角色的动画实现
import pygame
# 初始化PyGame
pygame.init()
# 默认窗口
window = pygame.display.set_mode((1280, 720))
from pygame.locals import *
class Rolesprite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # 精灵初始化
self.frame_width = 0 # 初始一帧的宽度
self.frame_height = 0 # 初始一帧的高度
self.x = 200 # 人物图像初始X位置
self.y = 200 # 人物图像初始Y位置
self.rect = self.x, self.y, 0, 0 # 帧的初始位置X,初始位置Y,宽度,高度,初始都设置为0
self.old_frame = -1
self.current_time = 0
self.image = None
self.item = -1
self.frames = []
self.state = None
self.movex = 0
self.movey = 0
def load(self, filename, row, columns):
'''
:param self:
:param filename:文件路径
:param row:精灵序列图行数
:param columns:精灵序列图列数
:return:
'''
self.main_image = pygame.image.load(filename).convert_alpha() # 载入整张精灵序列图
self.main_rect = self.main_image.get_rect() # 获取图片的rect值
self.frame_width = self.main_rect.width / columns # 计算单一帧的宽度=图宽/列数
self.frame_height = self.main_rect.height / row # 计算单一帧的高度=图宽/行数
self.rect = self.x + self.movex, self.y + self.movey, self.frame_width, self.frame_height # 更新rect
pass
def move_state(self):
# 四个方向运动帧的rect值
if self.state == 'dowm':
self.frames = [(self.frame_width * 0, self.frame_height * 0, self.frame_width, self.frame_height),
(self.frame_width * 1, self.frame_height * 0, self.frame_width, self.frame_height),
(self.frame_width * 2, self.frame_height * 0, self.frame_width, self.frame_height),
(self.frame_width * 3, self.frame_height * 0, self.frame_width, self.frame_height)]
if self.state == 'left':
self.frames = [(self.frame_width * 0, self.frame_height * 1, self.frame_width, self.frame_height),
(self.frame_width * 1, self.frame_height * 1, self.frame_width, self.frame_height),
(self.frame_width * 2, self.frame_height * 1, self.frame_width, self.frame_height),
(self.frame_width * 3, self.frame_height * 1, self.frame_width, self.frame_height)]
if self.state == 'right':
self.frames = [(self.frame_width * 0, self.frame_height * 2, self.frame_width, self.frame_height),
(self.frame_width * 1, self.frame_height * 2, self.frame_width, self.frame_height),
(self.frame_width * 2, self.frame_height * 2, self.frame_width, self.frame_height),
(self.frame_width * 3, self.frame_height * 2, self.frame_width, self.frame_height)]
if self.state == 'up':
self.frames = [(self.frame_width * 0, self.frame_height * 3, self.frame_width, self.frame_height),
(self.frame_width * 1, self.frame_height * 3, self.frame_width, self.frame_height),
(self.frame_width * 2, self.frame_height * 3, self.frame_width, self.frame_height),
(self.frame_width * 3, self.frame_height * 3, self.frame_width, self.frame_height)]
def animate(self, rate=30):
self.current_time += 1
if self.current_time > rate: # 在播放了30帧之后
self.current_time = 0 # 重置current_time = 0
self.item += 1 # self.frames中第几个元素的数字
if self.item > len(self.frames) - 1: # 超出了所有帧后重新开始
self.item = -1 # 循环播放
if self.item != self.old_frame:
window.blit(self.frames[self.item], self.rect) # 在self.rect的位置循环绘制某类动作帧
pass
pass
def update(self):
self.state = "left"
# 获取按键,并进行相应的移动
key = pygame.key.get_pressed()
if key[pygame.K_a]:
self.movex -= 5
self.state = "left"
pass
if key[pygame.K_d]:
self.movex += 5
self.state = "right"
pass
if key[pygame.K_s]:
self.movey -= 5
self.state = "down"
pass
if key[pygame.K_w]:
self.movey += 5
self.state = "up"
pass
self.move_state()
self.animate()
a = Rolesprite()
a.load(r'D:\PyCharm\Pycharm文件\MagiaDemo\素材\角色图\1.png', 4, 4)
while True:
pygame.time.Clock().tick(30)
for event in pygame.event.get():
if event.type == QUIT:
exit()
pass
a.update()
pygame.display.update()
答
痛苦
不想看
你去
pythonGame/RPG.py at master · Pliosauroidea/pythonGame · GitHub
Contribute to Pliosauroidea/pythonGame development by creating an account on GitHub.
https://github.com/Pliosauroidea/pythonGame/blob/master/games/RPG/RPG.py
里面写了个随朝向切换的小人在黑背景下乱跑的小程序
对应图片资源在RPG下的src里面
你大概参考一下,切换行和切换列挺相似的
答
请问你的精灵图是网上找的还是自己做的呀