在之前的内容中我们学习了适用pyxel搭建游戏的窗口和基本框架,今天我们来用python类封装游戏角色。用过cocos2dx的伙伴应该知道Sprite这个概念,它就是把游戏出现的所有角色包括(玩家、敌人、道具)等,都被称作sprite,首先我们要准备sprite模块文件,在工作目录下创建sprite.py文件,定义通用基类BaseSpriteimport pyxelimport mathimport randomclass BaseSprite: def __init__(self, x, y, w=8, h=8): """ 构造方法:初始化精灵基础属性 """ self.x = x # X坐标 self.y = y # Y坐标 self.w = w # 精灵宽度(默认8像素) self.h = h # 精灵高度(默认8像素) self.vx = 0 # X方向速度 self.vy = 0 # Y方向速度 def update(self): """ 更新逻辑:根据速度移动精灵 """ self.x += self.vx # X轴移动 self.y += self.vy # Y轴移动 def draw(self): """ 绘制逻辑:由子类实现(不同精灵绘制方式不同) """ pass
然后继承BaseSprite创建玩家角色ShipSprite,做个小飞机:# 接上面sprite.py的代码class ShipSprite(BaseSprite): def __init__(self, x, y): """ 玩家飞船构造方法:调用父类初始化 """ super().__init__(x, y) # 继承父类的属性 def draw(self): """ 绘制玩家飞船:使用pyxel.blt绘制精灵图 """ pyxel.blt( self.x, self.y, 0, # 绘制坐标 + 图片编号(0为默认) 0, 0, # 图片内的起始坐标 self.w, self.h+2, 0 # 绘制尺寸 + 透明色(0为黑色) )
在主函数中的Game类的构造方法中,创建我们的飞机# Game类__init__方法内self.ship = sprite.ShipSprite(W / 2, H - 40)
并在Game类的update()方法中,调用玩家的更新逻辑,同时在Game类的draw方法中绘制飞机# Game类update方法内self.ship.update() # 目前仅复用父类的移动逻辑,暂未实现按键控制
# Game类draw方法内self.ship.draw()
我们基于之前的代码进行修改,首先是完整的sprite.pyimport pyxelimport mathimport randomclass BaseSprite: def __init__(self, x, y, w=8, h=8): """ 构造方法:初始化精灵基础属性 """ self.x = x # X坐标 self.y = y # Y坐标 self.w = w # 精灵宽度(默认8像素) self.h = h # 精灵高度(默认8像素) self.vx = 0 # X方向速度 self.vy = 0 # Y方向速度 def update(self): """ 更新逻辑:根据速度移动精灵 """ self.x += self.vx # X轴移动 self.y += self.vy # Y轴移动 def draw(self): """ 绘制逻辑: """ pass# 小飞机class ShipSprite(BaseSprite): def __init__(self, x, y): """ 小飞机造方法:调用父类初始化 """ super().__init__(x, y) # 继承父类的属性 def draw(self): """ 绘制小飞机:使用pyxel.blt绘制精灵图 """ pyxel.blt( self.x, self.y, 0, # 绘制坐标 + 图片编号(0为默认) 0, 0, # 图片内的起始坐标 self.w, self.h+2, 0 # 绘制尺寸 + 透明色(0为黑色) )
import pyxelimport mathimport randomfrom sprite import ShipSprite# 游戏窗口尺寸(宽160,高120)W, H = 160, 120 # 游戏核心类class Game: def __init__(self): """构造函数:初始化游戏""" # 初始化分数(新增) self.score = 0 # 初始化Pyxel窗口 pyxel.init(W, H, title="Test, Game!!") # 加载资源文件(可选,本文重点是文字,也可注释掉) pyxel.load("rc.pyxres") self.ship = ShipSprite(W/2,H-40) # 启动游戏循环 pyxel.run(self.update, self.draw) def update(self): """更新逻辑:每帧更新分数""" # 每帧分数+1(模拟游戏得分,可根据实际逻辑修改) self.score += 1 self.ship.update() def draw(self): """绘制逻辑:显示分数""" # 清空屏幕,背景为黑色 pyxel.cls(0) # 绘制格式化的分数(核心代码) pyxel.text( 10, 10, # 文字位置:屏幕左上角(10,10) "SCORE:{:04}".format(self.score), # 格式化分数为4位补零 12 # 文字颜色:亮红色(12是Pyxel的颜色码) ) self.ship.draw()# 程序入口def main(): Game()if __name__ == "__main__": main()
至此,我们就完成了基本角色的绘制,下次我们尝试让它动起来看看。