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

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

目前存在的游戏:

  • 植物大战僵尸:demos/pvz
  • 羊了个羊:demos/yang
  • 消消乐:demos/xiaoxiaole
  • 华容道:demos/huarongdao

PVZ功能展示可见:

羊了个羊:
在这里插入图片描述
在这里插入图片描述

消消乐:
在这里插入图片描述

华容道:

在这里插入图片描述


基于官方示例文档修改的,适用于4寸电容屏的小安派R1和R2,R1和R2的区别和修改如下:

小安派 - Eyes-R1 带外置 ES8388 音频芯片,支持两路音频输入输出。

小安派 - Eyes-R2 采用内置 CodeC,支持单路音频输入输出。

如果是编译带8388的开发板(AiPi-Eyes-R1)需要配置如下参数

  • 修改 app_main.h #define DEF_USER_ES8388_EN (1)

  • 修改proj.conf

  • set(CONFIG_SOLUTION_FUNC_AUDIO_AUADC 0)​ set(CONFIG_SOLUTION_FUNC_AUDIO_AUDAC 0)

如果是编译不带8388的开发板(AiPi-Eyes-R2)需要配置如下参数

  • 修改 app_main.h #define DEF_USER_ES8388_EN (0)

  • 修改 proj.conf

  • set(CONFIG_SOLUTION_FUNC_AUDIO_AUADC 1)​ set(CONFIG_SOLUTION_FUNC_AUDIO_AUDAC 1)

1.硬件说明

硬件仅用到了:

  • 小安派Rx
  • 4寸 480*480像素的电容屏
  • TTL下载器

在这里插入图片描述

2.软件说明

修改demos/lv_demos.h即可体验不同的游戏(一次只能设置一个游戏为1然后编译)

#define LV_USE_GAME_PVZ 0
// #define LV_USE_GAME_2048 0
#define LV_USE_GAME_YANG 1
#define LV_USE_GAME_XIAOXIAOLE 0
#define LV_USE_GAME_HUARONGDAO 0

main.c主程序说明如下:

  • lvgl任务线程函数
static void user_task(void *pvParameters)
{lv_task_handler();printf("[LVGL] init success \r\n");while (1) {lv_task_handler();bflb_mtimer_delay_ms(1);}
}
  • 初试化lvgl
/* lvgl init */
lv_init();
lv_port_disp_init();	//初试化显示屏
lv_port_indev_init();   //初试化触摸接口
  • 根据定义,设置不同的初试游戏函数(2048等待后续移植)
#if LV_USE_GAME_PVZpvz_start()
#endif#if LV_USE_GAME_2048// 2048_start();
#endif#if LV_USE_GAME_YANGyang_game();
#endif#if LV_USE_GAME_XIAOXIAOLExiaoxiaole();
#endif#if LV_USE_GAME_HUARONGDAOhuarongdao();
#endif

简单解析一下xiaoxiaole.c的游戏初试化程序,大部分都是lvgl库中的知识,文档可以见https://lvgl.100ask.net/master/index.html

