【DigiKey好物畅享】Adafruit RP2040 MarcoPad + Mu 教程+代码框架(七)

三、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 显示屏交互时序图