三、Dragon Drop游戏架构
1. 整体架构图
用途: 展示游戏的三层架构设计
内容:
-
输入层: 按键输入、编码器输入
-
游戏逻辑层: Sprite类、游戏状态管理、碰撞检测
-
输出层: 显示屏渲染、像素灯控制、音频输出
价值: 理解游戏的整体分层设计,明确各层的职责和交互关系
2. 技术栈图
用途: 展示从硬件到应用的完整技术依赖关系
内容:
-
硬件层: Adafruit MACROPAD
-
运行时层: CircuitPython 10.x
-
核心库层: displayio, audiocore/audiopwmio, board
-
Adafruit库层: adafruit_macropad, adafruit_imageload, adafruit_bitmap_font等
-
应用逻辑层: Sprite类, GameLoop, 工具函数
价值: 理解技术选型和依赖关系,便于环境配置和迁移
四、Dragon Drop游戏代码框架
一、整体功能与依赖
-
功能:竖屏 OLED 显示下,玩家通过 4 个按键接住掉落的鸡蛋(加分),避开火球(减生命),生命值耗尽则游戏结束。
-
依赖库:主要使用adafruit_macropad(硬件交互)、displayio(显示控制)、adafruit_imageload(图像加载)、audiopwmio(音频输出)等 Adafruit 硬件相关库,以及random(随机数)、time(时间控制)等基础库。
二、代码结构拆分
1. 配置与常量定义
MAX_EGGS = 7 # 最大投射物数量(鸡蛋+火球)
PATH = ‘/dragondrop/’ # 资源文件(图像、字体、音频)路径
- 定义游戏核心参数和资源路径,方便后续修改配置。
2. 工具函数与类
用于封装重复逻辑,提高代码复用性。
(1)音频播放函数 background_sound
def background_sound(filename):
macropad._speaker_enable.value = True
audio.play(audiocore.WaveFile(open(PATH + filename, ‘rb’)))
-
功能:非阻塞播放 WAV 音频文件(如接住鸡蛋、火球的音效)。
-
备注:注释提到若 MACROPAD 库原生支持背景音频,可移除该函数。
(2)屏幕切换函数 show_screen
def show_screen(group):
macropad.display.root_group = group
macropad.display.refresh()
while macropad.keys.events.get(): pass # 清空按键队列
while True: # 等待新按键按下
key_event = macropad.keys.events.get()
if key_event and key_event.pressed:
return
- 功能:切换显示内容(如标题页→游戏页→结束页),并等待按键确认(避免误触)。
(3)投射物类 Sprite
class Sprite:
def init(self, col, start_time):
self.column = col # 所在列(0-3)
self.is_fire = (random.random() < 0.25) # 25%概率为火球
self.start_time = start_time # 生成时间(用于计算下落位置)
self.paused = False # 是否暂停(落地/被接住后)
- 功能:封装单个投射物(鸡蛋 / 火球)的状态,包括位置、类型、时间和运动状态。
3. 初始化配置(一次性执行)
初始化硬件、显示资源和游戏界面元素。
(1)硬件初始化
macropad = MacroPad(rotation=90) # 竖屏显示(旋转90度)
macropad.display.auto_refresh = False # 关闭自动刷新(手动控制以节省资源)
macropad.pixels.auto_write = False # 关闭LED自动刷新
macropad.pixels.brightness = 0.5 # 调整LED亮度
audio = audiopwmio.PWMAudioOut(board.SPEAKER) # 初始化音频输出
(2)显示资源加载
-
字体:加载自定义字体 cursive-smart.pcf,用于显示分数。
-
图像资源:
-
标题页图像 title.bmp
-
游戏元素图像 sprites.bmp(包含鸡蛋、幼龙、火球等精灵)
-
阴影图像 shadow.bmp(用于显示鸡蛋下落的阴影)
-
结束页图像 gameover.bmp
-
(3)显示组(displayio.Group)
displayio 库通过 “组” 管理显示元素,这里创建了 3 个组对应不同场景:
-
标题组(title_group):显示游戏标题画面,仅包含 title.bmp 图像。
-
游戏组(play_group):游戏主界面,包含:
-
阴影瓦片(4 列,随鸡蛋位置变化)
-
生命条(HorizontalProgressBar,生命值可视化)
-
分数标签(label.Label,实时更新分数)
-
结束组(end_group):游戏结束画面,包含 gameover.bmp 和最终分数标签。
(4)OLED 显示屏交互时序图
-


