嵌入式系统应用-LVGL的应用-平衡球游戏 part1

平衡球游戏 part1

  • 1 平衡球游戏的界面设计
  • 2 界面设计
    • 2.1 背景设计
    • 2.2 球的设计
    • 2.3 移动球的坐标
    • 2.4 用鼠标移动这个球
    • 2.5 增加边框规则
    • 2.6 效果图
  • 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 颜色的步骤

  1. 创建消息框:
    使用 lv_msgbox_create 函数创建消息框。

  2. 定义样式:
    使用 lv_style_t 定义并初始化样式。你可以为消息框的不同部分创建不同的样式,例如背景、文本和按钮。

  3. 应用样式:
    使用 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 效果图

移动小球,没有动画

3 为小球增加增加动画效果

3.1 增加移动效果代码

lv_anim_t 是 LVGL 中用于定义和管理动画的结构体。它提供了一套功能强大的 API,用于在 LVGL 对象上实现各种动画效果。以下是 lv_anim_t 及相关函数的说明:

lv_anim_t 结构体
lv_anim_t 是一个用于描述动画的结构体,其中包含了动画的各种参数和设置。

常用函数

  1. 初始化和基本设置
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 的变化。

  1. 时间管理
lv_anim_set_time(lv_anim_t * a, uint32_t duration):

设置动画的持续时间(毫秒)。

lv_anim_set_delay(lv_anim_t * a, uint32_t delay):

设置动画开始前的延迟时间(毫秒)。

  1. 动画效果控制
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:

类似于缓入和缓出的效果,用于更自然的动画过渡。

  1. 事件和重复
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):

设置动画完成时的回调函数。

  1. 启动动画
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 具体效果图片

移动小球带动画

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

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

相关文章

从被动响应到主动帮助,ProActive Agent开启人机交互新篇章

在人工智能领域&#xff0c;我们正见证着一场革命性的变革。传统的AI助手&#xff0c;如ChatGPT&#xff0c;需要明确的指令才能执行任务。但现在&#xff0c;清华大学联合面壁智能等团队提出了一种全新的主动式Agent交互范式——ProActive Agent&#xff0c;它能够主动观察环境…

2.mysql 中一条更新语句的执行流程是怎样的呢?

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。 相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又…

NaviveUI框架的使用 ——安装与引入(图标安装与引入)

文章目录 概述安装直接引入引入图标样式库 概述 &#x1f349;Naive UI 是一个轻量、现代化且易于使用的 Vue 3 UI 组件库&#xff0c;它提供了一组简洁、易用且功能强大的组件&#xff0c;旨在为开发者提供更高效的开发体验&#xff0c;特别是对于构建现代化的 web 应用程序。…

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作&#xff0c;他们按时他们的习惯在同一个屏幕内显示若干个子视图&#xff0c;尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验&#xff1a; 设计为最多支持5行6列页面展示后&#xff0c;右侧的布局则动…

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…

C#调用c++创建的动态链接库dll文件

在C#中调用外部DLL文件是一种常见的编程实践&#xff0c;它具有以下几个重要意义&#xff1a;1.代码重用&#xff1b;2.模块化&#xff1b;3.性能优化&#xff1b;4.安全性&#xff1b;5.跨平台兼容性&#xff1b;6.方便更新和维护&#xff1b;7.利用特定技术或框架&#xff1b…

重建大师重建的模型坐标有偏差怎么解决?

第一遍自由网空三&#xff0c;跑完之后刺点&#xff0c;然后控制点平差增强参数解算&#xff0c;方法如下&#xff1a; &#xff08;1&#xff09;跑完自由网空三后&#xff0c;选择编辑控制点&#xff0c;出现刺点窗口后&#xff0c;导入控制点参数 &#xff08;2&#xff09…

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反&#xff0c;由于它的简单性和可扩展性&#xff0c;它已经获得了普及。在本文中&#xff0c;我将尝试概述它的主要概念&#xff0c;并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

GEE Download Data——气温数据的下载

GEE数据下载第二弹!今天我们来分享气温数据的下载。 一、数据介绍 气温数据我们要用到的是MODIS数据产品,MOD11A2 V6.1 产品提供 1200 x 1200 公里网格内 8 天平均陆地表面温度 (LST)。 MOD11A2 中的每个像素值都是该 8 天内收集的所有相应 MOD11A1 LST 像素的简单平均值。…

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers&#xff08;DiTs&#xff09;设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术&#xff0c;以满足实时推理需求。 1.1 DiT 和 LLM DiT&#xff08;Diffusion Transformers&am…

uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图 抽成组件navbar.vue&#xff0c;放入分包 <template><view class"header-nav-box":style"{height:Props.imgShow?:statusBarHeightpx,background:Props.imgShow?:Props.bgColor||#ffffff;}"><!-- 是否使用图片背景 false…

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…

MacOS 命令行详解使用教程

本章讲述MacOs命令行详解的使用教程&#xff0c;感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言&#xff1a; 在 macOS 上,Terminal&#xff08;终端) 是一个功能强大的工具&#xff0c;它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…

【计算机网络】实验6:IPV4地址的构造超网及IP数据报

实验 6&#xff1a;IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网&#xff08;无分类编制&#xff09;的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…

Java Web 1HTML快速入门

目录 一、Web开发介绍 1.什么是Web&#xff1f; 2.初识Web前端 二、HTML快速入门 1.什么是HTML、CSS&#xff1f; 2、案例练习 3.小结 三、VS Code开发工具 四、基础标签&样式&#xff08;HTML&#xff09; 2、实现标题--样式1&#xff08;新闻标题的颜色&#xff0…

【流程图】各元素形状和含义

判定、文档、数据、数据库、流程处理节点 矩形 - 动词 平行四边形 - 图像 下波浪 - 数据 图片来源http://baike.cu12.com/bkss/62449.shtml

利用机器学习预测离婚:从数据分析到模型构建(含方案和源码)

背景介绍 在当今社会&#xff0c;婚姻关系的稳定性受到了多方面因素的影响&#xff0c;包括经济压力、沟通问题、个人价值观差异等。离婚不仅对夫妻双方产生深远的影响&#xff0c;还可能对子女的成长环境和社会稳定造成不利影响。因此&#xff0c;理解并预测可能导致离婚的因素…

分层架构 IM 系统之 Router 架构分析

通过前面文章的分析&#xff0c;我们已经明确&#xff0c;Router 的核心职责是作为中央存储记录在线客户端的连接状态&#xff0c;Router 在本质上是一个内存数据库。 内存是一种易失性的存储&#xff0c;既如此&#xff0c;Router 的可用性如何保障呢&#xff1f; 副本是分布…

二分查找常规实现

使用二分查找有一个前提条件&#xff1a;要查找的数必须在一个有序数组里。在这个前提下&#xff0c;取中间位置数作为比较对象&#xff1a; 若要查找的值和中间数相等&#xff0c;则查找成功。 若小于中间数&#xff0c;则在中间位置的左半区继续查找。 若大于中间数&#x…