pygame系列教程 您所在的位置:网站首页 人物跳跃动画素材 pygame系列教程

pygame系列教程

2024-07-04 12:35| 来源: 网络整理| 查看: 265

文章目录 前言Demo演示代码如下(player_animation.py):素材样例(可能存在变形):知识点:

前言

上一节我们实现了英雄角色的左右移动及跳跃功能,但是只有一张单一的图片,英雄无法产生更生动的形象。所以本节我们将会在人物运动的过程中为其添加动画效果。

Demo演示

我们先来看下本节的效果:

python使用pygame开发游戏系列之精灵动画的实现。

代码如下(player_animation.py): import json import pygame class Player(object): """player对象""" def __init__(self): self.player_img = "zombie.png" self.all_frames = self.load_frames_from_sheet() self.rect = self.all_frames.get("left").get("idle")[0].get_rect() self.rect.midbottom = (100, screen_height - 135) self.vel_y = 0 self.current_frame = 0 self.jumped = False self.direction = 1 # 1:右 -1:左 self.dir_frames = [] self.frames = [] self.state = 'idle' self.is_attack = False self.last_updated = 0 self.current_image = self.all_frames.get("left").get("idle")[0] def handle_state(self): """根据状态决定行为""" if self.direction == -1: # 根据方向选择朝向不同的序列图片 self.dir_frames = self.all_frames.get("left") else: self.dir_frames = self.all_frames.get("right") if self.state == 'idle': self.frames = self.dir_frames.get("idle") elif self.state == "run": self.frames = self.dir_frames.get("run") elif self.state == "walk": self.frames = self.dir_frames.get("walk") elif self.state == "jump": self.frames = self.dir_frames.get("jump") elif self.state == "fall": self.frames = self.dir_frames.get("fall") elif self.state == "attack": self.frames = self.dir_frames.get("attack") def animate(self): now = pygame.time.get_ticks() if now - self.last_updated > 100: self.last_updated = now self.current_frame = (self.current_frame + 1) % len(self.frames) self.current_image = self.frames[self.current_frame] def load_frames_from_sheet(self): my_sprite_sheet = SpriteSheet(self.player_img) stand_frames = [my_sprite_sheet.parse_sprite("idle")] move_frames = [my_sprite_sheet.parse_sprite("walk{}".format(i)) for i in range(0, 8)] jump_frames = [my_sprite_sheet.parse_sprite("jump")] fall_frames = [my_sprite_sheet.parse_sprite("fall")] attack_frames = [my_sprite_sheet.parse_sprite("attack{}".format(i)) for i in range(0, 3)] run_frames = [my_sprite_sheet.parse_sprite("run{}".format(i)) for i in range(0, 3)] right_frames = {"idle": stand_frames, "walk": move_frames, "jump": jump_frames, "fall": fall_frames, "run": run_frames, "attack": attack_frames} left_frames = {key: [pygame.transform.flip(frame, True, False) for frame in frames] for key, frames in right_frames.items()} all_frames = {"left": left_frames, "right": right_frames} return all_frames def update(self): x_move = 0 y_move = 0 self.state = "idle" self.is_attack = False # 获取按键,并进行相应的移动 key = pygame.key.get_pressed() if key[pygame.K_SPACE] and not self.jumped: self.vel_y = -15 self.jumped = True if key[pygame.K_LEFT]: x_move -= 5 self.direction = -1 self.state = "walk" elif key[pygame.K_a]: x_move -= 7 self.direction = -1 self.state = "run" if key[pygame.K_RIGHT]: x_move += 5 self.direction = 1 self.state = "walk" elif key[pygame.K_d]: x_move += 7 self.direction = 1 self.state = "run" if key[pygame.K_j] and self.is_attack is False: self.state = "attack" self.is_attack = True if self.vel_y 0: self.state = "fall" # 添加角色重力(跳跃之后自然下落) self.vel_y += 0.8 if self.vel_y > 10: self.vel_y = 10 y_move += self.vel_y self.rect.x += x_move self.rect.y += y_move # 控制人物的最低位置 if self.rect.bottom > screen_height - 135: self.rect.bottom = screen_height - 135 self.jumped = False self.handle_state() self.animate() # 绘制人物 screen.blit(self.current_image, self.rect) # pygame.draw.rect(screen, (255, 255, 255), self.rect, 2) class Cloud(object): """云层对象""" def __init__(self, x, y): self.image = pygame.image.load('cloud.png').convert_alpha() self.rect = self.image.get_rect() self.rect.topleft = (x, y) def update(self): self.rect.x -= 1 # 云层移动 screen.blit(self.image, self.rect) if self.rect.x


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有