void xiaoxiaole()
{// 根据屏幕尺寸来灵活设置图片的放大倍数// lv_disp_get_hor_res(lv_disp_get_default())获取默认显示屏的水平像素if(lv_disp_get_hor_res(lv_disp_get_default())>=lv_disp_get_ver_res(lv_disp_get_default())){screen_ratio=(float)lv_disp_get_ver_res(lv_disp_get_default())/400;}else{screen_ratio=(float)lv_disp_get_hor_res(lv_disp_get_default())/480;}// screen_ratio放大倍数// 移除屏幕滚动条lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE);screen1=lv_tileview_create(lv_scr_act());lv_obj_set_style_bg_color(screen1,lv_color_hex(0x000000), LV_PART_MAIN);lv_obj_clear_flag(screen1, LV_OBJ_FLAG_SCROLLABLE);//背景图片(如果很卡的话,把这个背景图片删掉)//bgmap=lv_img_create(screen1);lv_img_set_src(bgmap, &xiaoxiaole_bg_img);lv_img_set_pivot(bgmap,0,0);lv_img_set_zoom(bgmap,256*1.5*1.2);lv_obj_clear_flag(bgmap, LV_OBJ_FLAG_SCROLLABLE);/////注册消消乐滑块窗口的地方game_window=lv_tileview_create(screen1);lv_obj_set_style_bg_color(game_window,lv_color_hex(0x000000), LV_PART_MAIN);lv_obj_set_style_bg_opa(game_window,200, LV_PART_MAIN);lv_obj_clear_flag(game_window, LV_OBJ_FLAG_SCROLLABLE);lv_obj_set_style_outline_width(game_window, 6, LV_PART_MAIN);lv_obj_set_style_outline_color(game_window, lv_color_hex(0xbb7700), LV_PART_MAIN);lv_obj_center(game_window);lv_obj_set_size(game_window,280*screen_ratio,280*screen_ratio);// 定义刷新按钮refs_btn=lv_img_create(screen1);lv_img_set_src(refs_btn, &refs_btn_img);// lv_obj_set_align(refs_btn,LV_ALIGN_RIGHT_MID);lv_obj_align(refs_btn,LV_ALIGN_RIGHT_MID,8,0);lv_obj_add_flag(refs_btn, LV_OBJ_FLAG_CLICKABLE);lv_obj_add_event_cb(refs_btn,map_refs,LV_EVENT_CLICKED,0);lv_img_set_zoom(refs_btn, 150);// 定义退出按钮(退出按钮的事件函数还没有用到)exit_btn=lv_img_create(screen1);lv_img_set_src(exit_btn, &exit_img);lv_obj_align(exit_btn,LV_ALIGN_TOP_RIGHT,10,-20);// lv_obj_set_align(exit_btn,LV_ALIGN_TOP_RIGHT);lv_obj_add_flag(exit_btn, LV_OBJ_FLAG_CLICKABLE);lv_obj_add_event_cb(exit_btn,exit_game_cb,LV_EVENT_CLICKED,0);lv_img_set_zoom(exit_btn, 130);// 定义硬币图片coin=lv_img_create(screen1);lv_img_set_src(coin, &coin_img);lv_img_set_zoom(coin, 130);lv_obj_align(coin,LV_ALIGN_TOP_LEFT,10,-20);// 定义得分score=0;score_lable=lv_label_create(screen1);lv_label_set_text_fmt(score_lable,"SCORE:%d",score);lv_obj_set_style_text_font(score_lable,&lv_font_montserrat_20,0);lv_obj_set_y(score_lable,40);lv_obj_set_style_text_color(score_lable, lv_color_hex(0x00aaff), LV_PART_MAIN);game_init();
}static void	game_init()
{int i, j;lv_obj_refr_size(game_window);// 生成一个8*8的不同颜色的方块for(j=0;j<8;j++){for(i=0;i<8;i++){game_obj[j][i].x=i;game_obj[j][i].y=j;game_obj[j][i].alive=1;game_obj[j][i].color_index=rand()%7;game_obj[j][i].obj=lv_btn_create(game_window);lv_obj_set_pos(game_obj[j][i].obj,i*35*screen_ratio+1,j*35*screen_ratio+1);lv_obj_set_size(game_obj[j][i].obj,35*screen_ratio-2,35*screen_ratio-2);lv_obj_set_style_bg_color(game_obj[j][i].obj,lv_color_hex(color_lib[game_obj[j][i].color_index]),0);game_obj[j][i].obj->user_data=&game_obj[j][i];lv_obj_add_event_cb(game_obj[j][i].obj,move_obj_cb,LV_EVENT_PRESSING,0);lv_obj_add_event_cb(game_obj[j][i].obj,move_obj_cb,LV_EVENT_RELEASED,0);}}	// 每次方块填满都会进行检测,是否有可以消除的方块if(map_is_full()&&same_color_check()){same_color_flash();lv_obj_clear_flag(refs_btn, LV_OBJ_FLAG_CLICKABLE);}	
}

3. 编译烧录

环境搭建安装参考:小安派 R2 初体验 - 开箱 + 环境搭建 + 编译烧录

