虚幻引擎GAS入门学习笔记(二)

news2024/11/17 15:41:07

虚幻引擎GAS入门(二)

  • 学习位置UE5.3 GAS入门教程重置版 小明

MVC框架与技能初始化

  • 让一开始创建的蓝图的基础GameplayAbility蓝图继承我们写好的BaseGameplayAbility
    在这里插入图片描述
  • 创建一个库函数,写一些常用的函数在里面
  • 第一个得到玩家与玩家控制器
    在这里插入图片描述
  • 获取角色面对目标的方向
    在这里插入图片描述
  • 将技能UI添加到主UI中
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中创建一个函数用来初始化技能
    在这里插入图片描述

编写回血技能

添加MP与Strength的变化逻辑

  • 添加MP与Strength的变化函数
    在这里插入图片描述
  • 绑定他们的通知与广播
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中更新MP与Strength
    在这里插入图片描述

创建回血技能

  • 创建技能的步骤
    在这里插入图片描述

魔法与能量改变时候的通知

  • 在BaseAbility蓝图中写入检查通知
    在这里插入图片描述
  • 新建一个继承自基类的GameplayAbility技能蓝图,然后添加标记,选中
    在这里插入图片描述
    在这里插入图片描述
  • 添加回血技能的效果
    在这里插入图片描述
  • 消耗15点蓝
    在这里插入图片描述
  • 然后继续添加技能CD
    在这里插入图片描述
  • 添加GameplayCueNotify_Static蓝图用来添加特效
    在这里插入图片描述
  • 先添加标签
    在这里插入图片描述
    在这里插入图片描述
  • 在回复技能中添加这个Cue
    在这里插入图片描述
  • 学习技能
    在这里插入图片描述
  • 创建一个激活函数来激活技能
    在这里插入图片描述
  • 技能的图标给上,特效给上
    在这里插入图片描述
    在这里插入图片描述
  • 制作回血Montage
    在这里插入图片描述
  • 播放回血技能
    在这里插入图片描述
  • 将特效的材质加上
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中添加一个判断是否满血的函数
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

冲刺技能

  • 制作冲刺技能的Montage
    在这里插入图片描述
  • 添加一个继承自BaseAbility技能蓝图的技能蓝图
    在这里插入图片描述
    在这里插入图片描述
  • 添加标签与技能效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 分别设置这些效果属性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 添加图标
    在这里插入图片描述
  • 在角色蓝图中添加技能,然后添加这个激活的技能标签
    在这里插入图片描述
    在这里插入图片描述
  • 使用技能
    在这里插入图片描述

添加技能冲刺的力的作用

  • 添加一个事件来作为技能向前的作用力
    在这里插入图片描述
  • 先记录一下摩擦力
    在这里插入图片描述
  • 在角色基类里面添加一个消除摩擦力的函数
    在这里插入图片描述
  • 在角色身上添加一个碰撞球
    在这里插入图片描述
  • 将碰撞到的碰撞的信息发送出去
    在这里插入图片描述
  • 消除摩擦力函数在这调用,然后接收这事件应用添加伤害效果
    在这里插入图片描述
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
  • 在敌人蓝图中添加一个被冲刺击晕的事件和一个回复控制器控制的函数
    在这里插入图片描述
    在这里插入图片描述
  • 新建一个击飞的Montage
    在这里插入图片描述
  • 再添加一个推开的事件
    在这里插入图片描述
  • 调用击退与眩晕函数
    在这里插入图片描述
  • 技能结束时将角色的摩擦力添加上
    在这里插入图片描述

使用冲刺技能阶段不能被打断

  • 冲刺技能这激活自有标签
    在这里插入图片描述
  • 其他技能激活阻止标签
    在这里插入图片描述
    在这里插入图片描述

激光技能

  • 新建激光技能,以及CD、Cost、伤害
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中添加我们需要学习的这个新技能
    在这里插入图片描述
    在这里插入图片描述
  • 提交技能,触发技能
    在这里插入图片描述
    在这里插入图片描述

创建激光Actor

  • 添加激光骨骼,添加一个碰撞球检测碰撞,添加一个摄像机臂
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 做这个激光的思路,这个骨骼只有三个,我们在动画蓝图中调节这个end位置就可以达到效果了,通过摄像机臂的碰撞检测碰到的第一个物体会进行阻挡
    在这里插入图片描述
  • 给激光骨骼创建动画蓝图,写入修改end骨骼逻辑
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 将动画蓝图给到激光
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

