当前位置: 首页 > article >正文

零知开源——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. 初始化设置 
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平台。
零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧! 

相关文章:

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

简介 本教程使用STM32F407VET6零知增强板驱动3.5寸TFT触摸屏实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃&#xff0c;躲避障碍物柱体&#xff0c;挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。 目录 简介 一、硬件准备 二、软件架构 三、…...

[SC]SystemC在CPU和GPU等复杂SoC验证中的应用

SystemC在CPU和GPU等复杂SoC验证中的应用 摘要:SystemC 是一种基于 C++ 的硬件描述和仿真语言,广泛用于系统级设计和验证,特别是在 CPU 和 GPU 等复杂 SoC (System on Chip) 的验证工作中。通过 SystemC,你可以构建硬件模块、定义时序行为、进行系统级仿真,并与 UV…...

鸿蒙OSUniApp导航栏组件开发:打造清新简约的用户界面#三方框架 #Uniapp

UniApp 开发实战&#xff1a;打造符合鸿蒙设计风格的日历活动安排组件 在移动应用开发中&#xff0c;日历和活动安排是非常常见的需求。本文将详细介绍如何使用 UniApp 框架开发一个优雅的日历活动安排组件&#xff0c;并融入鸿蒙系统的设计理念&#xff0c;实现一个既美观又实…...

力扣HOT100之动态规划:300. 最长递增子序列

这道题之前刷代码随想录的时候也刷过&#xff0c;现在又给忘完了。自己尝试着写了一下&#xff0c;发现怎么写都写不对&#xff0c;直接去看视频了。。我自己写的时候的定义是&#xff1a;考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度&#xff0c;后面发现在写递推…...

EEPROM库详解

EEPROM EEPROM 地址空间&#xff1a; 每个字节有唯一地址&#xff08;从 0 开始&#xff09;&#xff0c;例如 ATmega328P 的地址范围是 0~1023&#xff08;共 1KB&#xff09;。不同型号的 Arduino 板 EEPROM 大小不同&#xff08;如 Mega2560 为 4KB&#xff0c;地址 0~409…...

JDK21深度解密 Day 10:微服务架构适配JDK21

【JDK21深度解密 Day 10】微服务架构适配JDK21 引言:百万并发时代的微服务进化 作为"JDK21深度解密"系列的第10天,今天我们聚焦微服务架构在JDK21时代的技术跃迁。Java语言历史上最大的一次并发模型革新——虚拟线程(Virtual Threads),正在重塑微服务架构的底…...

Java并发编程实战 Day 2:线程安全与synchronized关键字

【Java并发编程实战 Day 2】线程安全与synchronized关键字 开篇 欢迎来到《Java并发编程实战》系列的第二天&#xff01;在第一天中&#xff0c;我们学习了Java并发编程的基础知识以及线程模型的核心概念。今天我们将继续深入探讨并发编程中的关键问题——线程安全&#xff0…...

在win10/11下Node.js安装配置教程

下载安装 官网链接https://nodejs.org/zh-cn 下载好以后双击打开&#xff0c;点击下一步 勾选&#xff0c;然后下一步 选择路径、下一步 下一步 配置环境 找到我们安装的文件夹&#xff0c;创建两个文件夹 node_global node_cache 在CMD中配置路径 npm config set p…...

