今天我们继续来看pyexl这个库,上次我们哦那个类封装类基础的Sprite和玩家的角色,今天我们就给小飞机加入速度属性和移动逻辑。我们会封装一个move()函数,通过速度和角度来灵活控制移动方向import pyxelimport mathimport randomclass BaseSprite: def __init__(self, x, y, w=8, h=8): """ 构造方法:新增速度属性 """ self.x = x # X坐标 self.y = y # Y坐标 self.w = w # 宽度 self.h = h # 高度 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 def move(self, spd, deg): """ 新增:通过速度和角度控制移动方向 :param spd: 移动速度(数值越大越快) :param deg: 移动角度(单位:度,0=右,90=下,180=左,270=上) """ rad = deg * math.pi / 180 # 角度转弧度(数学计算需要) self.vx = spd * math.cos(rad) # X轴速度分量 self.vy = spd * math.sin(rad) # Y轴速度分量
vx/vy 分别控制x、y方向的移动速度,整数=向右/向下,负数=向左/向上;move方法不需要手动计算vx/vy ,传入角度+速度就可以自动计算方向,比如220度对应左上方向;弧度的转换,math.cos()/math.sin()需要弧度值,所以要把角度转换成弧度在test.py中新增角色的速度常量,方便统一调整# main.py 顶部import pyxelimport mathimport randomimport spriteW, H = 160, 120SHIP_SPD = 1.4 # 玩家移动速度(常量,易维护)
import 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 move(self, spd, deg): """ 控制移动方向和速度 """ rad = deg * math.pi / 180 self.vx = spd * math.cos(rad) self.vy = spd * math.sin(rad) 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 SHIP_SPD = 1.4 # 移动速度# 游戏核心类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) self.ship.move(SHIP_SPD, 220) # 启动游戏循环 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()
运行起来后我们可以看到,小飞机自动向左上方向移动,直到出了屏幕,基本的操作准备好了, 下次我们来通过键盘来控制它的移动。