激光的生成

  • 制作激光的Montage动画
    在这里插入图片描述
  • 在激光Cost上添加一个资产标签,作用于技能结束后清除这个标签
    在这里插入图片描述
  • 技能结束时候删除标签进入CD
    在这里插入图片描述
  • 在角色蓝图中添加一个箭头来表示激光的发射位置
    在这里插入图片描述
  • 触发激光技能时就锁定视角,将激光Actor附加到表示激光发射位置的箭头组件上
    在这里插入图片描述
  • 结束后回复视角
    在这里插入图片描述

各个技能之间的相互打断

  • 手动取消技能,当再次按3的时候就关闭技能,用一个bool变量来标志技能是否在释放,然后使用事件分发去关闭技能
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在基类技能蓝图中将:
    • Cancel Abilities with Tag:取消带有特定标签的能力,让技能之间相互打断
    • Activation Blocked Tags:阻止带有某些标签的能力激活,当这个tag被激活的时候,所有带这个tag的都不能被激活,让冲刺技能的优先级最高
      在这里插入图片描述

给激光技能添加伤害与击飞

  • 将激光的碰撞到敌人添加到数组中
    在这里插入图片描述
  • 每隔0.25秒进行一次消息
    在这里插入图片描述
  • 在角色基类蓝图中添加一个函数用来检测魔法值是否消耗完在这里插入图片描述
  • 拿到敌人的信息然后应用伤害与击飞眩晕效果
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

一般报错处理

  • 如果爆这种错误,就去这些位置添加判断IsValid,进行防御性编程
    在这里插入图片描述

山崩地裂技能

  • 首先制作这个技能的Montage
    在这里插入图片描述
  • 首先还是添加技能那一套
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

编写目标函数

  • 新建GameplayAbilityTargetActor类来编写目标
    • 这个类主要用于处理游戏能力的目标选择。这个类提供了一个框架,让开发者能够创建自定义的目标选择行为,比如选择一个点、一个区域、一个或多个敌人等。目标选择是许多游戏机制中的关键部分,例如施放技能时需要指定攻击目标或者范围
      在这里插入图片描述
  • 重写这两个函数
    在这里插入图片描述
  • meta = (ExposeOnSpawn = true):这是一个元数据标签,表示当这个 Actor 作为另一个 Actor 的子对象生成时(例如,通过 SpawnActor 或 BeginPlay),这个属性可以在生成时被设置。
    在这里插入图片描述
  • 实现逻辑
// Fill out your copyright notice in the Description page of Project Settings.


#include "GroundSelectTargetActor.h"
#include "Abilities/GameplayAbility.h"

void AGroundSelectTargetActor::StartTargeting(UGameplayAbility* Ability)
{
	Super::StartTargeting(Ability);
	// 获取拥有该能力的控制器,并将其转换为 APlayerController 类型
	PrimaryPC = Cast<APlayerController>(Ability->GetOwningActorFromActorInfo()->GetInstigatorController());
}

