零知開源——STM32F407VET6驅動ILI9486 TFT顯示屏 實現Flappy Bird游戲教程

簡介

本教程使用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平臺。
零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908020.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908020.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908020.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云臺式激光甲烷探測器:守護工業安全的“智慧之眼”

在石油化工、天然氣場站、城市燃氣管網等場景中&#xff0c;甲烷泄漏的早期監測是保障生產安全的核心防線。云臺式激光甲烷探測器憑借高精度、無接觸、智能化的技術優勢&#xff0c;成為工業安全監測領域的革新者。本文將深度解析其技術原理、核心功能及適用場景&#xff0c;助…

解決 Ubuntu 20.04 虛擬機中 catkin_make 編譯卡死問題

完整解決步驟 1. 禁用當前交換文件 sudo swapoff /swapfile 2. 刪除舊的交換文件 sudo rm /swapfile 3. 使用更可靠的創建方法 # 使用 dd 命令創建交換文件&#xff08;更兼容但較慢&#xff09; sudo dd if/dev/zero of/swapfile bs1M count4096# 或者使用 truncate 命令…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.7 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.7 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖&#xff0c;等值線圖。 dataframe <-data.frame…

linux變量的分類

文章目錄 bash中的引號linux變量的分類1.環境變量2.本地變量&#xff1a;3.局部變量4.內置變量5. 位置參數變量6. 特殊變量 變量的定義規則8.數組 bash中的引號 雙引號"" &#xff1a;會把引號的內容當成整體來看待&#xff0c;允許通過 符號引用其他變量值單引 號 …

邏輯回歸知識點

一、邏輯回歸概念 邏輯回歸(Logistic Regression)是一種廣泛應用于分類問題的統計方法&#xff0c;尤其適用于二分類問題。 注意: 盡管名稱中有"回歸"二字&#xff0c;但它實際上是一種分類算法。 解決二分類的問題。 API&#xff1a;sklearn.linear_model.Logis…

GCC內存占用統計使用指南

GCC 的 --print-memory-usage 選項用于在編譯鏈接過程中輸出程序的內存占用統計信息&#xff0c;特別適用于嵌入式開發等內存受限的場景。其主要作用和輸出內容如下&#xff1a; 核心功能 顯示內存分段占用 輸出程序在目標設備內存中的分段占用情況&#xff0c;通常包括&#…

Vue3 + Typescript:類型使用記錄 / 類型注解 / 積累

一、ReturnType<typeof createApp> ReturnType<typeof createApp> 是一種類型安全的寫法&#xff0c;是 TypeScript 中的一個高級類型&#xff0c;它用于獲取函數 createApp 的返回類型。 實例&#xff1a; import registerFocus from ./focus // 獲取焦點 impo…

SIFT 算法原理詳解

SIFT 算法原理詳解 SIFT&#xff08;尺度不變特征變換&#xff0c;Scale-Invariant Feature Transform&#xff09;是一種經典的局部特征檢測和描述算法&#xff0c;它能夠在不同的尺度、旋轉和光照變化下穩定地檢測圖像特征。SIFT 主要包括以下幾個步驟&#xff1a;尺度空間極…

2024年認證杯SPSSPRO杯數學建模D題(第二階段)AI繪畫帶來的挑戰解題全過程文檔及程序

2024年認證杯SPSSPRO杯數學建模 D題 AI繪畫帶來的挑戰 原題再現&#xff1a; 2023 年開年&#xff0c;ChatGPT 作為一款聊天型AI工具&#xff0c;成為了超越疫情的熱門詞條&#xff1b;而在AI的另一個分支——繪圖領域&#xff0c;一款名為Midjourney&#xff08;MJ&#xff…

電子電路:全面深入了解晶振的定義、作用及應用

本次了解重點: 1.壓電效應的數學描述 2.生產工藝以及關鍵工序 3.電路設計部分如負阻原理和匹配電容計算 4.失效案例比如冷啟動問題 5.新形態晶振技術引入5G和量子計算 6.溫補晶振的補償機制 7故障案例講解-更換負載電池或增加預熱電路 藍牙音頻斷續-頻偏導致 工控機死機-起振電…

