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

本项目采用STM32F103C8T6微控制器,其优势包括:
OLED屏幕是游戏显示核心,选择0.96寸128x64分辨率的I2C 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);
}
}

小恐龙状态主要包括:
使用结构体保存状态及高度信息,通过定时器周期更新位置。
typedef struct {
uint8_t state; // 0: 地面, 1: 跳跃, 2: 下降
uint8_t y; // 垂直坐标
} Dino;
Dino player = {0, GROUND_Y};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;
}
}
}判断小恐龙与障碍物坐标是否重叠,实现游戏结束逻辑。
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定时器中断,实现动画刷新和游戏节奏控制:
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; // 跳跃
}
}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);
}本项目通过STM32微控制器和OLED屏幕,实现了嵌入式小恐龙游戏的完整功能,涵盖:
该项目不仅是嵌入式游戏开发的入门实践案例,也锻炼了硬件接口控制、显示刷新、定时器管理及游戏逻辑设计能力。开发者可在此基础上扩展更多功能,例如背景滚动、多种障碍类型、音效播放以及蓝牙联网排行榜等。
https://blog.csdn.net/weixin_52908342/article/details/150593282
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。