很没有精神的W 2021-08-22 20:01 采纳率: 100%
浏览 151
已结题

用pygame的精灵和精灵序列图自制的角色移动程序,循环播放图片的animate因为没有看懂案例是自制的。出现报错,请问如何实现在不按键时实现图像停止?

img
代码参考CSDN中的: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()

img

  • 写回答

2条回答 默认 最新

查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 已采纳回答 8月22日
  • 创建了问题 8月22日

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退