编译:make BL_SDK_BASE=E:/Aithinker_Ai/AiPi-Open-Kits/aithinker_Ai-M6X_SDK,BL_SDK_BASE 后面为自己的 aithinker_Ai-M6X_SDK 文件夹存储地址

烧录:make flash COMX=COM5 BL_SDK_BASE=E:/Aithinker_Ai/AiPi-Open-Kits/aithinker_Ai-M6X_SDK

注:

目前连接显示屏烧录的时候经常会失败,原因是TTL下载器供电不稳,因此有以下两种解决方式:

  • 不连接显示屏烧录
  • 连接显示屏,但需要连接TYPE-C供电,然后用TTL下载器烧录

这不得不吐槽一下,我看电路板还有挺大的空间的,为啥不将下载模块设计在上面呢?到时一根Typec连接电脑就能烧录了,难道是为了推广专用下载器吗,,,

4.后续计划

  • 移植更多的游戏

  • 看看能不能把背景音乐也添加上

源码:https://github.com/MGod-monkey/AiPi-Eyes-Rx

相关文章:

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏 目前存在的游戏&#xff1a; 植物大战僵尸&#xff1a;demos/pvz羊了个羊&#xff1a;demos/yang消消乐&#xff1a;demos/xiaoxiaole华容道&#xff1a;demos/huarongdao PVZ功能展示可见&#xff1a; 羊了个羊&#xff1a; 消消…...

Java List sort() 排序

sort是java.util.List接口的默认方法。 List的排序方法在Java 8中被引入。 排序方法接受比较器作为参数&#xff0c;并根据指定的比较器对这个列表进行排序。 default void sort(Comparator<? super E> c) 示例代码&#xff1a; import java.text.Collator; import …...

Vue.js 与 Flask 或 Django 后端配合

Vue.js 与 Flask 或 Django 后端配合是一种常见的全栈开发方式&#xff0c;用于构建动态且响应迅速的 Web 应用程序。Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架&#xff0c;而 Flask 和 Django 是 Python 语言的两个非常流行的 Web 框架。下面将分别介绍 Vue.js …...

抽奖拼团卷轴模式系统开发小程序源代码解析

在当今的互联网商业环境中&#xff0c;抽奖、拼团与卷轴模式等创新玩法被广泛应用于小程序开发中&#xff0c;旨在通过多样化的互动方式吸引用户参与&#xff0c;提升用户粘性和平台活跃度。本文将围绕“抽奖拼团卷轴模式系统开发小程序源代码”这一主题&#xff0c;探讨其技术…...

MySql语言操作数据库---增删改查数据库,表,数据

思维导图 SQL语言共分为四大类&#xff1a; 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----[库]、[表]、[视图]、[索引]、 数据操纵语言DML:(1) 插入&#xff1a;INSERT (2) 更新&#xff1a;UPDATE (3) 删除&#xff1a;DELETE 数据查询语言DQL:数据查询语…...

C++深入学习string类成员函数(2):容器管理

引言 C 标准库中的容器&#xff08;如 std::string、std::vector、std::list 等&#xff09;都提供了一系列容器管理成员函数&#xff0c;用于处理容器的大小、容量、清空等操作。容器管理成员函数可以分为几类&#xff0c;主要包括容量查询、修改容器大小、清空容器等操作。 …...

MariaDB 和 MySQL 全面对比:选择数据库需要考虑这几点

谁在使用 MySQL 和 MariaDB&#xff1f; MySQL 和 MariaDB 都发布了各自的用户名单。 使用 MySQL 的有 Facebook、Github、YouTube、Twitter、PayPal、诺基亚、Spotify、Netflix 等。 使用 MariaDB 的有 Redhat、DBS、Suse、Ubuntu、1&#xff06;1、Ingenico 等。 功能比较…...

Python 实现图形学几何变换算法

目录 Python 实现图形学几何变换算法几何变换介绍变换矩阵Python 实现几何变换代码解释总结 Python 实现图形学几何变换算法 在计算机图形学中&#xff0c;几何变换是非常重要的概念。它们允许我们对对象的位置、大小、方向进行操作&#xff0c;比如平移、缩放、旋转、反射等。…...

接口测试|超详细面试题【附答案】

