這篇博客是 承接:【項目思維】貪吃蛇(嵌入式進階方向)中 嵌入式游戲引擎雛形(終極進階), 是我們此前從 “寫一個小游戲”提升到“構建可復用游戲框架” 的飛躍階段。我們以“貪吃蛇游戲”為例,抽象出一個可擴展的嵌入式游戲引擎框架,適用于 OLED、TFT、LED 點陣等設備,可開發多個小游戲(如:貪吃蛇、五子棋、打飛機、俄羅斯方塊等)。
🧱 嵌入式游戲引擎通用框架設計
🎯 目標:將游戲拆解成獨立模塊,實現 可移植、可復用、可擴展 的游戲引擎架構。
引擎結構總覽圖
+------------------------------+
| Game Engine |
| (Main Loop + FSM + FPS) |
+------------------------------+| | | |↓ ↓ ↓ ↓
Input Render Audio Save
Layer Layer Layer System↓ ↓ ↓ ↓
+------------------------------+
| Platform Drivers |
| (OLED / TFT / Buzzer / Flash)|
+------------------------------+
這邊給一個簡單的 引擎結構:
模塊 | 功能 |
---|---|
🎮 Game Engine Core | 狀態機、主循環、幀率控制 |
🎨 Render Layer | 顯示抽象(OLED/TFT) |
🎧 Audio Layer | 音效模塊 |
🧩 Input Layer | 按鍵輸入抽象 |
💾 Save System | 存檔管理 |
🧠 AI Module | 控制邏輯分離(可用于敵人) |
下面是結構拆解,僅提供項目思維,不提供具體代碼:
1. Game Engine Core
功能:
主函數(Main.c)
游戲狀態管理(FSM)
幀率控制(Frame Timing)
狀態機定義:
typedef enum {STATE_MENU,STATE_PLAYING,STATE_PAUSE,STATE_GAME_OVER
} GameState;extern GameState current_state;
主函數結構:
void game_loop(void) {while (1) {uint32_t start = millis();input_poll(); // 獲取用戶輸入game_update(); // 更新游戲狀態game_render(); // 渲染圖形audio_update(); // 音效播放save_auto(); // 自動存檔(可選)wait_for_next_frame(start); // 控制幀率}
}
2. Render Layer(顯示渲染層)
功能:
抽象不同顯示設備(OLED、TFT、LCD)
提供通用接口:繪圖、清屏、刷新
抽象接口:
typedef struct {void (*clear)(void);void (*draw_pixel)(int x, int y, bool on);void (*draw_text)(int x, int y, const char* str);void (*refresh)(void);
} RenderDriver;extern RenderDriver* renderer;
支持設備:
設備 | 驅動 |
---|---|
SSD1306 OLED | I2C/SPI |
TFT LCD 240x320 | SPI |
點陣 LED | GPIO |
3. Audio Layer(音效模塊)
功能:
播放按鍵音、吃食物音、游戲結束音
支持蜂鳴器、DAC、PWM 音頻輸出
抽象接口:
typedef struct {void (*play_sound)(uint8_t sound_id);void (*stop)(void);
} AudioDriver;extern AudioDriver* audio;
聲音事件:
事件 聲音編號
吃到食物 1
死亡 2
按鍵確認 3
4. Input Layer(輸入抽象層)
功能:
抽象按鍵輸入、方向鍵、觸摸、搖桿等設備
支持事件機制:按下、松開、長按
輸入事件結構:
typedef enum {BTN_UP, BTN_DOWN, BTN_LEFT, BTN_RIGHT,BTN_OK, BTN_BACK
} Button;typedef struct {Button btn;bool pressed;bool long_press;
} InputEvent;void input_poll(void); // 每幀輪詢
InputEvent input_get_event(void);
5. Save System(存檔系統)
功能:
存檔游戲進度、最高分、設置等
可使用 Flash / EEPROM / SD 卡
接口示例:
typedef struct {uint32_t high_score;uint8_t volume;uint8_t speed_level;
} SaveData;void save_load(SaveData* data);
void save_store(const SaveData* data);
此處可配合 CRC 校驗,防止掉電數據損壞。
6. AI Module(控制邏輯模塊)
功能:
敵人控制、自動尋路、AI 玩家
可用于自動控制蛇、敵機、智能對戰
示例接口(自動尋路):
typedef struct {int x;int y;
} Position;Position ai_next_move(Position current, Position target);
7. 游戲邏輯模塊(用戶層)
功能:
具體游戲邏輯開發(如:貪吃蛇、俄羅斯方塊)
復用引擎層提供的服務
典型函數封裝成庫:
void game_init(void);
void game_update(void);
void game_render(void);
8. 模塊解耦與接口設計
每個模塊通過定義接口結構體進行調用,便于替換與模擬。
游戲邏輯不關心是 OLED 還是 TFT,只關心draw_pixel()
🧰 匯總:工程結構
📁 GameEngine/
├── engine.c / .h // 主循環、狀態管理
├── render.c / .h // 顯示抽象
├── input.c / .h // 按鍵抽象
├── audio.c / .h // 音效模塊
├── save.c / .h // 存檔系統
├── ai.c / .h // AI 控制
📁 Games/
│ └── snake.c / .h // 貪吃蛇邏輯
📁 Drivers/
│ ├── ssd1306.c // OLED 驅動
│ ├── tft.c // TFT 驅動
│ └── buzzer.c // 蜂鳴器驅動
狀態流
📘 示例:貪吃蛇游戲狀態流:
stateDiagram[*] --> MENUMENU --> PLAYING : Start GamePLAYING --> PAUSE : Press PausePAUSE --> PLAYING : ResumePLAYING --> GAME_OVER : Snake Hits WallGAME_OVER --> MENU : Press OK
9. 通用框架設計(更多部分擴展)
模塊 | 擴展方向 |
---|---|
輸入層 | 支持觸摸屏、手勢識別、模擬按鍵 |
渲染層 | 支持 LVGL、TFT 色彩動畫 |
音頻層 | 播放背景音樂(WAV 文件) |
存檔系統 | 支持多存檔、玩家選擇 |
狀態管理 | 增加 FSM 狀態隊列、異步事件 |
貪吃蛇游戲本身并不重要,從“寫一個小游戲”提升到“構建可復用游戲框架”環環相扣的 項目的各個階段,重要的是 最終目標:打造可復用的嵌入式游戲開發平臺。
例如,在這通用框架下,支持多個游戲動態加載(菜單選擇); 每個游戲只需關心 update()
和 render()
,無需處理輸入和顯示底層(已寫好,并有對應的函數封裝庫,可直接調用);這類框架可用于教學演示(或者直接寫成游戲框架設計的開發手冊 )、多個軟件項目間的復用、商業產品原型的通用框架設計等等。
綜上。我們以“貪吃蛇游戲”為例,最終抽象出了一個 可移植、可復用、可擴展 的嵌入式游戲引擎框架,適用于 OLED、TFT、LED 點陣等設備,可開發多個小游戲(如:貪吃蛇、五子棋、打飛機、俄羅斯方塊等)。
以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!