void AGroundSelectTargetActor::ConfirmTargetingAndContinue()
{
	//存储玩家注视点位置
	FVector LookPoint;
	GetPlayerLookAtPoint(LookPoint);
	// 定义一个数组来存储重叠结果
	TArray<FOverlapResult> OverlapResults;
	// 定义一个数组来存储找到的敌对角色
	TArray<TWeakObjectPtr<AActor>> OverlapActors;

	// 创建碰撞查询参数
	FCollisionQueryParams QueryParams;
	QueryParams.bTraceComplex = false;
	QueryParams.bReturnPhysicalMaterial = false;

	// 获取当前玩家控制的角色
	APawn* SelfPawn = PrimaryPC->GetPawn();
	if (SelfPawn)
	{
		// 忽略当前玩家控制的角色,防止自撞
		QueryParams.AddIgnoredActor(SelfPawn);
	}
	// 执行重叠检测,查找指定半径内的所有 Pawn
	bool QueryResult = GetWorld()->OverlapMultiByObjectType(OverlapResults, LookPoint,
		FQuat::Identity, // 旋转(默认为单位四元数)
		FCollisionObjectQueryParams(ECollisionChannel::ECC_Pawn), // 只检测 Pawn 类型的对象
		FCollisionShape::MakeSphere(selectRadius),// 使用球形碰撞形状,半径为 selectRadius
		QueryParams);

	if (QueryResult)
	{
		for (int i = 0; i < OverlapResults.Num(); i++)
		{
			// 将重叠结果转换为 APawn
			APawn* Enemy = Cast<APawn>(OverlapResults[i].GetActor());
			if (Enemy && !OverlapActors.Contains(Enemy))//敌人存在且没有重复包含
			{
				OverlapActors.Add(Enemy);
			}
		} 
	}
	// 创建一个 FGameplayAbilityTargetDataHandle 来存储目标数据
	FGameplayAbilityTargetDataHandle TargetDataHandle;
	// 创建一个 FGameplayAbilityTargetData_LocationInfo 对象来存储中心位置
	FGameplayAbilityTargetData_LocationInfo* CenterLoc = new FGameplayAbilityTargetData_LocationInfo();
	CenterLoc->TargetLocation.LiteralTransform = FTransform(LookPoint);// 设置位置
	// 设置位置类型
	CenterLoc->TargetLocation.LocationType = EGameplayAbilityTargetingLocationType::LiteralTransform;

	//0号负载
	TargetDataHandle.Add(CenterLoc);// 将中心位置数据添加到 TargetDataHandle
	if (OverlapActors.Num() > 0)
	{
		// 创建一个 FGameplayAbilityTargetData_ActorArray 对象来存储找到的敌人
		FGameplayAbilityTargetData_ActorArray* ActorArray = new FGameplayAbilityTargetData_ActorArray();
		ActorArray->SetActors(OverlapActors);// 设置找到的敌人
		//1号负载
		TargetDataHandle.Add(ActorArray); // 将敌人数据添加到 TargetDataHandle
	}

	// 检查是否应该生成目标数据
	check(ShouldProduceTargetData());
	// 检查是否允许确认目标
	if (IsConfirmTargetingAllowed())
	{
		// 广播目标数据准备就绪的委托
		TargetDataReadyDelegate.Broadcast(TargetDataHandle);
	}
}

bool AGroundSelectTargetActor::GetPlayerLookAtPoint(FVector& Out_LookPoint)
{
	FVector ViewLoc;//射线开始位置
	FRotator ViewRot;
	PrimaryPC->GetPlayerViewPoint(ViewLoc, ViewRot);

	FVector ViewEnd = ViewLoc + ViewRot.Vector() * 50000.f;//射线终点位置

	FHitResult HitResult;
	FCollisionQueryParams QueryParams;//检测
	QueryParams.bTraceComplex = true;//复杂检测
	APawn* SelfPawn = PrimaryPC->GetPawn();
	//忽略自己
	if (SelfPawn)
	{
		QueryParams.AddIgnoredActor(SelfPawn);
	}

	//碰撞到物体就会返回一个bool值
	bool TraceResult = GetWorld()->LineTraceSingleByChannel(HitResult, ViewLoc, ViewEnd,
		ECollisionChannel::ECC_Visibility, QueryParams);

	if (TraceResult)
	{
		Out_LookPoint = HitResult.ImpactPoint;//返回碰撞到的点
	}
	return TraceResult;
}
  • 新建一个材质
    在这里插入图片描述
  • 新建这个类的蓝图
    在这里插入图片描述
  • 新建一个施法Montage
    在这里插入图片描述

技能的取消

  • 右键取消技能
    在这里插入图片描述
    在这里插入图片描述
  • 在敌人蓝图中添加一个向上击飞事件
    在这里插入图片描述
  • 逻辑
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

点燃技能

  • 标准技能一套
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 创建点燃技能Montage
    在这里插入图片描述
  • 在动画蓝图中去发送Gameplay通知
    在这里插入图片描述

编写目标函数

  • 再次新建GameplayAbilityTargetActor类来编写目标
    在这里插入图片描述
  • 实现逻辑
// Fill out your copyright notice in the Description page of Project Settings.


#include "AroundGameplayAbilityTargetActor.h"
#include "Abilities/GameplayAbility.h"

void AAroundGameplayAbilityTargetActor::StartTargeting(UGameplayAbility* Ability)
{
	Super::StartTargeting(Ability);
	// 获取拥有该能力的控制器,并将其转换为 APlayerController 类型
	PrimaryPC = Cast<APlayerController>(Ability->GetOwningActorFromActorInfo()->GetInstigatorController());
}