今天给姐妹们整理了一套超详细的附答案的接口测试面试题&#xff0c;姐妹们快学起来吧~ 接口测试的重要性&#xff0c;相信不用我多说了。接口测试是现在软件测试工程师一个加分项。因为很多朋友一开始做了几年的软件测试都是在做功能测试&#xff0c;做界面UI的测试&#xff…...

Qt网络编程——QTcpServer和QTcpSocket

文章目录 核心APITCP回显服务器TCP回显客户端 核心API QTcpServer用于监听端口和获取客户端连接 名称类型说明对标原生APIlisten(const QHostAddress&, quint16 port)方法绑定指定的地址和端口号&#xff0c;并开始监听bind和listennextPendingConnection()方法从系统中获…...

CentOS 7 aarch64制作openssh 9.9p1 rpm包 —— 筑梦之路

本篇文章还是基于开源项目openssh-rpms制作。 https://github.com/boypt/openssh-rpms.git 官方发行说明&#xff1a; OpenSSH: Release Notes 1. 修改version.env 2. 下载源码包 openssl网站改版&#xff0c;下载地址和之前不一样了 # 下载openssl1.1.1w源码包cd downlo…...

Flink和Spark的区别

1、设计理念不同 flink&#xff1a;Flink是基于事件驱动的&#xff0c;是面向流的处理框架, Flink基于每个事件一行一行地流式处理&#xff0c;是真正的流式计算. 另外他也可以基于流来模拟批进行计算实现批处理。 spark&#xff1a;Spark的技术理念是使用微批来模拟流的计算,…...

以太网开发基础-MAC和PHY

直接参考&#xff1a; 以太网基础-MAC和PHY-CSDN博客 路由器上一般有三类MAC地址 给一个范例: 00:0C:E5:4B:F2:85 这个地址就可以作为LAN MAC地址 00:0C:E5:4B:F2:86 这个地址就可以作为WAN MAC地址 00:0C:E5:4B:F2:87 这个地址就可以作为无线 MAC地址 通常&#xff0c;路由器…...

Java 发布jar包到maven中央仓库(2024年9月保姆级教程)

文章目录 前言一、账号准备1. 注册登录账号2. 新建命名空间3. 验证命名空间4. 生成令牌5. 为 maven 设置令牌二、GPG准备1. 下载GPG2. 发布证书2.1 新建证书2.2 发布证书到服务器2.3 验证发布三、发布jar包到中央仓库1. 编辑项目pom文件2. 打包上传3. 发布jar包4. 搜索我们的ja…...

Pandas和Seaborn可视化详解

1.Pandas绘图-单变量 概述 pandas库是Python数据分析的核心库 它不仅可以加载和转换数据&#xff0c;还可以做更多的事情&#xff1a;它还可以可视化 pandas绘图API简单易用&#xff0c;是pandas流行的重要原因之一 可视化小技巧: 如果是类别型 柱状 饼图 (类别相对较少 5-…...

【Python】Windows下安装使用FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。之前为了MP3转wav&#xff0c;需要pip安装并import AudioSegment&#xff0c;但是会报错&#xff1a;FileNotFoundError: [WinError 2] 系统找不到指定的文件。 因为FFmpeg需要另…...

LLM - 使用 XTuner 指令微调 多模态大语言模型(InternVL2) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142528967 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 XTuner…...

【Python】数据可视化之热力图

热力图&#xff08;Heatmap&#xff09;是一种通过颜色深浅来展示数据分布、密度和强度等信息的可视化图表。它通过对色块着色来反映数据特征&#xff0c;使用户能够直观地理解数据模式&#xff0c;发现规律&#xff0c;并作出决策。 目录 基本原理 sns.heatmap 代码实现 基…...

个人博客系统测试(selenium)

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …...

【速成Redis】01 Redis简介及windows上如何安装redis

前言&#xff1a; 适用于&#xff1a;需要快速掌握redis技能的人&#xff08;比如我&#xff09;&#xff0c;在b站&#xff0c;找了个课看。 01.课程简介_哔哩哔哩_bilibili01.课程简介是【GeekHour】一小时Redis教程的第1集视频&#xff0c;该合集共计19集&#xff0c;视频…...

