十三、菜单控件初始化

用TMap保存菜单的下属组件

SlAiMenuWidget.h

#pragma once

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




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

	SLATE_END_ARGS()

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

private:

	void MenuItemOnClicked(EMenuItem::Type ItemType);

	//修改语言
	void ChangeCulture(ECultureTeam Culture);
	//修改音量
	void ChangVolume(const float MusicVal, const float SoundVal);
	//初始化所有的控件
	void InitializeMenuList();
	//选择显示的界面
	void ChooseWidget(EMenuType::Type WidgetType);
	//修改菜单的大小
	void ResetWidgetSize(float NewWidget, float NewHeight);


private:

	//获取Menu样式
	//const struct FSlAiMenuStyle* MenuStyle;

	//保存根节点
	TSharedPtr<class SBox> RootSizeBox;
	//保存标题
	TSharedPtr<class STextBlock> TitleText;
	//用来保存垂直列表
	TSharedPtr<class SVerticalBox> ContentBox;
	//保存菜单组
	TMap<EMenuType::Type, TSharedPtr<struct MenuGroup>> MenuMap;
	//游戏设置Widget的指针引用
	TSharedPtr<class SSlAiGameOptionWidget> GameOptionWidget;
	//新游戏控件指针
	TSharedPtr<class SSlAiNewGameWidget> NewGameWidget;
	//选择存档控件指针
	TSharedPtr<class SSlAiChooseRecordWidget> ChooseRecordWidget;


	
};

SlAiMenuWidget.cpp

#include "SSlAiMenuWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include "SlAiMenuWidgetStyle.h"
#include"SBox.h"
#include"SImage.h"
#include"SBorder.h"
#include"STextBlock.h"
#include"SBoxPanel.h"

#include "SSlAiMenuItemWidget.h"
#include "SSlAiGameOptionWidget.h"
#include "SSlAiNewGameWidget.h"
#include "SSlAiChooseRecordWidget.h"

#include"SlAiDataHandle.h"

struct MenuGroup
{
    
    
	//菜单标题
	FText MenuName;
	//菜单高度
	float MenuHeight;
	//下属组件
	TArray<TSharedPtr<SCompoundWidget>> ChildWidget;
	//构造函数
	MenuGroup(const FText Name, const float Height, TArray<TSharedPtr<SCompoundWidget>>* Children)
	{
    
    
		MenuName = Name;
		MenuHeight = Height;
		//ChildWidget = *Children;
		for (TArray<TSharedPtr<SCompoundWidget>>::TIterator It(*Children); It; ++It)
		{
    
    
			ChildWidget.Add(*It);
		}
	}
};


BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiMenuWidget::Construct(const FArguments& InArgs)
{
    
    



	ChildSlot
		[
			//菜单背景图片
			SAssignNew(RootSizeBox, SBox)
			[
				SNew(SOverlay)
				+ SOverlay::Slot()
		.HAlign(HAlign_Fill)
		.VAlign(VAlign_Fill)
		.Padding(FMargin(0.f, 50.f, 0.f, 0.f))
		[
			SNew(SImage)
			.Image(&SlAiStyle::GetMenuStyle()->MenuBackgroundBrush)
		]


	//菜单左侧图标
	+SOverlay::Slot()
		.HAlign(HAlign_Left)
		.VAlign(VAlign_Center)
		.Padding(FMargin(0.f, 25.f, 0.f, 0.f))
		[
			SNew(SImage)
			.Image(&SlAiStyle::GetMenuStyle()->LeftIconBrush)
		]


	//菜单右侧图标
	+SOverlay::Slot()
		.HAlign(HAlign_Right)
		.VAlign(VAlign_Center)
		.Padding(FMargin(0.f, 25.f, 0.f, 0.f))
		[
			SNew(SImage)
			.Image(&SlAiStyle::GetMenuStyle()->RightIconBrush)
		]

	//菜单标题
	+ SOverlay::Slot()
		.HAlign(HAlign_Center)
		.VAlign(VAlign_Top)
		[
			SNew(SBox)
			.WidthOverride(400.f)
		.HeightOverride(100.f)
		[
			SNew(SBorder)
			.BorderImage(&SlAiStyle::GetMenuStyle()->TitleBorderBrush)
		.HAlign(HAlign_Center)
		.VAlign(VAlign_Center)
		[
			SAssignNew(TitleText, STextBlock)
			.Font(SlAiStyle::GetMenuStyle()->MenuFont)
		.Text(NSLOCTEXT("SlAiMenu", "Menu", "Menu"))
		]
		]
		]


	+ SOverlay::Slot()
		.HAlign(HAlign_Center)
		.VAlign(VAlign_Top)
		.Padding(FMargin(0.f, 130.f, 0.f, 0.f))
		[
			//创建一个SVerticalBox
			SAssignNew(ContentBox, SVerticalBox)
		]
			]
		];


	InitializeMenuList();

}


END_SLATE_FUNCTION_BUILD_OPTIMIZATION


void SSlAiMenuWidget::MenuItemOnClicked(EMenuItem::Type ItemType)
{
    
    

}

void SSlAiMenuWidget::ChangeCulture(ECultureTeam Culture)
{
    
    
	SlAiDataHandle::Get()->ChangeLocalzationCulture(Culture);
}

void SSlAiMenuWidget::ChangVolume(const float MusicVal, const float SoundVal)
{
    
    
	SlAiDataHandle::Get()->ResetMenuVolume(MusicVal, SoundVal);
}

