十三、菜单控件初始化
用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