IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 三十七、绘制背包UI -> 正文阅读

[C++知识库]三十七、绘制背包UI

背包控件以及四个子控件

背包子控件的基类

#pragma once

#include "CoreMinimal.h"
#include"SlAiTypes.h"
#include "SCompoundWidget.h"

/**
 * 
 */
class SLAICOURSE_API SSlAiContainerBaseWidget : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiContainerBaseWidget)
	{}

	SLATE_ATTRIBUTE(int,WorkIndex)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);

	//获取实例
	static TSharedPtr<SSlAiContainerBaseWidget> CreateContainer(EContainerType::Type NeedType, int WorkId);

protected:

	//工作序号,用于标记在背包中的位置作用
	TAttribute<int> WorkIndex;

	//容器各个组件
	TSharedPtr<class SBorder> ContainerBorder;
	TSharedPtr<SBorder> ObjectImage;
	TSharedPtr<class STextBlock> ObjectNumText;

};

#include "SSlAiContainerBaseWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include"SlAiGameWidgetStyle.h"
#include"SBorder.h"
#include"STextBlock.h"

#include"SSlAiContainerNormalWidget.h"
#include"SSlAiContainerInputWidget.h"
#include"SSlAiContainerShortcutWidget.h"
#include"SSlAiContainerOutputWidget.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiContainerBaseWidget::Construct(const FArguments& InArgs)
{
	//获取工作序号
	WorkIndex = InArgs._WorkIndex;
	
	ChildSlot
	[
		SAssignNew(ContainerBorder,SBorder)
		.BorderImage(&SlAiStyle::GetGameStyle()->NormalContainerBrush)
		.Padding(FMargin(8.f))
		[
			SAssignNew(ObjectImage,SBorder)
			.BorderImage(&SlAiStyle::GetGameStyle()->EmptyBrush)
		.HAlign(HAlign_Right)
		.VAlign(VAlign_Bottom)
		.Padding(FMargin(0.f,0.f,4.f,0.f))
		[
			SAssignNew(ObjectNumText,STextBlock)
			.Font(SlAiStyle::GetGameStyle()->Font_Outline_16)
		.ColorAndOpacity(SlAiStyle::GetGameStyle()->FontColor_Black)
		]
		]
	];
	
}

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

TSharedPtr<SSlAiContainerBaseWidget> SSlAiContainerBaseWidget::CreateContainer(EContainerType::Type NeedType, int WorkId)
{
	TSharedPtr<SSlAiContainerBaseWidget> ResultContainer;

	switch (NeedType)
	{
	case EContainerType::Output:
		SAssignNew(ResultContainer, SSlAiContainerOutputWidget).WorkIndex(WorkId);
		break;
		case EContainerType::Input:
		SAssignNew(ResultContainer, SSlAiContainerInputWidget).WorkIndex(WorkId);
		break;
		case EContainerType::Normal:
		SAssignNew(ResultContainer, SSlAiContainerNormalWidget).WorkIndex(WorkId);
		break;
		case EContainerType::Shortcut:
		SAssignNew(ResultContainer, SSlAiContainerShortcutWidget).WorkIndex(WorkId);
		break;
	}
	return ResultContainer;
}

背包子快捷栏类

#pragma once

#include "CoreMinimal.h"
#include "SSlAiContainerBaseWidget.h"

/**
 * 
 */
class SLAICOURSE_API SSlAiContainerShortcutWidget : public SSlAiContainerBaseWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiContainerShortcutWidget)
	{}

	SLATE_ATTRIBUTE(int,WorkIndex)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);
};
#include "SSlAiContainerShortcutWidget.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiContainerShortcutWidget::Construct(const FArguments& InArgs)
{
	SSlAiContainerBaseWidget::Construct(SSlAiContainerBaseWidget::FArguments().WorkIndex(InArgs._WorkIndex));
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

背包输入台

#pragma once

#include "CoreMinimal.h"
#include "SSlAiContainerBaseWidget.h"

/**
 * 
 */
class SLAICOURSE_API SSlAiContainerInputWidget : public SSlAiContainerBaseWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiContainerInputWidget)
	{}

	SLATE_ATTRIBUTE(int,WorkIndex)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);
};

