基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】_小恐龙小游戏oled
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
免费开源,本文项目源码直接下载学习:https://code.devzoo.top/embedded/92.html
一、项目概述
小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、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低功耗设计,可持续运行数小时
三、软件架构设计
3.1 系统模块划分
本项目软件系统划分为以下模块:
- OLED驱动模块:初始化OLED、绘制像素、图形和文字
- 按键扫描模块:检测用户跳跃操作
- 游戏逻辑模块:小恐龙动作、障碍物生成、碰撞检测
- 定时器模块:实现动画刷新、游戏速度控制
- 得分显示模块:记录和显示游戏分数
模块间通过函数调用和全局状态结构体进行数据传递,保持逻辑清晰。
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); }}
四、游戏逻辑实现
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显示控制
- 定时器中断与动画实现
- 小恐龙状态机和跳跃逻辑
- 随机障碍物生成与碰撞检测
- 按键交互与分数记录
该项目不仅是嵌入式游戏开发的入门实践案例,也锻炼了硬件接口控制、显示刷新、定时器管理及游戏逻辑设计能力。开发者可在此基础上扩展更多功能,例如背景滚动、多种障碍类型、音效播放以及蓝牙联网排行榜等。