> 技术文档 > 基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled

基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled


基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】

免费开源,本文项目源码直接下载学习:https://code.devzoo.top/embedded/92.html

一、项目概述

小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、OLED驱动、按键扫描及简单动画实现技术。

项目核心功能包括:

  • 基于OLED显示的动态小恐龙动画
  • 用户输入控制跳跃动作
  • 随机生成障碍物
  • 分数记录和显示
  • 简单碰撞检测,实现游戏结束逻辑

通过该项目,开发者能够掌握嵌入式图形显示、定时器中断、状态机设计以及简单游戏逻辑实现的方法。
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled


二、硬件设计

2.1 主控芯片选择

本项目采用STM32F103C8T6微控制器,其优势包括:

  • 32位ARM Cortex-M3核心,主频72MHz
  • 丰富的GPIO、定时器、SPI/I2C接口
  • 内存充足,适合存储小型游戏图形数据
  • 支持低功耗模式,适合便携式设备

2.2 显示模块

OLED屏幕是游戏显示核心,选择0.96寸128x64分辨率的I2C OLED屏:

  • 通过I2C接口与STM32通信
  • 支持像素级显示,可实现简单动画
  • 占用GPIO少,适合嵌入式小型项目

2.3 用户交互

  • 按键输入:单按键控制小恐龙跳跃
  • 可扩展触摸输入或按钮组合,实现更丰富交互

2.4 电源设计

  • 使用3.7V锂电池供电或USB供电
  • STM32及OLED低功耗设计,可持续运行数小时

基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled

三、软件架构设计

3.1 系统模块划分

本项目软件系统划分为以下模块:

  1. OLED驱动模块:初始化OLED、绘制像素、图形和文字
  2. 按键扫描模块:检测用户跳跃操作
  3. 游戏逻辑模块:小恐龙动作、障碍物生成、碰撞检测
  4. 定时器模块:实现动画刷新、游戏速度控制
  5. 得分显示模块:记录和显示游戏分数

模块间通过函数调用和全局状态结构体进行数据传递,保持逻辑清晰。

3.2 OLED显示逻辑

OLED屏幕采用单色点阵显示,通过刷新像素实现小恐龙和障碍物动画。每帧游戏逻辑更新后,调用OLED刷新函数绘制新画面。为了提高效率,使用缓冲区(Buffer)绘制后统一发送至OLED,减少闪烁。

uint8_t OLED_Buffer[128 * 8]; // 128x64 OLED,每页8行void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t color) { if(color) OLED_Buffer[x + (y/8)*128] |= (1 << (y%8)); else OLED_Buffer[x + (y/8)*128] &= ~(1 << (y%8));}void OLED_Refresh(void) { for(uint8_t page=0; page<8; page++){ OLED_Command(0xB0 + page); OLED_Command(0x00); OLED_Command(0x10); HAL_I2C_Mem_Write(&hi2c1, OLED_ADDR, page*128, I2C_MEMADD_SIZE_8BIT, &OLED_Buffer[page*128], 128, HAL_MAX_DELAY); }}

基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled

四、游戏逻辑实现

基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled

4.1 小恐龙状态机

小恐龙状态主要包括:

  • 地面状态:正常行走
  • 跳跃状态:按键触发跳跃
  • 下降状态:跳跃结束返回地面

使用结构体保存状态及高度信息,通过定时器周期更新位置。

typedef struct { uint8_t state; // 0: 地面, 1: 跳跃, 2: 下降 uint8_t y; // 垂直坐标} Dino;Dino player = {0, GROUND_Y};

4.2 障碍物生成

  • 障碍物通过数组管理,定时移动
  • 随机间隔生成障碍物
  • 与小恐龙坐标比较实现碰撞检测
typedef struct { uint8_t x; uint8_t type; uint8_t active;} Obstacle;Obstacle obs[5];void UpdateObstacle(void) { for(int i=0;i<5;i++){ if(obs[i].active){ obs[i].x--; if(obs[i].x==0) obs[i].active = 0; // 移出屏幕 } else if(rand()%50==0){ // 随机生成 obs[i].x = 127; obs[i].active = 1; obs[i].type = rand()%2; } }}

4.3 碰撞检测

判断小恐龙与障碍物坐标是否重叠,实现游戏结束逻辑。

bool CheckCollision(Dino *d, Obstacle *o){ if(o->active && o->x < DINO_WIDTH && o->x + OBSTACLE_WIDTH > 0){ if(d->y < OBSTACLE_HEIGHT) return true; } return false;}

五、定时器与动画控制

使用STM32定时器中断,实现动画刷新和游戏节奏控制:

  • 定时器周期50ms,更新小恐龙和障碍物位置
  • 每帧刷新OLED缓冲区
  • 控制跳跃高度变化,实现平滑动画
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ UpdateDino(&player); UpdateObstacle(); if(CheckCollision(&player, obs)){ GameOver(); } DrawFrame(); OLED_Refresh();}

六、按键控制

按键通过GPIO中断或轮询实现跳跃触发,按下时改变小恐龙状态为“跳跃”,触发定时器逻辑更新高度,实现跳跃动作。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == BUTTON_PIN && player.state==0){ player.state = 1; // 跳跃 }}

七、得分记录

  • 每帧障碍物成功避开,分数加1
  • 分数显示在OLED屏幕顶部
  • 游戏结束时显示最高分
uint16_t score = 0;void UpdateScore(void){ for(int i=0;i<5;i++){ if(obs[i].active && obs[i].x==0) score++; } OLED_ShowNum(100, 0, score, 3, 1);}

八、项目测试与优化

8.1 游戏运行效果

  • 小恐龙按键跳跃流畅
  • 障碍物随机生成,游戏难度适中
  • OLED显示无明显闪烁

8.2 优化策略

  • 使用OLED缓冲区减少I2C通信闪烁
  • 定时器周期优化动画平滑度
  • 限制障碍物数量和生成频率,提高游戏可玩性
  • 按键消抖和状态机设计保证跳跃精准

九、总结

本项目通过STM32微控制器和OLED屏幕,实现了嵌入式小恐龙游戏的完整功能,涵盖:

  • 嵌入式OLED显示控制
  • 定时器中断与动画实现
  • 小恐龙状态机和跳跃逻辑
  • 随机障碍物生成与碰撞检测
  • 按键交互与分数记录

该项目不仅是嵌入式游戏开发的入门实践案例,也锻炼了硬件接口控制、显示刷新、定时器管理及游戏逻辑设计能力。开发者可在此基础上扩展更多功能,例如背景滚动、多种障碍类型、音效播放以及蓝牙联网排行榜等。

儿童门户网站