【Java實用工具類】手擼SqlBuilder工具類,優雅拼接動態SQL,MyBatisPlus同款風格!

&#x1f4cc; 正文&#xff1a; 有時候我們項目底層是 JdbcTemplate 查詢&#xff0c;沒法像 MyBatisPlus 一樣用 Wrapper 拼接條件&#xff0c;但我們又不想手擼字符串。那怎么辦&#xff1f;我今天就給你整了個 SqlBuilder 工具類&#xff0c;支持 eq、ne、like、in、gt、l…

WEB3——開發者怎么查看自己的合約日志記錄

在區塊鏈中查看合約的日志信息&#xff08;也叫事件 logs&#xff09;&#xff0c;主要有以下幾種方式&#xff0c;具體方法依賴于你使用的區塊鏈平臺&#xff08;如 Ethereum、BSC、Polygon 等&#xff09;和工具&#xff08;如 Etherscan、web3.js、ethers.js、Hardhat 等&am…

Maven-生命周期

目錄 1.項目對象模型 2.依賴管理模型 3.倉庫&#xff1a;用于存儲資源&#xff0c;管理各種jar包 4.本地倉庫路徑 1.項目對象模型 2.依賴管理模型 3.倉庫&#xff1a;用于存儲資源&#xff0c;管理各種jar包 4.本地倉庫路徑

redis數據過期策略

redis數據過期策略有兩種方案 1.惰性刪除 2.定期刪除 首先說惰性刪除&#xff0c;對于已經過期的數據&#xff0c;訪問這個key的時候判斷key是否過期&#xff0c;如果過期則刪除&#xff0c;這種方式對cpu友好&#xff0c;只有使用key的時候才會進行過期檢查&#xff0c;用不到…

P1040 [NOIP 2003 提高組] 加分二叉樹

目錄 題目算法標簽: 區間 d p dp dp, 動態規劃, d f s dfs dfs思路代碼 題目 P1040 [NOIP 2003 提高組] 加分二叉樹 算法標簽: 區間 d p dp dp, 動態規劃, d f s dfs dfs 思路 給出的是一顆子樹的中序遍歷, s c o r e l r r o o t score l \times r root scorelrro…

uni-app學習筆記十七-css和scss的使用

SCSS 和 CSS的異同點 我們可以使用css和scss來設置樣式。其中SCSS&#xff08;Sassy CSS&#xff09;是 CSS 預處理器 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的一種語法格式&#xff0c;而 CSS&#xff08;Cascading Style Sheets&#xff09;是標準…

Spring Boot中Excel處理完全指南:從基礎到高級實踐

Excel處理基礎知識 1.1 為什么需要在應用中處理Excel文件&#xff1f; 在企業應用開發中&#xff0c;Excel文件處理是一個非常常見的需求&#xff0c;主要用于以下場景&#xff1a; 數據導入&#xff1a;允許用戶通過Excel上傳批量數據到系統 數據導出&#xff1a;將系統數據…

Python編程基礎(四) | if語句

引言&#xff1a;很久沒有寫 Python 了&#xff0c;有一點生疏。這是學習《Python 編程&#xff1a;從入門到實踐&#xff08;第3版&#xff09;》的課后練習記錄&#xff0c;主要目的是快速回顧基礎知識。 練習1&#xff1a;條件測試 編寫一系列條件測試&#xff0c;將每個條…

使用pandas實現合并具有共同列的兩個EXCEL表

表1&#xff1a; 表2&#xff1a; 表1和表2&#xff0c;有共同的列“名稱”&#xff0c;而且&#xff0c;表1的內容&#xff08;行數&#xff09;<表2的行數。 目的&#xff0c;根據“名稱”列的對應內容&#xff0c;將表2列中的“所處行業”填寫到表1相應的位置。 實現代…

ERP學習-AP

業務需要。持續更新學習進度 借助網上零搭建平臺上手實操 這個是簡道云平臺頁面鏈接&#xff0c;登錄的化去手機號登錄 目前開始對應付模塊進行學習