零知开源——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 = tick²(下落速度随时间平方增加)

触摸时赋予上升速度: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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;登录的化去手机号登录 目前开始对应付模块进行学习