#include "SSlAiContainerInputWidget.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiContainerInputWidget::Construct(const FArguments& InArgs)
{
	SSlAiContainerBaseWidget::Construct(SSlAiContainerBaseWidget::FArguments().WorkIndex(InArgs._WorkIndex));
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

背包主物品类

#pragma once

#include "CoreMinimal.h"
#include "SSlAiContainerBaseWidget.h"

/**
 * 
 */
class SLAICOURSE_API SSlAiContainerNormalWidget : public SSlAiContainerBaseWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiContainerNormalWidget)
	{}

	SLATE_ATTRIBUTE(int,WorkIndex)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);
};
#include "SSlAiContainerNormalWidget.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiContainerNormalWidget::Construct(const FArguments& InArgs)
{
	SSlAiContainerBaseWidget::Construct(SSlAiContainerBaseWidget::FArguments().WorkIndex(InArgs._WorkIndex));
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

背包输出台类

#pragma once

#include "CoreMinimal.h"
#include "SSlAiContainerBaseWidget.h"

/**
 * 
 */
class SLAICOURSE_API SSlAiContainerOutputWidget : public SSlAiContainerBaseWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiContainerOutputWidget)
	{}

	SLATE_ATTRIBUTE(int,WorkIndex)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);
};
#include "SSlAiContainerOutputWidget.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiContainerOutputWidget::Construct(const FArguments& InArgs)
{
	SSlAiContainerBaseWidget::Construct(SSlAiContainerBaseWidget::FArguments().WorkIndex(InArgs._WorkIndex));
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

在GameMode声明 初始化背包管理类委托

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "SlAiGameMode.generated.h"


//初始化背包管理类委托
DECLARE_DELEGATE(FInitPackageManager)

/**
 * 
 */
UCLASS()
class SLAICOURSE_API ASlAiGameMode : public AGameModeBase
{
	GENERATED_BODY()
	
public:

	ASlAiGameMode();

	//重写帧函数
	virtual void Tick(float DeltaSeconds) override;
	
	//组件赋值,给GameHUD调用,避免空引用引起奔溃
	void InitGamePlayModule();

public:

	class ASlAiPlayerController* SPController;

	class ASlAiPlayerCharacter* SPCharacter;

	class ASlAiPlayerState* SPState;

	//初始化背包管理委托,绑定的方法是PackageWidget的InitPackageManager方法
	FInitPackageManager InitPackageManager;

protected:

	virtual void BeginPlay() override;

	//初始化背包管理类
	void InitializePackage();

private:
	
	//是否以及初始化背包
	bool IsInitPackage;

};
#include "SlAiGameMode.h"
#include"SlAiDataHandle.h"
#include"SlAiGameInstance.h"
#include"SlAiHelper.h"
#include"Kismet/GameplayStatics.h"
#include"SlAiGameHUD.h"
#include"SlAiPlayerController.h"
#include"SlAiPlayerState.h"
#include"SlAiPlayerCharacter.h"

ASlAiGameMode::ASlAiGameMode()
{
	PrimaryActorTick.bCanEverTick = true;
	//添加组件
	HUDClass = ASlAiGameHUD::StaticClass();
	PlayerControllerClass = ASlAiPlayerController::StaticClass();
	PlayerStateClass = ASlAiPlayerState::StaticClass();
	DefaultPawnClass = ASlAiPlayerCharacter::StaticClass();

	//开始没有初始化背包
	IsInitPackage = false;
}

void ASlAiGameMode::Tick(float DeltaSeconds)
{
	InitializePackage();
}

void ASlAiGameMode::InitGamePlayModule()
{
	//添加引用
	SPController = Cast<ASlAiPlayerController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
	SPCharacter = Cast<ASlAiPlayerCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
	SPState = Cast<ASlAiPlayerState>(SPController->PlayerState);
}

void ASlAiGameMode::BeginPlay()
{
	//初始化游戏数据
	SlAiDataHandle::Get()->InitializeGameData();

	if (!SPController) InitGamePlayModule();

}

void ASlAiGameMode::InitializePackage()
{
	if (IsInitPackage) return;
	//叫PackageWidget初始化背包管理器
	InitPackageManager.ExecuteIfBound();

	IsInitPackage = true;
}

在背包控件初始化背包

#pragma once

#include "CoreMinimal.h"
#include"SlAiTypes.h"
#include "Widgets/SCompoundWidget.h"


/**
 * 
 */
class SLAICOURSE_API SSlAiPackageWidget : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SSlAiPackageWidget)
	{}
	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);

	//注册背包管理器事件,由PlayerCharacter的InitPackageManager的委托进行调用
	void InitPackageManager();

