簡介
本教程使用STM32F407VET6零知增強板驅動3.5寸 ILI9486的TFT觸摸屏擴展板實現經典Flappy Bird游戲。通過觸摸屏控制小鳥跳躍,躲避障礙物柱體,挑戰最高分。項目涉及STM32底層驅動、圖形庫移植、觸摸控制和游戲邏輯設計。
目錄
簡介
一、硬件準備
二、軟件架構
三、代碼解析
四、游戲機制
五、移植要點
六、常見問題解決
七、完整代碼 & 資源——視頻演示效果?
一、硬件準備
1.核心硬件
零知增強板(主控:STM32F407VET6)
3.5寸TFT直插擴展板(含ILI9486控制器 + 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.?初始化設置?
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.?游戲主循環
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)
:?
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)
:?
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()
:?
void gameOver() {// 屏幕閃爍效果for (int i=0; i<10; i++) {myGLCD.invertDisplay(i&1);delay(100);}// 更新最高分if (score > highscore) highscore = score;initiateGame(); // 重啟游戲
}
?四、游戲機制
物理系統
小鳥受重力影響:
fallRate = tick2
(下落速度隨時間平方增加)觸摸時賦予上升速度:
fallRateInt = -10
?難度遞增
if ((score - lastSpeedUpScore) == 5) {movingRate++; // 柱子移動速度增加level++;
}
碰撞檢測
// 邊界檢測
if (yB > (BOTTOM_AREA_Y-BIRD_BMP_Y) || yB < 0) gameOver();// 柱子碰撞
if (xP在柱子X范圍內 && (小鳥Y位置在柱子間隙外)) gameOver();
五、移植要點
屏幕適配
修改
myGLCD.begin(0x9486)
中的控制器ID調整
setRotation()
匹配硬件安裝方向
性能優化
使用
drawFastVLine
替代位圖繪制柱子主體局部刷新(只重繪移動區域)
?觸摸校準
// 示例中的簡化校準流程
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平臺。
零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!?