【生产环境禁用警告】:这6个Python内存反模式正悄悄拖垮你的K8s Pod——附自动检测脚本

第一章&#xff1a;Python智能体内存管理策略生产环境部署在高并发、长生命周期的Python智能体服务中&#xff0c;内存管理直接影响系统稳定性与响应延迟。默认的CPython引用计数循环垃圾回收&#xff08;GC&#xff09;机制在动态对象频繁创建销毁的场景下易引发内存抖动和不可…...

从零到一:LRFormer (TPAMI 2025) 实战部署与避坑指南

1. 为什么选择LRFormer&#xff1f; 最近在复现TPAMI 2025上的LRFormer模型时&#xff0c;我发现这个基于局部-全局关系建模的视觉Transformer确实有不少亮点。相比传统CNN模型&#xff0c;它在处理长距离依赖关系时表现更出色&#xff0c;特别是在细粒度图像分类任务上&#x…...

原神高帧率解锁终极方案:一键突破60帧限制的完全指南

原神高帧率解锁终极方案&#xff1a;一键突破60帧限制的完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想象一下这样的场景&#xff1a;你在蒙德的原野上自由奔跑&#xff0c;角…...

Qt QTabWidget标签页文字方向调校实战:当标签在左侧时,如何让文字乖乖水平显示?

Qt QTabWidget标签页文字方向调校实战&#xff1a;当标签在左侧时&#xff0c;如何让文字乖乖水平显示&#xff1f; 在桌面应用开发中&#xff0c;Qt框架的QTabWidget组件因其灵活性和易用性广受开发者青睐。但当我们尝试将标签页位置调整为左侧时&#xff0c;一个令人头疼的问…...

Agent上线后有专人运营支持吗?深度解析AI Agent的全生命周期运维保障体系

随着AI Agent&#xff08;智能体&#xff09;在企业业务场景中的深度渗透&#xff0c;从简单的流程自动化到复杂的跨境贸易、研发辅助&#xff0c;企业对“数字员工”的期待已不再局限于单次的开发交付&#xff0c;而是转向了长期的稳定运行与持续进化。对于许多决策者而言&…...

千问3.5-2B效果对比评测:与Qwen-VL-Chat基础版在OCR精度和响应速度上的实测差异

千问3.5-2B效果对比评测&#xff1a;与Qwen-VL-Chat基础版在OCR精度和响应速度上的实测差异 1. 评测背景与模型介绍 视觉语言模型正在改变我们与图像交互的方式。作为Qwen系列的最新成员&#xff0c;千问3.5-2B以其轻量级架构和高效性能引起了广泛关注。本次评测将聚焦于两个…...

为什么92%的团队在MCP项目中期被迫重构?Python 4大模板的抽象泄漏、协议耦合与测试盲区深度拆解

第一章&#xff1a;MCP服务器开发模板的行业现状与重构困局当前&#xff0c;MCP&#xff08;Model Control Protocol&#xff09;服务器作为AI智能体协同调度与协议网关的核心组件&#xff0c;在金融风控、工业边缘控制、多模态Agent编排等场景中加速落地。然而&#xff0c;主流…...

如何在旧款Mac上安装最新macOS:OpenCore Legacy Patcher完整指南

如何在旧款Mac上安装最新macOS&#xff1a;OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方停止支持的老旧Ma…...

【NX二次开发】cam对象类型

//此函数的功能是打印当前坐标系试图的所有坐标系名称 static void geom_list_name(tag_t group_tag) { //ask_member_list int count=0; tag_t *list=NULL; //ask_name char name[UF_OBJ_NAME_LEN+1]; //ask_type_and_subtype int type=0; in…...

Qwen3-4B-Thinking开源镜像教程:Chainlit前端对接企业微信机器人

Qwen3-4B-Thinking开源镜像教程&#xff1a;Chainlit前端对接企业微信机器人 1. 引言&#xff1a;当大模型遇到企业级应用 想象一下这个场景&#xff1a;你刚部署好一个强大的AI模型&#xff0c;它能帮你写代码、分析问题、生成文档。但每次使用&#xff0c;你都得打开一个特…...