飞致云开源社区月度动态报告(2025年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

压缩包方式在Linux和Windows下安装mongodb

目录 安装流程安装实例1. Linux安装2. Windows安装 总结 安装流程 zip方式安装 优点&#xff1a;自定义性较高&#xff0c;可以自己控制数据、日志等文件的位置 1、下载安装包 2、解压安装包 3、创建各类文件路径 4、配置conf文件 5、使用自定义配置文件启动 安装实例 1. Li…...

智慧场馆:科技赋能的艺术盛宴

智慧场馆作为城市公共服务设施数字化转型的典型代表&#xff0c;通过深度融合新一代信息技术&#xff0c;构建起全方位、智能化的运营管理体系。其功能架构不仅提升了场馆本身的运营效能&#xff0c;更重塑了公共服务体验模式&#xff0c;展现出显著的社会价值和商业潜力。 一…...

flutter常用动画

Flutter 动画基础概念 术语解释Animation表示动画的值&#xff0c;通常是一个 double (0.0 ~ 1.0) 或其他数值。AnimationController管理动画的时间进度和状态。需要 Ticker (vsync) 来驱动。Tween定义动画的取值范围&#xff0c;如从 0.0 到 1.0&#xff0c;从红色到蓝色。Cu…...

Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速

Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 作者将狼才鲸创建日期2025-05-30 CSDN阅读地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 本文档源码地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机…...

《ChatGPT o3抗命:AI失控警钟还是成长阵痛?》

ChatGPT o3 “抗命” 事件起底 在人工智能的飞速发展进程中&#xff0c;OpenAI 于 2025 年推出的 ChatGPT o3 推理模型&#xff0c;犹如一颗重磅炸弹投入了技术的海洋&#xff0c;激起千层浪。它被视为 “推理模型” 系列的巅峰之作&#xff0c;承载着赋予 ChatGPT 更强大问题解…...

题目 3293: 蓝桥杯2024年第十五届决赛真题-数位翻转

题目 3293: 蓝桥杯2024年第十五届决赛真题-数位翻转 时间限制: 2s 内存限制: 192MB 提交: 1046 解决: 318 题目描述 小明创造了一个函数 f(x) 用来翻转 x 的二进制的数位&#xff08;无前导 0&#xff09;。比如f(11) 13&#xff0c;因为 11 (1011)2&#xff0c;将其左右翻转…...

Reactor 和 Preactor

Reactor 和 Preactor 是两个在工业控制、生产调度和事件驱动系统中非常重要的设计模式或框架&#xff0c;不少人会用这两个名词来描述不同的编程思想或技术架构。 一、Reactor 模式&#xff08;反应器模式&#xff09; 1. 概述 Reactor 模式其实是一种I/O事件通知的设计思想…...

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…...

论爱情《态度》

我犹记得&#xff0c;当吴军的《态度》到手之后&#xff0c;从中间翻开的第一页&#xff0c;便是此。 “合适的人&#xff0c;会让你看到&#xff0c;和得到全世界” -- 第22封 其实在我初中、高中的时候&#xff0c;我便产生一个问题&#xff0c;为什么学校要禁止谈恋爱。 …...

多台电脑共用一个ip地址可以吗?会怎么样

在互联网使用日益普及的今天&#xff0c;许多人都面临着多台设备共享网络的需求。一个常见的问题随之而来&#xff1a;多台电脑共用一个IP地址可以吗&#xff1f;这样做会带来哪些影响&#xff1f;本文将深入探讨这一话题。 一、多台电脑共用一个‌IP地址可以吗&#xff1f; 多…...

线程(上)【Linux操作系统】

文章目录 线程概念及其相关知识线程的概念及一些重要认识重要认识Linux中线程的实现Linux中的被调度的执行流是被task_struct描述的 线程是如何瓜分进程的代码和数据的&#xff1f;对于数据&#xff1a;对于代码&#xff1a; 线程的优点线程的缺点线程调度细节调度&#xff1a;…...

FPGA中的“BPI“指什么

在FPGA&#xff08;现场可编程门阵列&#xff09;中&#xff0c;BPI 的全称是 “Byte Peripheral Interface” 或 “Bank Parallel Interface”&#xff0c;具体指一种 并行NOR闪存配置接口&#xff0c;主要用于FPGA的配置&#xff08;Configuration&#xff09;过程。以下是BP…...

Splunk Validated Architecture (SVA):构建企业级可观测性与安全的基石

Splunk Validated Architecture (SVA) 是 Splunk 官方提供的一套经过严格测试、性能验证和最佳实践指导的参考架构蓝图。它并非单一固定方案&#xff0c;而是根据企业数据规模、性能需求、高可用性目标和合规要求&#xff0c;提供一系列可落地的部署模型。SVA 的核心价值在于为…...

Python爬虫(40)基于Selenium与ScrapyRT构建高并发动态网页爬虫架构:原理、实现与性能优化

目录 一、引言二、技术背景1. 动态页面处理痛点2. 架构设计目标 三、核心组件详解1. Selenium Grid集群部署2. ScrapyRT服务化改造3. 智能等待策略 四、系统架构图五、性能优化实践1. 资源隔离策略2. 并发控制算法3. 监控体系 六、总结与展望&#x1f308;Python爬虫相关文章&a…...

深入解析 Python 字典:从基础到高级应用

文章大纲 引言:什么是字典? 在 Python 编程中,字典(Dictionary)是一种极其重要的数据结构,它以键值对(key-value pair)的形式存储数据,能够高效地进行数据的查找和操作。相比于列表(List)这种依赖整数索引的序列类型,字典通过自定义的键来访问对应的值,提供了更…...

进程同步:生产者-消费者 题目

正确答案&#xff1a; 问题类型&#xff1a; 经典生产者 - 消费者问题 同时涉及同步和互斥。 同步&#xff1a;生产者与消费者通过信号量协调生产 / 消费节奏&#xff08;如缓冲区满时生产者等待&#xff0c;空时消费者等待&#xff09;。互斥&#xff1a;对共享缓冲区的访问需…...

Linux轻量级文件传输——tftp命令

摘要 TFTP是基于UDP/69端口的轻量文件传输协议。本文整理tftp命令参数/交互命令&#xff0c;提供示例&#xff0c;涵盖文件上传下载、模式设置等核心操作&#xff0c;帮助快速掌握基础文件传输。 一、TFTP核心特性 tftp&#xff08;Trivial File Transfer Protocol&#xff0…...

JavaSwing之--为组件添加背景

JavaSwing之–为组件添加背景 从实践角度&#xff0c;可以把Java Swing中的组件分为容器组件和普通组件&#xff0c;容器组件是为了更好的按照某种布局摆放各种组件&#xff0c;形成功能强大且友好的界面。 Swing中组件的背景可以分为两种类型&#xff0c;一种是背景色&#…...

MySQL项目实战演练:搭建用户管理系统的完整数据库结构【MySQL系列】

本项目适用于后台管理系统、电商用户中心、SaaS 用户模块等场景&#xff0c;特别适合开发者进行实战演练与面试准备。 一、项目背景与需求概述 我们将构建一个基础版的用户管理系统&#xff0c;具备以下业务功能&#xff1a; 用户注册与登录用户角色与权限分配日志记录与用户…...

展会聚焦丨漫途科技亮相2025西北水务博览会!

2025第三届西北水务数字化发展论坛暨供排水节水灌溉新技术设备博览会在兰州甘肃国际会展中心圆满落幕。本届展会以“科技赋能水资源&#xff0c;数智引领新动能”为主题&#xff0c;活动汇集水务集团、科研院所、技术供应商等全产业链参与者&#xff0c;旨在通过前沿技术展示与…...

【数据结构初阶】顺序表的应用

文章目录 顺序表的应用基于动态顺序表实现通讯录前言1.定义联系人数据2.给顺序表改名3.通讯录的初始化4.通讯录的销毁5.通讯录添加数据6.通讯录删除数据7.通讯录修改数据8.通讯录查找数据9.展示通讯录数据10.通讯录的最终实现 顺序表的应用 基于动态顺序表实现通讯录 前言 功…...