void AAroundGameplayAbilityTargetActor::ConfirmTargetingAndContinue()
{
	APawn* SelfPawn = PrimaryPC->GetPawn();
	if (!SelfPawn)
	{
		return;
	}

	FVector LookPoint = SelfPawn->GetActorLocation();

	TArray<FOverlapResult> OverlapResults;
	TArray<TWeakObjectPtr<AActor>> OverlapActors;

	FCollisionQueryParams QueryParams;
	QueryParams.bTraceComplex = false;
	QueryParams.bReturnPhysicalMaterial = false;

	if (SelfPawn)
	{
		QueryParams.AddIgnoredActor(SelfPawn);
	}
	// 执行重叠检测,查找指定半径内的所有 Pawn
	bool QueryResult = GetWorld()->OverlapMultiByObjectType(OverlapResults, LookPoint,
		FQuat::Identity, // 旋转(默认为单位四元数)
		FCollisionObjectQueryParams(ECollisionChannel::ECC_Pawn), // 只检测 Pawn 类型的对象
		FCollisionShape::MakeSphere(AroundRadius),// 使用球形碰撞形状,半径为 selectRadius
		QueryParams);

	//有重叠结果添加到 OverlapActors 数组
	if (QueryResult)
	{
		for (int i = 0; i < OverlapResults.Num(); i++)
		{
			APawn* Enemy = Cast<APawn>(OverlapResults[i].GetActor());
			if (Enemy && !OverlapActors.Contains(Enemy))
			{
				OverlapActors.Add(Enemy);
			}
		}
	}

	//存储目标数据
	FGameplayAbilityTargetDataHandle TargetDataHandle;

	if (OverlapActors.Num() > 0)
	{
		//存储找到的敌人
		FGameplayAbilityTargetData_ActorArray* ActorArray = new FGameplayAbilityTargetData_ActorArray();
		//设置找到的敌人
		ActorArray->SetActors(OverlapActors);
		//0号负载
		TargetDataHandle.Add(ActorArray);
	}

	// 检查是否应该生成目标数据
	check(ShouldProduceTargetData());
	// 检查是否允许确认目标
	if (IsConfirmTargetingAllowed())
	{
		// 广播目标数据准备就绪的委托
		TargetDataReadyDelegate.Broadcast(TargetDataHandle);
	}
}
  • 将这个类生成为蓝图
    在这里插入图片描述
  • 添加两个伤害GE,一个是瞬间的伤害,一个灼烧的伤害
    在这里插入图片描述
    在这里插入图片描述
  • 在瞬间扣血的GE中添加上这个点燃后的伤害GE。套娃伤害
    在这里插入图片描述
  • 技能逻辑
    在这里插入图片描述
    在这里插入图片描述

给点燃加个Cue

  • 新建一个GameplayCueNotify_Looping蓝图,然后释放特效,记得添加标签
    在这里插入图片描述
    在这里插入图片描述
  • 然后在灼烧GE里面添加这个Cue标签
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++11~c++20 thread_local

线程局部存储是指对象内存在线程开始后分配&#xff0c;线程结束时回收且每个线程有该对象自己的实例&#xff0c;简单地说&#xff0c;线程局部存储的对象都是独立各个线程的。实际上这并不是一个新鲜个概念&#xff0c;虽然C一直没因在语言层面支持它&#xff0c;但是很早之前…

Coggle数据科学 | 全球AI攻防挑战赛:金融场景凭证篡改检测 baseline

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;全球AI攻防挑战赛&#xff1a;金融场景凭证篡改检测 baseline 赛题名称&#xff1a;全球AI攻防挑战赛—赛道二&#xff08;AI核身-金融场景凭证篡改…

集智书童 | FMRFT 融合Mamba和 DETR 用于查询时间序列交叉鱼跟踪 !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FMRFT 融合Mamba和 DETR 用于查询时间序列交叉鱼跟踪 ! 鱼的生长、异常行为和疾病可以通过图像处理方法进行早期检测&#xff0c;这对工厂水产养殖具有重…

基于云效流水线Flow | 高效构建企业门户网站

基于云效流水线Flow | 高效构建企业门户网站 基于云效流水线Flow | 高效构建企业门户网站企业门户网站方案架构一键部署方案概览部署准备一键部署 部署服务端&#xff08;云效流水线&#xff09;添加流水线源Java构建上传主机部署 资源删除操作体验1&#xff09; 在体验过程中是…

Redis 5 种基本数据类型的前两个详解

Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型是直接提供给用户使用的&…

qos在企业网中的设计与实现

1.拓扑 地址规划 业务地址规划 部门 地址空间 vlan 网关 市场部门 10.0.100.0/24 Vlan100 10.0.100.254/24 研发部门 10.0.101.0/24 Vlan101 10.0.101.254/24 财务部门 10.0.102.0/24 Vlan102 10.0.102.254/24 人力部门 10.0.103.0/24 Vlan103 10.0.103.25…

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