private:

	//快捷栏表格
	TSharedPtr<class SUniformGridPanel> ShortcutGrid;

	//背包表格
	TSharedPtr<SUniformGridPanel> PackageGrid;

	//合成表表格
	TSharedPtr<SUniformGridPanel> CompoundGrid;

	//输出容器
	TSharedPtr<class SBorder> OutputBorder;

};

#include "SSlAiPackageWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include"SlAiGameWidgetStyle.h"
#include"SBox.h"
#include"SImage.h"
#include"SOverlay.h"
#include"SUniformGridPanel.h"

#include"SSlAiContainerBaseWidget.h"


BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiPackageWidget::Construct(const FArguments& InArgs)
{
	ChildSlot
	[
		//背包填充全屏幕
		SNew(SOverlay)

		//背包
		+SOverlay::Slot()
		.HAlign(HAlign_Right)
		.VAlign(VAlign_Center)
		.Padding(FMargin(0.f,0.f,50.f,0.f))
		[
			SNew(SBox)
			.WidthOverride(800.f)
		.HeightOverride(800.f)
		[
			SNew(SOverlay)

			//背景图
		+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		[
			SNew(SImage)
			.Image(&SlAiStyle::GetGameStyle()->PackageBGBrush)
		]

	//底部快捷栏
	+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(40.f,680.f,40.f,40.f))
		[
			SAssignNew(ShortcutGrid,SUniformGridPanel)
		]

	//背包主体
	+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(40.f,320.f,40.f,160.f))
		[
			SAssignNew(PackageGrid,SUniformGridPanel)
		]

	//合成表输入框
	+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(80.f,40.f,480.f,520.f))
		[
			SAssignNew(CompoundGrid,SUniformGridPanel)
		]

	//合成表输出框
	+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(560.f,120.f,160.f,600.f))
		[
			SAssignNew(OutputBorder,SBorder)
		]

	//合成小箭头
	+SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(400.f,120.f,320.f,600.f))
		[
			SNew(SImage)
			.Image(&SlAiStyle::GetGameStyle()->CompoundArrowBrush)
		]

		]
		]

	];
}

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

void SSlAiPackageWidget::InitPackageManager()
{
	//初始化快捷栏
	for (int i = 0; i < 9; ++i)
	{
		//创建容器实例
		TSharedPtr<SSlAiContainerBaseWidget> NewContainer = SSlAiContainerBaseWidget::CreateContainer(EContainerType::Shortcut, i);
		//将容器添加到UI
		ShortcutGrid->AddSlot(i, 0)[NewContainer->AsShared()];
	}

	//初始化背包主体
	for (int i = 0; i < 36; ++i)
	{
		TSharedPtr<SSlAiContainerBaseWidget> NewContainer = SSlAiContainerBaseWidget::CreateContainer(EContainerType::Normal, i);
		PackageGrid->AddSlot(i % 9, i / 9)[NewContainer->AsShared()];
	}

	//初始化合成台
	for (int i = 0; i < 9; ++i)
	{
		TSharedPtr<SSlAiContainerBaseWidget> NewContainer = SSlAiContainerBaseWidget::CreateContainer(EContainerType::Input, i);
		CompoundGrid->AddSlot(i % 3, i / 3)[NewContainer->AsShared()];
	}

	//初始化输出容器
	TSharedPtr<SSlAiContainerBaseWidget> NewContainer = SSlAiContainerBaseWidget::CreateContainer(EContainerType::Output, 1);
	OutputBorder->SetContent(NewContainer->AsShared());
}

在GameHUD绑定委托

//初始化背包管理器到背包组件
	GM->InitPackageManager.BindRaw(GameHUDWidget->PackageWidget.Get(), &SSlAiPackageWidget::InitPackageManager);

运行

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:31:50  更:2021-12-01 17:32:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:36:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码