基于小安派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_PVZ
    pvz_start()
#endif

#if LV_USE_GAME_2048
    // 2048_start();
#endif

#if LV_USE_GAME_YANG
    yang_game();
#endif

#if LV_USE_GAME_XIAOXIAOLE
    xiaoxiaole();
#endif

#if LV_USE_GAME_HUARONGDAO
    huarongdao();
#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开闭原则(OCP)

开闭原则&#xff08;OCP&#xff09;&#xff1a;Open Closed Princide&#xff1a;对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有代码&#xff0c;实现一个热插拔的效果。 简言之&#xff0c;是为了使程序的扩展性更好&#xff0c;…

【STM32】 TCP/IP通信协议(1)

一、前言 TCP/IP是干啥的&#xff1f;它跟SPI、IIC、CAN有什么区别&#xff1f;它如何实现stm32的通讯&#xff1f;如何去配置&#xff1f;为了搞懂这些问题&#xff0c;查询资料可解决如下疑问&#xff1a; 1.为什么要用以太网通信? 以太网(Ethernet) 是指遵守 IEEE 802.3 …

【React】组件基础使用

1. react组件 在react中&#xff0c;组件就是首字母大写的函数&#xff0c;内部存放了组件的逻辑、UI&#xff0c;渲染组件只需要把组件当成标签书写。 使用组件有两种方式&#xff1a;自闭和 、成对标签 function App() {// 定义组件function Component() {return <div&…

快手一面:给定一棵二叉树,要求将其转换为其镜像?

目录标题 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09;问题描述示例解题思路代码实现详细分析复杂度分析优点注意事项&#x1f495; 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09; 问题描述 给定一棵二叉树&#xff…

Elasticsearch——介绍、安装与初步使用

目录 1.初识 Elasticsearch1.1.了解 ES1.1.1.Elasticsearch 的作用1.1.2.ELK技术栈1.1.3.Elasticsearch 和 Lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3.Elasticsearch 的一些概念1.3.1.文档和字…

MISC - 第二天(wireshark,base64解密图片,zip文件伪加密,LSB二进制最低位,ARCHPR工具)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解杂项 乌镇峰会种图 使用了stegsolve工具&#xff0c;查看更多信息 发现flag信息 更改为html后缀flag{97314e7864a8f62627b26f3f998c37f1} wireshark 看题目是 分析pacp数据包&#xff0c;通过网站登录…

kubernetes K8S 结合 Istio 实现流量治理

目录 1.Istio介绍&#xff1f; 1.1 Istio是什么&#xff1f; 1.2 Istio流量管理 1.2.1 熔断 1.2.2 超时 1.2.3 重试 2.Istio架构 3.istio组件详解 3.1 Pilot 3.2 Envoy 3.3 Citadel 3.4 Galley 3.5 Ingressgateway 3.5 egressgateway 扩展、k8s1.23及1.23以下版…

每日算法2(翻转链表)

链接. - 力扣&#xff08;LeetCode&#xff09; 第一种 先来讲下最简单的算法&#xff0c;创建一个新链表&#xff0c;将原链表的元素挨个头插到新链表上&#xff0c;就实现了顺序表的逆转&#xff0c;这里就不示例代码了&#xff0c;在之前的链表有提及。 第二种 可以试试…

初写MySQL四张表:(4/4)

进度条很喜人&#xff0c;你是否已经修炼到这一步了呢&#xff1f; 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)_数据库表样例-CSDN博客 初写MySQL四张表:(3/4)-CSDN博客 若现在你已经有了前面的基础&#xff0c;那就正式开始吧。 四张表&#xff1a; 这次在实现…

JavaWeb美食推荐管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

从理论到实践:解锁《数字化专业知识体系》助力企业数字化转型的落地之道

全面解码数字化转型——从理论构想到实践落地 在全球数字化浪潮的推动下&#xff0c;企业正面临前所未有的变革压力。虽然数字化转型的概念已经深入人心&#xff0c;但将其从战略蓝图转化为实际成果的过程仍充满挑战。《数字化专业知识体系》&#xff08;《Towards a Digital …

鸿蒙操作系统(HarmonyOS)生态与机遇

HarmonyOS技术特点 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司开发的一款面向全场景的分布式操作系统。 架构特点&#xff1a; 分布式架构&#xff1a;这是鸿蒙系统的显著特点之一。它支持跨设备无缝协同体验&#xff0c;使不同设备能够快速连接、能力互助和资…

认知战认知作战:认知战目标对手分析,你需要知道的目标对手分析SOP

认知战认知作战&#xff1a;认知战目标对手分析&#xff0c;你需要知道的目标对手分析SOP 认知战认知作战&#xff1a;认知战目标对手分析你需要知道的目标对手分析SOP 关键词&#xff1a;认知战, 目标对手分析, 数据情报搜集, 自我审视, 洞悉对手, 精准攻击策略, 行动规划, …

基于等保浅谈服务器端和客户端的身份鉴别双向验证

等保云计算扩展要求 身份鉴别:当远程管理云计算平台中设备时&#xff0c;管理终端和云计算平台之间应建立双向身份验证机制。 单项认证和双向认证介绍 单向认证一般是指客户端确认服务端身份&#xff0c;而双向认证一般是指客户端和服务器端都需要验证对方的身份。双向认证的…

记录-java web 生成并下载zip文件

java生成zip文件&#xff0c;zip文件分两种&#xff1a;一种是包含文件夹、一种是不包含文件夹 生成zip文件的方式 ZipOutputStream zipOutputStream new ZipOutputStream(response.getOutputStream());// 文件夹名称String folder "download/";ZipEntry ze new Z…

怎样将latex文档转为word文档?

通常我们使用latex撰写论文&#xff0c;但有时也需要转为word文档方便其它人使用。转换过程中需要处理的内容包括3个部分&#xff1a;文字、图片、公式以及表格。 最简单的转换方式&#xff1a;latex编译成pdf文档&#xff0c;使用wps转换为word格式即可。这样转换的文档&…

你以为建站很复杂?Baklib 5分钟解决你的痛点

你以为建站很复杂&#xff1f;Baklib 5分钟解决你的痛点&#xff01; 在这个“快节奏”的互联网时代&#xff0c;想要快速搭建一个网站是很多人的刚需。今天我要介绍的&#xff0c;就是如何利用Baklib的CMS/Wiki模板&#xff0c;五分钟内让你的网站“横空出世”。废话不多说&am…

双token无感刷新(vue3+node.js)

无感刷新的基本原理 使用刷新令牌&#xff08;refresh token&#xff09;&#xff1a; ○ 应用程序在首次登录成功后会获得一个访问令牌&#xff08;access token&#xff09;和一个刷新令牌&#xff08;refresh token&#xff09;。 ○ 访问令牌通常有较短的有效期&#xff0…

音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

前端文件上传全过程

特别说明&#xff1a;ui框架使用的是蚂蚁的antd 这里主要是学习前端上传接口的传递参数包括前端上传之前对于代码的整理 一、第一步将前端页面画出来 源代码&#xff1a; /** 费用管理 - IT费用管理 - 费用数据上传 */ import { useState } from "react"; import {…