nmap网络连接端扫描软件&#xff0c;用于主机发现、端口扫描、版本侦测、操作系统侦测 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压得到文件 双击.exe文件 更改安装路径并点击安装 等待安装 安装完成 nmap-7.95-setup.zip 夸克网盘打开…

pip install kaggle-environments ISSUE:Failed to build vec-noise

ISSUE: error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/ [end of output]Failed to build vec-noiseC:\ProgramData\miniconda3\include\pyconfig.h(59): fat…

基于Springboot+Vue的家校互联系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

信息安全工程师(41)VPN概述

前言 VPN&#xff0c;即Virtual Private Network&#xff08;虚拟专用网络&#xff09;的缩写&#xff0c;是一种通过公共网络&#xff08;如互联网&#xff09;创建私密连接的技术。 一、定义与工作原理 定义&#xff1a;VPN是依靠ISP&#xff08;Internet Service Provider&…

国庆档不太热,影视股“凉”了?

今年国庆档票房止步21亿元&#xff0c;属实有点差强人意。 根据国家电影局统计&#xff0c;2024年国庆档&#xff08;2024年10月1日至7日&#xff09;全国电影票房为21.04亿元&#xff0c;观影人次为5209万&#xff0c;总票房成绩、观影总人次同比均有所下滑。 作为传统观影高…

AS-REP Roasting 实验

1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. 攻击原理 如果设置了不需要Kerberos预认证&#xff1a; 那么就可以直接发AS_REQ请求TGT票据&#xff0c;由于不要求预身份认证&#xff0…

FLORR.IO画廊(3)

锯齿&#xff08;超级&#xff09; 是florr.io的一种辅助型花瓣&#xff0c;可以用于提升碰撞伤害。玩家装备后&#xff0c;外观会显示出一圈转动的齿轮&#xff0c;就像digdig.io中的玩家一样。不堆叠 圆盘&#xff08;超级&#xff09; 是Florr.io的一种削伤型花瓣&#xff…

女性议题,正在成为喜综困境?

《脱口秀和Ta的朋友们》&#xff08;以下简称《脱友》&#xff09;与《喜剧之王单口季》&#xff08;以下简称《喜单》&#xff09;两档喜综的对垒&#xff0c;竟然意外走向了同一个落点&#xff1a;对女性视角的收割。 #杨笠 这是血肉在疯长的声音# #杨笠 不是敢说是不知道这…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要&#xff1a; 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题&#xff0c;结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法&#xff0c;构建了无人机集群协同对抗推演模型。 针对问题一&#…

绘图库turtle及其应用

一、排雷避坑 1. no attribute ‘pensize’ ① 文件命名避免使用库/模块的名字为名&#xff0c;会报错。 例如&#xff1a;当使用matplotlib库时&#xff0c;将文件名命名为matplotlib.py&#xff0c;会报错 ModuleNotFoundError: No module named ‘matplotlib.pyplot’; ‘…

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…

SameFileMarker:重复文件标记工具

使用智能手机时&#xff0c;因为顾虑存储空间不够&#xff0c;都会定期把占用大量空间的照片视频备份到电脑&#xff0c;但每次备份到电脑的照片&#xff0c;总有一些想随时查看的照片不舍得从手机删掉&#xff0c;于是这些照片在下次手动备份时又会被再次备份。 为了应对这种情…

21.数据结构与算法-遍历二叉树/三种遍历算法/递归遍历/非递归遍历/建立,复制二叉树/求二叉树的深度,节点个数,叶子节点个数

遍历二叉树 遍历方法 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 例题 根据遍历顺序确定二叉树 遍历的算法实现-先序遍历 遍历算法实现-中序遍历 遍历的算法实现-后序遍历 三种算法分析 遍历二叉树的非递归算法-中序遍历 二叉树的层次遍历 建立二叉树 复制二叉树 计算二叉树…

【Linux-SSH远程窗口回传】使用X11或Wayland进行SSH窗口转发

前言 我们通常在进行远程配置板端的时候往往会出现一个问题&#xff0c;在不连接显示屏或者启用VNC服务的前提下(或者使用其他软件提供的功能)&#xff0c;我们无法在远程终端看到板端的新窗口。 例如下图是一个通过远程SSH连接后企图在终端进行OpenCV窗口显示的代码报错 错误…