零知开源——STM32F407VET6驱动Flappy Bird游戏教程

简介

本教程使用STM32F407VET6零知增强板驱动3.5寸TFT触摸屏实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃,躲避障碍物柱体,挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。

目录

简介

一、硬件准备

二、软件架构

三、代码解析

四、游戏机制

五、移植要点

六、常见问题解决

[七、完整代码 & 资源](#七、完整代码 & 资源)------视频演示效果


一、硬件准备

1.核心硬件
  • 零知增强板(主控:STM32F407VET6)

  • 3.5寸TFT直插扩展板(含ILI9328控制器 + XPT2046触摸芯片)

  • 直插连接说明:扩展板直接插入零知增强板,引脚自动对齐无需额外接线

2.关键芯片
  • W25Q64JVSIG:64MB SPI Flash(存储游戏素材)

  • XPT2046:电阻触摸屏控制器

3.硬件连接图
4.连接实物图

二、软件架构

核心库:

  1. Adafruit_GFX // 图形核心库

  2. Adafruit_TFTLCD_16bit_STM32 // STM32专用TFT驱动

  3. XPT2046_Touchscreen // 触摸驱动

游戏资源:

flappy_title.h // 游戏标题图片

bird05.h // 小鸟位图

pillar01.h // 柱子位图

bottom_deco.h // 地面装饰

三、代码解析

1. 初始化设置
cpp 复制代码
void setup() {
  Serial.begin(9600);
  myGLCD.begin(0x9486); // 指定ILI9328控制器
  ts.begin();           // 初始化触摸
  
  // 校准触摸屏(示例中省略具体校准过程)
  myGLCD.fillScreen(WHITE);
  myGLCD.setTextSize(2);
  myGLCD.println("Calibration");
  
  // 游戏变量初始化
  highscore = 0;
  myGLCD.setRotation(1);  // 屏幕方向设置
  initiateGame();         // 启动游戏
}
2. 游戏主循环
cpp 复制代码
void loop() {
  // 触摸检测(控制小鸟跳跃)
  if (ts.touched() && !screenPressed) {
    p = ts.getPoint();
    x = p.y;  // 坐标转换(根据屏幕旋转)
    y = TFTWIDTH - p.x;
    fallRateInt = -10; // 负值使小鸟上升
  }
  
  // 游戏物理引擎(每50ms更新)
  if (millis()-prev_millis < 50) return;
  
  // 小鸟下落计算
  fallRate = tick*tick; 
  yB += int(fallRate/15); // 下落速度随时间增加
  
  // 碰撞检测
  if (xP在柱子范围内 && (小鸟撞到柱子)) gameOver();
  
  // 绘制游戏元素
  drawPilars(xP, yP); // 绘制移动的柱子
  drawBird(yB);       // 绘制小鸟
  drawScore();        // 显示分数
}
3. 关键函数

drawBird(int y)

cpp 复制代码
void drawBird(int y) {
  // 使用位图绘制小鸟
  myGLCD.drawBitmap(BIRD_X, y, BIRD_BMP_X, BIRD_BMP_Y, bird);
  
  // 清除小鸟移动轨迹
  if (fallRateInt > 0) 
    myGLCD.fillRect(BIRD_X, y-fallRateInt, BIRD_BMP_X, fallRateInt, BIRD_BG);
}

drawPilars(int x, int y)

cpp 复制代码
void drawPilars(int x, int y) {
  // 绘制上下柱子
  myGLCD.drawBitmap(x, y-PILLAR_END_BMP_Y, PILLAR_END_BMP_X, PILLAR_END_BMP_Y, pillar_end);
  myGLCD.drawBitmap(x, y+PILLAR_GAP, PILLAR_END_BMP_X, PILLAR_END_BMP_Y, pillar_end);
  
  // 柱子主体(垂直填充)
  for (int i=0; i<PILLAR_BMP_X; i++) {
    myGLCD.drawFastVLine(x+i, 0, (y-PILLAR_END_BMP_Y), pillar[i]);
    myGLCD.drawFastVLine(x+i, y+PILLAR_GAP, (BOTTOM_AREA_Y-y-PILLAR_GAP), pillar[i]);
  }
}

gameOver()

cpp 复制代码
void gameOver() {
  // 屏幕闪烁效果
  for (int i=0; i<10; i++) {
    myGLCD.invertDisplay(i&1);
    delay(100);
  }
  // 更新最高分
  if (score > highscore) highscore = score;
  initiateGame(); // 重启游戏
}

四、游戏机制

物理系统

小鸟受重力影响:fallRate = tick²(下落速度随时间平方增加)

触摸时赋予上升速度:fallRateInt = -10

难度递增
cpp 复制代码
if ((score - lastSpeedUpScore) == 5) {
  movingRate++; // 柱子移动速度增加
  level++;
}
碰撞检测
cpp 复制代码
// 边界检测
if (yB > (BOTTOM_AREA_Y-BIRD_BMP_Y) || yB < 0) gameOver();

// 柱子碰撞
if (xP在柱子X范围内 && (小鸟Y位置在柱子间隙外)) gameOver();

五、移植要点

屏幕适配
  • 修改myGLCD.begin(0x9486)中的控制器ID

  • 调整setRotation()匹配硬件安装方向

性能优化
  • 使用drawFastVLine替代位图绘制柱子主体

  • 局部刷新(只重绘移动区域)

触摸校准
cpp 复制代码
// 示例中的简化校准流程
myGLCD.fillRect(TFTWIDTH-10, 0, 10, 10, GREEN); // 提示点击右上角
myGLCD.fillRect(0, TFTHEIGHT-10, 10, 10, GREEN); // 提示点击左下角

六、常见问题解决

屏幕白屏
  • 检查控制器ID(使用tft.readID()获取实际值)

  • 确认3.3V/5V电源跳线帽设置

触摸不准确
  • setup()中增加触摸校准代码

  • 调整坐标转换公式(根据屏幕旋转方向)

游戏卡顿
  • 降低TIME_UNIT值(游戏刷新间隔)

  • 优化drawPilars()中的循环逻辑

七**、完整代码 & 资源**

项目下载地址

https://pan.baidu.com/s/1Ip-HDgoOaPtJcOVtbwfZyA?pwd=cpvf 提取码: cpvf

素材提取工具

https://sourceforge.net/projects/image2code/

视频演示效果

STM32F407VET6驱动Flappy Bird游戏


通过本教程,您已掌握STM32F4的图形显示、触摸交互和游戏逻辑实现。可尝试扩展功能如添加音效、设计更多关卡等。遇到问题欢迎在零知论坛提问:www.lingzhilab.com/http://www.lingzhilab.com/

✔✔

零知开源是一个真正属于国人自己的开源软硬件平台,在开发效率以及上手难度上超越了Arduino平台。

零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧!

相关推荐
小宋同学在不断学习2 小时前
STM32 串口通信①:USART 全面理解 + 代码详解
stm32·单片机·嵌入式硬件
Swift社区2 小时前
AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」
游戏·蓝桥杯·swift
百里东风3 小时前
STM32CubeMX定时器配置
stm32·单片机·嵌入式硬件
长流小哥3 小时前
STM32:ESP8266 + MQTT 云端与报文全解析
stm32·单片机·物联网·mqtt
想搞嵌入式的小白6 小时前
硬件I2C和软件I2C的区别
stm32·单片机·嵌入式硬件
HelloTonyGo6 小时前
在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label
stm32·嵌入式硬件·lvgl
apolloyhl6 小时前
1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集
arm开发·stm32·单片机·嵌入式硬件
一大Cpp9 小时前
Ubuntu下编译mininim游戏全攻略
linux·ubuntu·游戏
Kim Jackson9 小时前
我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块
java·游戏·fabric
DIY机器人工房9 小时前
[9-3] 串口发送&串口发送+接收 江协科技学习笔记(26个知识点)
笔记·科技·stm32·单片机·学习·江协科技