void SSlAiMenuWidget::InitializeMenuList()
{
    
    
	//设置RootBox的大小
	RootSizeBox->SetWidthOverride(600.f);
	RootSizeBox->SetHeightOverride(510.f);

	//实例化主界面
	//将三个控件添加进MainMenuList
	TArray<TSharedPtr<SCompoundWidget>> MainMenuList;
	//开始游戏
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "StartGame", "StartGame"))
		.ItemType(EMenuItem::StartGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));
	//游戏设置
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GameOption", "GameOption"))
		.ItemType(EMenuItem::GameOption)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));
	//退出游戏
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "QuitGame", "QuitGame"))
		.ItemType(EMenuItem::QuitGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));
	
	//构造MenuMap 下属组件为MainMenuList
	MenuMap.Add(EMenuType::MainMenu, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "Menu", "Menu"), 510.f, &MainMenuList)));


	//开始游戏界面
	TArray<TSharedPtr<SCompoundWidget>> StartGameList;
	StartGameList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "NewGame", "NewGame"))
		.ItemType(EMenuItem::NewGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	StartGameList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "LoadRecord", "LoadRecord"))
		.ItemType(EMenuItem::LoadRecord)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	StartGameList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GoBack", "GoBack"))
		.ItemType(EMenuItem::StartGameGoBack)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	MenuMap.Add(EMenuType::StartGame, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "StartGame", "StartGame"), 510.f, &StartGameList)));


	//游戏设置界面
	TArray<TSharedPtr<SCompoundWidget>> GameOptionList;

	//实例化游戏设置的Widget
	SAssignNew(GameOptionWidget, SSlAiGameOptionWidget)
		.ChangeCulture(this, &SSlAiMenuWidget::ChangeCulture)
		.ChangeVolume(this, &SSlAiMenuWidget::ChangVolume);

	//添加控件到数组
	GameOptionList.Add(GameOptionWidget);
	GameOptionList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GoBack", "GoBack"))
		.ItemType(EMenuItem::GameOptionGoBack)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	MenuMap.Add(EMenuType::GameOption, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "GameOption", "GameOption"), 610.f, &GameOptionList)));

	//开始新游戏界面
	TArray<TSharedPtr<SCompoundWidget>> NewGameList;

	SAssignNew(NewGameWidget, SSlAiNewGameWidget);
	NewGameList.Add(NewGameWidget);
	NewGameList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "EnterGame", "EnterGame"))
		.ItemType(EMenuItem::EnterGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	NewGameList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GoBack", "GoBack"))
		.ItemType(EMenuItem::NewGameGoBack)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	MenuMap.Add(EMenuType::NewGame, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "NewGame", "NewGame"), 510.f, &NewGameList)));

	//选择存档界面
	TArray<TSharedPtr<SCompoundWidget>> ChooseRecordList;
	SAssignNew(ChooseRecordWidget, SSlAiChooseRecordWidget);
	ChooseRecordList.Add(ChooseRecordWidget);

	ChooseRecordList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "EnterRecord", "EnterRecord"))
		.ItemType(EMenuItem::EnterRecord)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	ChooseRecordList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GoBack", "GoBack"))
		.ItemType(EMenuItem::ChooseRecordGoBack)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

	MenuMap.Add(EMenuType::ChooseRecord, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "LoadRecord", "LoadRecord"), 510.f, &ChooseRecordList)));

//选择主界面
	ChooseWidget(EMenuType::MainMenu);
}


void SSlAiMenuWidget::ChooseWidget(EMenuType::Type WidgetType)
{
    
    
	//移除所有组件
	ContentBox->ClearChildren();
	//如果MenuType是None
	if (WidgetType == EMenuType::None) return;
	//循环添加组件
	for (TArray<TSharedPtr<SCompoundWidget>>::TIterator It((*MenuMap.Find(WidgetType))->ChildWidget); It; ++It)
	{
    
    
		ContentBox->AddSlot().AutoHeight()[(*It)->AsShared()];
	}
	//更改标题
	TitleText->SetText((*MenuMap.Find(WidgetType))->MenuName);
	//修改Size
	ResetWidgetSize(600.f, (*MenuMap.Find(WidgetType))->MenuHeight);
}

//如果不修改高度,NewHeight传入-1
void SSlAiMenuWidget::ResetWidgetSize(float NewWidget, float NewHeight)
{
    
    
	RootSizeBox->SetWidthOverride(NewWidget);
	if (NewHeight < 0) return;
	RootSizeBox->SetHeightOverride(NewHeight);
}

运行

在这里插入图片描述

将组件添加进数组

//实例化主界面
	//将三个控件添加进MainMenuList
	TArray<TSharedPtr<SCompoundWidget>> MainMenuList;
	//开始游戏
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "StartGame", "StartGame"))
		.ItemType(EMenuItem::StartGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));
	//游戏设置
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "GameOption", "GameOption"))
		.ItemType(EMenuItem::GameOption)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));
	//退出游戏
	MainMenuList.Add(SNew(SSlAiMenuItemWidget)
		.ItemText(NSLOCTEXT("SlAiMenu", "QuitGame", "QuitGame"))
		.ItemType(EMenuItem::QuitGame)
		.OnClicked(this, &SSlAiMenuWidget::MenuItemOnClicked));

构造MenuMap

//构造MenuMap 下属组件为MainMenuList
	MenuMap.Add(EMenuType::MainMenu, MakeShareable(new MenuGroup(NSLOCTEXT("SlAiMenu", "Menu", "Menu"), 510.f, &MainMenuList)));

ChooseWidget

移除所有组件—(if)—添加组件-------更改标题----------修改Size

猜你喜欢

转载自blog.csdn.net/m0_51032168/article/details/121491291
今日推荐