嵌入式系统应用-LVGL的应用-平衡球游戏 part1
平衡球游戏 part1
- 1 平衡球游戏的界面设计
- 2 界面设计
- 2.1 背景设计
- 2.2 球的设计
- 2.3 移动球的坐标
- 2.4 用鼠标移动这个球
- 2.5 增加边框规则
- 2.6 效果图
- 2.7 游戏失败重启游戏
- 3 为小球增加增加动画效果
- 3.1 增加移动效果代码
- 3.2 具体效果图片
平衡球游戏 part2 第二部分文章在这里
1 平衡球游戏的界面设计
我们将开发一种界面平衡球的游戏, 这个游戏视频链接。
这个游戏界面相对比较简单,这里会的做的比较复杂一点。

2 界面设计
2.1 背景设计
创建一个蓝色的背景, 绘制这个界面。
// 创建窗口
if (main_screen == NULL)
{// 创建窗口main_screen = lv_scr_act();// 背景色是蓝色lv_obj_set_style_bg_color(main_screen, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);lv_scr_load(main_screen);
}
2.2 球的设计
绘制这个球, 选择黄色的球。
lv_obj_t * create_circle(lv_obj_t* parent) {// 创建一个基本对象,作为圆的容器lv_obj_t* circle = lv_obj_create(parent);// 设置对象的大小,确保宽高相等lv_obj_set_size(circle, 50, 50);// 创建一个样式static lv_style_t style;lv_style_init(&style);// 设置样式的背景颜色lv_style_set_bg_color(&style, lv_palette_main(LV_PALETTE_YELLOW));// 设置样式的边框圆角半径为最大值,以形成一个圆lv_style_set_radius(&style, LV_RADIUS_CIRCLE);// 将样式应用到对象lv_obj_add_style(circle, &style, 0);return circle;
}
2.3 移动球的坐标
// 移动球的函数
void move_circle(lv_obj_t* circle, int16_t x, int16_t y) {// 设置圆的新位置lv_obj_set_pos(circle, x, y);
}
2.4 用鼠标移动这个球
2.4.1 为主界面增加一个鼠标的动作相应
lv_obj_add_event_cb(main_screen, mouse_event_handler, LV_EVENT_ALL, NULL);
2.4.2 创建鼠标相应绘制具体的动作
// 鼠标移动函数
void mouse_event_handler(lv_event_t* e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t* obj = lv_event_get_target(e);switch (code) {case LV_EVENT_PRESSED:printf("Mouse button pressed!\n");// 获取指针的坐标lv_point_t p;lv_indev_get_point(lv_indev_get_act(), &p);printf("x is %d, y is %d\r\n", p.x, p.y);// 新的位置,减去半径以确保中心点在指针位置int16_t new_x = p.x - BALL_SIZE / 2;int16_t new_y = p.y - BALL_SIZE / 2;// 检查是否超出屏幕边界if (new_x < 0 || new_y < 0 || (new_x + BALL_SIZE) > lv_disp_get_hor_res(NULL) || (new_y + BALL_SIZE) > lv_disp_get_ver_res(NULL)) {show_failure_dialog();}else {move_circle(ball, new_x, new_y);}break;default:break;}
}
2.5 增加边框规则
检测边界的范围
if (new_x < 0 || new_y < 0 || (new_x + BALL_SIZE) > lv_disp_get_hor_res(NULL) || (new_y + BALL_SIZE) > lv_disp_get_ver_res(NULL)) {show_failure_dialog();}
失败,弹出对话框
设置 Message Box 颜色的步骤
-
创建消息框:
使用 lv_msgbox_create 函数创建消息框。 -
定义样式:
使用 lv_style_t 定义并初始化样式。你可以为消息框的不同部分创建不同的样式,例如背景、文本和按钮。 -
应用样式:
使用 lv_obj_add_style 函数将样式应用到消息框或其组件上。
void show_failure_dialog() {lv_obj_t* mbox = lv_msgbox_create(NULL, "Game Over", "You hit the boundary!", NULL, true);// 定义背景样式static lv_style_t style_bg;lv_style_init(&style_bg);lv_style_set_bg_color(&style_bg, lv_palette_main(LV_PALETTE_NONE)); // 深黑色背景lv_style_set_bg_opa(&style_bg, LV_OPA_COVER);lv_style_set_border_color(&style_bg, lv_palette_main(LV_PALETTE_GREEN)); // 绿色边框lv_style_set_border_width(&style_bg, 2);// 定义文本样式static lv_style_t style_text;lv_style_init(&style_text);lv_style_set_text_color(&style_text, lv_palette_main(LV_PALETTE_RED)); // 红色文本// 应用样式到消息框lv_obj_add_style(mbox, &style_bg, 0); // 应用背景样式lv_obj_add_style(lv_msgbox_get_title(mbox), &style_text, 0); // 应用标题文本样式lv_obj_add_style(lv_msgbox_get_text(mbox), &style_text, 0); // 应用消息文本样式// 设置消息框位置到中心lv_obj_center(mbox);
}
2.6 效果图
移动小球,没有动画
2.7 游戏失败重启游戏
为这个对话框添加一个回调函数,关闭对话框的时候,让小球回到起始位置。
// 对话框回调函数
static void mbox_event_cb(lv_event_t* e)
{lv_event_code_t code = lv_event_get_code(e); if (code == LV_EVENT_DELETE) {move_circle(ball, 100, 100); // 回到初始值的位置}}
在创建对话框函数里面,添加下面的语句:关联回调函数。
lv_obj_add_event_cb(mbox, mbox_event_cb, LV_EVENT_DELETE, NULL);
3 为小球增加增加动画效果
3.1 增加移动效果代码
lv_anim_t 是 LVGL 中用于定义和管理动画的结构体。它提供了一套功能强大的 API,用于在 LVGL 对象上实现各种动画效果。以下是 lv_anim_t 及相关函数的说明:
lv_anim_t 结构体
lv_anim_t 是一个用于描述动画的结构体,其中包含了动画的各种参数和设置。
常用函数
- 初始化和基本设置
lv_anim_init(lv_anim_t * a):
初始化动画对象 a,并将其字段设置为默认值。
lv_anim_set_var(lv_anim_t * a, void * var):
设置动画作用的对象或变量,通常是一个 LVGL 对象。
lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb):
设置动画的执行回调函数,用于定义如何改变对象的属性,例如位置、尺寸、透明度等。
lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end):
设置动画的起始值和结束值,定义属性从 start 到 end 的变化。
- 时间管理
lv_anim_set_time(lv_anim_t * a, uint32_t duration):
设置动画的持续时间(毫秒)。
lv_anim_set_delay(lv_anim_t * a, uint32_t delay):
设置动画开始前的延迟时间(毫秒)。
- 动画效果控制
lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb):
设置动画路径回调函数,用于定义动画的过渡效果(如线性、缓入缓出等)。
lv_anim_path_linear:
一种简单的线性过渡效果。
lv_anim_path_ease_in, lv_anim_path_ease_out:
类似于缓入和缓出的效果,用于更自然的动画过渡。
- 事件和重复
lv_anim_set_repeat_count(lv_anim_t * a, uint16_t repeat_count):
设置动画重复的次数,0 表示无限次。
lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t repeat_delay):
设置动画重复前的延迟时间。
lv_anim_set_playback_time(lv_anim_t * a, uint32_t playback_time):
设置动画回放时间(从结束到开始)。
lv_anim_set_playback_delay(lv_anim_t * a, uint32_t playback_delay):
设置动画回放前的延迟时间。
lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb):
设置动画完成时的回调函数。
- 启动动画
lv_anim_start(lv_anim_t * a):
启动已经配置好的动画。
void move_circle(lv_obj_t* circle, int16_t x, int16_t y)
{// 设置动画lv_anim_t a;lv_anim_init(&a);lv_anim_set_var(&a, circle);lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);lv_anim_set_values(&a, lv_obj_get_x(circle), x);lv_anim_set_time(&a, 500); // 动画持续时间//lv_anim_set_ready_cb(&a, anim_ready_cb); // 动画结束时的回调lv_anim_start(&a);lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y);lv_anim_set_values(&a, lv_obj_get_y(circle), y);// 动画过渡lv_anim_set_path_cb(&a, lv_anim_path_ease_in);lv_anim_set_path_cb(&a, lv_anim_path_ease_out);lv_anim_start(&a);/* lv_obj_set_pos(circle, new_x, new_y);*/}
3.2 具体效果图片
移动小球带动画
相关文章:
嵌入式系统应用-LVGL的应用-平衡球游戏 part1
平衡球游戏 part1 1 平衡球游戏的界面设计2 界面设计2.1 背景设计2.2 球的设计2.3 移动球的坐标2.4 用鼠标移动这个球2.5 增加边框规则2.6 效果图2.7 游戏失败重启游戏 3 为小球增加增加动画效果3.1 增加移动效果代码3.2 具体效果图片 平衡球游戏 part2 第二部分文章在这里 1 …...
JVM(四) - JVM 内存结构
目录 一、程序计数器 1.1 作用 1.2 概述 二、虚拟机栈 2.1 概述 2.2 栈的存储单位 2.3 栈运行原理 2.4 栈帧的内部结构 2.4.1. 局部变量表 槽 Slot 2.4.2. 操作数栈 概述 栈顶缓存(Top-of-stack-Cashing) 2.4.3. 动态链接(指向…...
【AI系统】CANN 算子类型
CANN 算子类型 算子是编程和数学中的重要概念,它们是用于执行特定操作的符号或函数,以便处理输入值并生成输出值。本文将会介绍 CANN 算子类型及其在 AI 编程和神经网络中的应用,以及华为 CANN 算子在 AI CPU 的详细架构和开发要求。 算子基…...
VUE脚手架练习
脚手架安装的问题: 1.安装node.js,配置环境变量,cmd输入node -v和npm -v可以看到版本号(如果显示不是命令,确认环境变量是否配置成功,记得配置环境变量之后重新打开cmd,再去验证) 2.在安装cnmp时…...
动态艺术:用Python将文字融入GIF动画
文章内容: 在数字媒体的多样化发展中,GIF动画作为一种流行的表达形式,常被用于广告、社交媒体和娱乐。本文通过一个具体的Python编程示例,展示了如何将文字以动态形式融入到GIF动画中,创造出具有视觉冲击力的动态艺术…...
更多开源创新 挑战OpenAI-o1的模型出现和AI个体模拟突破
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
VR眼镜可视化编程:开启医疗信息系统新纪元
一、引言 随着科技的飞速发展,VR 可视化编程在医疗信息系统中的应用正逐渐成为医疗领域的新趋势。它不仅为医疗教育、手术培训、疼痛管理等方面带来了新的机遇,还在提升患者体验、推动医疗信息系统智能化等方面发挥着重要作用。 在当今医疗领域…...
Ubuntu访问简书403
日期 二〇二四年十二月三日 操作系统 Ubuntu 22.04 浏览器 firefox 问题 打开简书提示403. 原因 简书不认带ubuntu的UA 解决办法 - 浏览器地址栏输入 about:config。接受风险 - 搜索 general.useragent.override,无则新建 string类型。 - 查看浏览器 UA&…...
SQL高级应用——索引与视图
数据库优化离不开索引和视图的合理使用。索引用于加速查询性能,而视图则在逻辑层简化了查询逻辑,提高了可维护性。本文将从以下几个方面详细探讨索引与视图的概念、应用场景、优化技巧以及最新的技术发展: 1. 索引类型与应用场景 索引是数据…...
docker部署文件编写(还未尝试)
docker文件启动mysql 要使用Docker启动MySQL,您可以通过以下步骤编写Dockerfile: 选择一个基础镜像,通常是一个包含了MySQL的Linux发行版。 设置环境变量,如MySQL的root密码等。 在容器启动时运行MySQL服务。 以下是一个简单…...
缓存与数据库数据一致性 详解
缓存与数据库数据一致性详解 在分布式系统中,缓存(如 Redis、Memcached)与数据库(如 MySQL、PostgreSQL)一起使用是提高系统性能的常用方法。然而,缓存与数据库可能因更新时序、操作失误等原因出现数据不一…...
每日计划-1203
1. 完成 236. 二叉树的最近公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution {public:TreeNode* lowe…...
HTML5动漫主题网站——天空之城 10页 html+css+设计报告成品项目模版
📂文章目录 一、📔网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站演示 五、⚙️网站代码 🧱HTML结构代码 💒CSS样式代码 六、🔧完整源码下载 七、📣更多 一、&#…...
分布式会话 详解
分布式会话详解 在分布式系统中,用户的会话状态需要在多个服务器或节点之间共享或存储。分布式会话指的是在这种场景下如何管理和存储会话,以便在多个节点上都能正确识别用户状态,从而保证用户体验的一致性。 1. 为什么需要分布式会话 在单…...
探索仓颉编程语言:官网上线,在线体验与版本下载全面启航
文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时,会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处,无法和别人…...
Ubuntu无法连接Linux
检查网络连接 确保你的机器能够正常连接互联网。你可以尝试 ping 一下 GitHub 或其他网站,确认是否有网络问题: ping github.com如果无法 ping 通 GitHub,检查一下你的网络连接。 检查 GitHub 状态 有时候 GitHub 本身可能会出现服务故障。你…...
【Spring】注解开发
为了提高开发效率,从 Spring 2.0 开始引入了多种注解,而在 Spring 3.0 中则实现了纯注解的开发方式。 一、注解的使用 在 Spring 2.0 之后,使用注解进行开发主要分为两个步骤: 定义 Bean:使用 Component 注解来定义…...
数字图像稳定DIS介绍目录
之前用OpenCV做过防抖,OpenCV处理时,先处理一遍,再输出视频。二者相差还是挺大的。 前 言.......................................................................................................................................... …...
【人工智能-基础】SVM中的核函数到底是什么
文章目录 支持向量机(SVM)中的核函数详解1. 什么是核函数?核函数的作用:2. 核技巧:从低维到高维的映射3. 常见的核函数类型3.1 线性核函数3.2 多项式核函数3.3 高斯径向基函数(RBF核)4. 总结支持向量机(SVM)中的核函数详解 支持向量机(SVM,Support Vector Machine)…...
字节青训Marscode——8:找出整形数组中超过一半的数
问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入:array [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
