简介
本教程使用STM32F407VET6零知增强板驱动3.5寸TFT触摸屏实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃,躲避障碍物柱体,挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。
目录
[七、完整代码 & 资源](#七、完整代码 & 资源)------视频演示效果
一、硬件准备
1.核心硬件
零知增强板(主控:STM32F407VET6)
3.5寸TFT直插扩展板(含ILI9328控制器 + XPT2046触摸芯片)
直插连接说明:扩展板直接插入零知增强板,引脚自动对齐无需额外接线
2.关键芯片
W25Q64JVSIG:64MB SPI Flash(存储游戏素材)
XPT2046:电阻触摸屏控制器
3.硬件连接图

4.连接实物图

二、软件架构
核心库:
Adafruit_GFX // 图形核心库
Adafruit_TFTLCD_16bit_STM32 // STM32专用TFT驱动
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平台。
零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧!