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

80. UE5 RPG 实现UI显示技能冷却进度功能

在上一篇文章里,我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI,现在还有一个问题,我们希望在技能释放进去冷却时,技能变成灰色,并在技能冷却完成,技能可以再次使用。
为了实现这个功能,我们首先要实现一个能够监听技能进入冷却的方法,然后在技能被使用后,将UI的颜色修改,并在技能冷却完成后,将技能UI恢复到可释放状态。

创建异步任务来监听技能冷却

为了实现能够监听,我们创建一个新的类用来监听技能冷却。
我们创建一个新的c++类,继承至BlueprintAsyncActionBase类
在这里插入图片描述
修改命名,我们将其命名为监听冷却修改
在这里插入图片描述
接下来,我们将实现类,如果不想看实现过程,请略过,实现完成,我会贴上完整的实现代码。

首先我们创建一个委托宏,用于设置委托类型,返回一个参数

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FCooldownChangeSignature, float, TimeRemaining);

在类里创建两个委托,用于触发在技能进入冷却时触发,然后在技能冷却时触发

	UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownStart; //冷却触发开始委托UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownEnd; //冷却结束委托

然后创建两个保护性的变量参数,用于实例类时,存储ASC和需要监听的冷却标签

protected:UPROPERTY()TObjectPtr<UAbilitySystemComponent> ASC;FGameplayTag CooldownTag; //记录监听的冷却标签

接着我们创建一个实例函数,用于创建类的实例设置meta=(BlueprintInternalUseOnly=“true”)为了防止开发mod或者玩家能够使用到此函数。

	UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly="true"))static UListenCooldownChange* ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag& CooldownTag);

然后增加一个函数,用于结束任务,防止内存泄露

	UFUNCTION(BlueprintCallable)void EndTask();

在创建实例函数中,我们首先实例化类,并将参数设置上去

UListenCooldownChange* UListenCooldownChange::ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag& InCooldownTag)
{UListenCooldownChange* ListenCooldownChange = NewObject<UListenCooldownChange>();ListenCooldownChange->ASC = AbilitySystemComponent;ListenCooldownChange->CooldownTag = InCooldownTag;

然后判断传入的两个参数是否存在,如果未存在,将结束此任务

	//如果参数有一项未设置,我们将结束此任务if(!IsValid(AbilitySystemComponent) || !InCooldownTag.IsValid()){ListenCooldownChange->EndTask();return nullptr;}

我们接下来增加两个回调函数,用于实现对技能冷却的开始和结束的广播

	//监听冷却标签回调函数void CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount);//监听ASC激活GE的回调void OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle);

使用对标签的监听来实现技能冷却结束的监听

	//监听冷却标签的变动,并绑定回调,用于获取冷却结束AbilitySystemComponent->RegisterGameplayTagEvent(InCooldownTag, EGameplayTagEventType::NewOrRemoved).AddUObject(ListenCooldownChange, &UListenCooldownChange::CooldownTagChanged);

对于技能进入冷却状态,我们采用监听应用冷却GE实现

	//监听GE应用回调,获取冷却激活,用于获取技能开始进入冷却AbilitySystemComponent->OnActiveGameplayEffectAddedDelegateToSelf.AddUObject(ListenCooldownChange, &UListenCooldownChange::OnActiveEffectAdded);

对于冷却的开始的参数设置,我们可以查看ASC源码,这个可以在客户端和服务器都获取到对应的委托回调来监听有时效性的GE
在这里插入图片描述
宏的定义时,是传入了三个参数
在这里插入图片描述
设置完成后,我们就可以返回,每次调用,我们可以创建一个监听实例

return ListenCooldownChange;

为了防止内存泄露,我们需要实现EndTask函数,在实例不需要时,对其进行销毁,并进行资源回收。AbilitySystemComponent->OnActiveGameplayEffectAddedDelegateToSelf是由ASC创建的,所以不需要我们去对其进行销毁

void UListenCooldownChange::EndTask()
{//判断ASC是否存在if(!IsValid(ASC)) return;//取消对冷却标签的变动监听ASC->RegisterGameplayTagEvent(CooldownTag, EGameplayTagEventType::NewOrRemoved).RemoveAll(this);SetReadyToDestroy(); //设置此对象可以被销毁,如果此对象不再被引用,将可以被销毁掉MarkAsGarbage(); //标记此实例为垃圾资源,可以被回收
}

接着,我们还需要实现两个广播的处理,首先是对冷却结束的广播,我们对冷却标签进行获取,如果标签数量小于1,那么,技能将不处于冷却状态,我们广播冷却结束即可

void UListenCooldownChange::CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const
{//如果计数为0,代表冷却标签已经不存在,技能不处于冷却状态if(NewCount == 0){//广播冷却结束委托CooldownEnd.Broadcast(0.f);}
}

然后就是进入冷却的广播函数广播,我们首先获取这个应用的GE是否为设置了冷却标签,为了防止设置错误,我们获取了设置自身和设置给Actor的标签容器,判断容器内是否拥有我们设置的冷却标签。然后创建查询冷却标签的查询器对象,通过此对象去查找剩余的冷却时间,从中获取到最大冷却时间将时间广播出去。

void UListenCooldownChange::OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const
{//获取设置到自身的所有标签FGameplayTagContainer AssetTags;SpecApplied.GetAllAssetTags(AssetTags);//获取到GE设置给Actor的标签FGameplayTagContainer GrantedTags;SpecApplied.GetAllGrantedTags(GrantedTags);//判断应用的GE是否设置了此冷却标签if(AssetTags.HasTagExact(CooldownTag) || GrantedTags.HasTagExact(CooldownTag)){//创建一个查询对象,用于查询包含所有标签容器标签的GEFGameplayEffectQuery GameplayEffectQuery = FGameplayEffectQuery::MakeQuery_MatchAllOwningTags(CooldownTag.GetSingleTagContainer());//返回查询到的所有包含此冷却GE的剩余时间的GETArray<float> TimesRemaining = ASC->GetActiveEffectsTimeRemaining(GameplayEffectQuery);if(TimesRemaining.Num() > 0){//获取最高的冷却时间float TimeRemaining = TimesRemaining[0];for(int32 i=0; i<TimesRemaining.Num(); i++){if(TimeRemaining < TimesRemaining[i]) TimeRemaining = TimesRemaining[i];}//广播初始时间CooldownStart.Broadcast(TimeRemaining);}}
}

接下来就是完整代码,不想看代码解析的,自己复制代码去修改名称运行即可
ListenCooldownChange.h

// 版权归暮志未晚所有。#pragma once#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "AbilitySystemComponent.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "ListenCooldownChange.generated.h"struct FGameplayAbilitySpec;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FCooldownChangeSignature, float, TimeRemaining);/*** */
UCLASS(BlueprintType, meta = (ExposedAsyncProxy="AsyncTask"))
class RPG_API UListenCooldownChange : public UBlueprintAsyncActionBase
{GENERATED_BODY()public:UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownStart; //冷却触发开始委托UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownEnd; //冷却结束委托UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly="true"))static UListenCooldownChange* ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag& InCooldownTag);UFUNCTION(BlueprintCallable)void EndTask();protected:UPROPERTY()TObjectPtr<UAbilitySystemComponent> ASC;FGameplayTag CooldownTag; //记录监听的冷却标签//监听冷却标签回调函数void CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const;//监听ASC激活GE的回调void OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const;
};

ListenCooldownChange.cpp

// 版权归暮志未晚所有。#include "AbilitySystem/AsyncTasks/ListenCooldownChange.h"#include "AbilitySystemComponent.h"UListenCooldownChange* UListenCooldownChange::ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag& InCooldownTag)
{UListenCooldownChange* ListenCooldownChange = NewObject<UListenCooldownChange>();ListenCooldownChange->ASC = AbilitySystemComponent;ListenCooldownChange->CooldownTag = InCooldownTag;//如果参数有一项未设置,我们将结束此任务if(!IsValid(AbilitySystemComponent) || !InCooldownTag.IsValid()){ListenCooldownChange->EndTask();return nullptr;}//监听冷却标签的变动,并绑定回调,用于获取冷却结束AbilitySystemComponent->RegisterGameplayTagEvent(InCooldownTag, EGameplayTagEventType::NewOrRemoved).AddUObject(ListenCooldownChange, &UListenCooldownChange::CooldownTagChanged);//监听GE应用回调,获取冷却激活,用于获取技能开始进入冷却AbilitySystemComponent->OnActiveGameplayEffectAddedDelegateToSelf.AddUObject(ListenCooldownChange, &UListenCooldownChange::OnActiveEffectAdded);return ListenCooldownChange;
}void UListenCooldownChange::EndTask()
{//判断ASC是否存在if(!IsValid(ASC)) return;//取消对冷却标签的变动监听ASC->RegisterGameplayTagEvent(CooldownTag, EGameplayTagEventType::NewOrRemoved).RemoveAll(this);SetReadyToDestroy(); //设置此对象可以被销毁,如果此对象不再被引用,将可以被销毁掉MarkAsGarbage(); //标记此实例为垃圾资源,可以被回收
}void UListenCooldownChange::CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const
{//如果计数为0,代表冷却标签已经不存在,技能不处于冷却状态if(NewCount == 0){//广播冷却结束委托CooldownEnd.Broadcast(0.f);}
}void UListenCooldownChange::OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const
{//获取设置到自身的所有标签FGameplayTagContainer AssetTags;SpecApplied.GetAllAssetTags(AssetTags);//获取到GE设置给Actor的标签FGameplayTagContainer GrantedTags;SpecApplied.GetAllGrantedTags(GrantedTags);//判断应用的GE是否设置了此冷却标签if(AssetTags.HasTagExact(CooldownTag) || GrantedTags.HasTagExact(CooldownTag)){//创建一个查询对象,用于查询包含所有标签容器标签的GEFGameplayEffectQuery GameplayEffectQuery = FGameplayEffectQuery::MakeQuery_MatchAllOwningTags(CooldownTag.GetSingleTagContainer());//返回查询到的所有包含此冷却GE的剩余时间的GETArray<float> TimesRemaining = ASC->GetActiveEffectsTimeRemaining(GameplayEffectQuery);if(TimesRemaining.Num() > 0){//获取最高的冷却时间float TimeRemaining = TimesRemaining[0];for(int32 i=0; i<TimesRemaining.Num(); i++){if(TimeRemaining < TimesRemaining[i]) TimeRemaining = TimesRemaining[i];}//广播初始时间CooldownStart.Broadcast(TimeRemaining);}}
}

接着,我们在UI的事件图标中搜索名称,查看是否能够找到对应的节点
在这里插入图片描述
注意,我们搜索的名称是函数名称
在这里插入图片描述

测试代码

上面我们编写了对应的代码,首先做的就是快速测试一下,防止出现问题。
我们快速连一套测试节点,用来检测是否能够获取到对应事件
在这里插入图片描述
查看打印,发现事件确实成功触发,也有一些问题,比如触发了多次。触发多次的原因是因为所有的技能UI都是在监听这一个冷却标签
在这里插入图片描述

处理无法在蓝图调用的问题

我们当前无法在蓝图中获取对象进行调用销毁事件,所以需要一个方法,获取对象,我们在头文件设置,将其作为一个可获取参数,并设置命名"AsyncTask"

UCLASS(BlueprintType, meta = (ExposedAsyncProxy="AsyncTask"))

编译运行,可以查看到对象类型
在这里插入图片描述
我们可以将其设置为变量,避免没有销毁掉
在这里插入图片描述

设置冷却标签

我们需要记录技能的冷却标签,有一个比较好的方法就是在技能数据结构体增加一个配置项
在这里插入图片描述
在数据资产中配置上
在这里插入图片描述
接着我们修改ui的蓝图,在应用了技能数据后,对其绑定技能的回调,为了保证内存泄露,现进行销毁,防止频繁切换ui显示的技能导致频繁触发回调。
在这里插入图片描述
在ui被销毁时,也需要调用
在这里插入图片描述
接着编写代码测试
在这里插入图片描述
经过测试,发现还是有问题,原来是没有判断是否为当前需要监听的技能
和之前的技能一样,我们通过标签判断是否需要执行后续
在这里插入图片描述
这样就实现了事件监听
在这里插入图片描述

创建UI冷却效果

上面,我们实现了技能的冷却进入和退出。
我们接下来,要将冷却效果表现到UI上面,让玩家能够清晰的了解到技能已经进入冷却,无法释放。
我们增加两个函数节点,一个是设置技能UI变暗,并将冷却时间显示出来
在这里插入图片描述
另一个则是恢复默认状态,将冷却节点隐藏,并将技能图标颜色恢复默认
在这里插入图片描述
我们在监听到技能进入冷却后,将冷却时间保存为变量,方便后续使用,并进入冷却状态
在这里插入图片描述
然后我们设置一个定时器,在定时器里面对显示剩余时间进行更新,Time为多次时间更新一次,Looping选中,定时器将循环更新,不勾选将只触发一次。
在这里插入图片描述
并将定时器的引用保存下来,方便在冷却结束后,将其销毁
在这里插入图片描述
然后在自定义事件里面,减去每次调用时间,更新冷却时间,并显示到UI上面
在这里插入图片描述
为了防止出现负数,我们将其限制在最小值为0
在这里插入图片描述

在技能冷却结束后,我们将定时器清除,并恢复默认状态
在这里插入图片描述
接下来运行查看效果
在这里插入图片描述
在技能冷却完成,也能恢复默认
在这里插入图片描述
接下来,截取一张完整的蓝图
在这里插入图片描述

相关文章:

80. UE5 RPG 实现UI显示技能冷却进度功能

在上一篇文章里&#xff0c;我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI&#xff0c;现在还有一个问题&#xff0c;我们希望在技能释放进去冷却时&#xff0c;技能变成灰色&#xff0c;并在技能冷却完成&#xff0c;技能可以再次使…...

Vue2-集成路由Vue Router介绍与使用

文章目录 路由&#xff08;Vue2&#xff09;1. SPA 与前端路由2. vue-router基本使用创建路由组件声明路由链接和占位标签创建路由模块挂载路由模块 3. vue-router进阶路由重定向嵌套路由动态路由编程式导航导航守卫 本篇小结 更多相关内容可查看 路由&#xff08;Vue2&#xf…...

TemuAPI接口:获取商品详情功能

temu作为拼多多海外的跨境电商平台&#xff0c;已经在海外电商领域崭露头角&#xff0c;越来越多的外贸人选择temu作为发展平台。今天的接口可以用于获取temu平台的商品详情&#xff0c;包括价格、商品图片、规格、评论等内容&#xff0c;如有需要&#xff0c;请点击文末链接或…...

deepstream读取mp4文件及不同类型视频输入bug解决

在deepstream中使用mp4文件&#xff0c;与rtsp类似&#xff0c;使用uridecodebin即可&#xff0c;&#xff08;可见官方test.py文件&#xff09; def create_source_bin(index, uri):print("Creating source bin")# Create a source GstBin to abstract this bins c…...

Redis服务器统计和配置信息简介

Redis服务器统计和配置信息简介 首先使用INFO命令在Redis中用于获取Redis服务器的各种统计和配置信息;执行上述命令后&#xff0c;返回的信息分为多个部分&#xff0c;包括服务器信息、客户端信息、内存信息、持久化信息、统计信息、复制信息、CPU信息和键空间信息&#xff1b;…...

Linux Mac 安装Higress 平替 Spring Cloud Gateway

Linux Mac 安装Higress 平替 Spring Cloud Gateway Higress是什么?传统网关分类Higress定位下载安装包执行安装命令执行脚本 安装成功打开管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官网 Higress是什么? Higress是基于阿里内部的…...

基于重叠群稀疏的总变分信号降噪及在旋转机械故障诊断中的应用(MATLAB)

基于振动分析的故障诊断方法基本流程主要由以下五个步骤组成&#xff0c;分别是信号采集、信号处理、特征提取、状态识别与诊断结果。这五个步骤中信号采集与特征提取是故障诊断中最为重要的步骤&#xff0c;而故障微弱特征信息又是其中最难解决的问题。“故障微弱特征信息”站…...

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…...

微信小程序---npm 支持

一、构建 npm 目前小程序已经支持使用 npm 安装第三方包&#xff0c;但是这些 npm 包在小程序中不能够直接使用&#xff0c;必须得使用小程序开发者工具进行构建后才可以使用。 为什么得使用小程序开发者工具需要构建呢❓ 因为 node_modules 目录下的包&#xff0c;不会参与…...

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件...

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…...

Spring源码中的模板方法模式

1. 什么是模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的定义&…...

初学SpringMVC之 JSON 篇

JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级的数据交换格式 采用完全独立于编程语言的文本格式来存储和表示数据 JSON 键值对是用来保存 JavaScript 对象的一种方式 比如&#xff1a;{"name": "张三"}…...

Mojo AI编程语言(三)数据结构:高效数据处理

目录 1. Mojo AI编程语言简介 2. 数据结构在数据处理中的重要性 3. Mojo AI中的基础数据结构 3.1 数组 3.2 列表 3.3 字典 4. 高效数据结构的实现与优化 4.1 哈希表 4.2 树结构 4.3 图结构 5. 高效数据处理技术 5.1 并行处理 5.2 内存优化 5.3 数据压缩 6. 实战…...

Java学习笔记整理: 关于SpringBoot 2024/7/12;

SpringBoot springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。 特点specialty&#xff1a; springboot的特点: 1&#xff09; 自动配置 Spring Boot的自动配置是一个运行时&#xff08;更准确地说&#xff0c;是应用程序启动时&#xff09;的过程&a…...

ASP.NET MVC Lock锁的测试

思路&#xff1a;我们让后台Thread.Sleep一段时间&#xff0c;来模拟一个耗时操作&#xff0c;而这个时间可以由前台提供。 我们开启两个或以上的页面&#xff0c;第一个耗时5秒(提交5000)&#xff0c;第二个耗时1秒(提交1000)。 期望的测试结果&#xff1a; 不加Lock锁&…...

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)

一、集群情况介绍 我的本地虚拟机&#xff0c;一共有三个节点&#xff0c;hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist&#xff0c;通过白名单的配置&#xff0c;只允许集群包含102和103两台机器可以存储数据&#xff0c;104无法存储数据。 需求 …...

TensorFlow系列:第五讲:移动端部署模型

项目地址&#xff1a;https://github.com/LionJackson/imageClassification Flutter项目地址&#xff1a;https://github.com/LionJackson/flutter_image 一. 模型转换 编写tflite模型工具类&#xff1a; import osimport PIL import tensorflow as tf import keras import …...

深度学习DeepLearning二元分类 学习笔记

文章目录 类别区分变量与概念逻辑回归Sigmoid函数公式决策边逻辑损失函数和代价函数逻辑回归的梯度下降泛化过拟合的解决方案正则化 类别区分 变量与概念 决策边置信度阈值threshold过拟合欠拟合正则化高偏差lambda&#xff08;λ&#xff09; 线性回归受个别极端值影响&…...

Eureka 介绍与使用

Eureka 是一个开源的服务发现框架&#xff0c;它主要用于在分布式系统中管理和发现服务实例。它由 Netflix 开发并开源&#xff0c;是 Netflix OSS 中的一部分。 使用 Eureka 可以方便地将新的服务实例注册到 Eureka 服务器&#xff0c;并且让其他服务通过 Eureka 服务器来发现…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...