十二、进入游戏控件
实现选择存档控件
实现写入存档
SlAiNewGameWidget.h
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class SLAICOURSE_API SSlAiNewGameWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSlAiNewGameWidget)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
//是否可以进入游戏
bool AllowEnterGame();
private:
//输入框指针
TSharedPtr<class SEditableTextBox> EditTextBox;
};
SlAiNewGameWidget.cpp
#include "SSlAiNewGameWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include "SlAiMenuWidgetStyle.h"
#include"SBox.h"
#include"STextBlock.h"
#include"SOverlay.h"
#include"SImage.h"
#include"SEditableTextBox.h"
#include"SlAiDataHandle.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiNewGameWidget::Construct(const FArguments& InArgs)
{
ChildSlot
[
SNew(SBox)
.WidthOverride(500.f)
.HeightOverride(100.f)
[
SNew(SOverlay)
+SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SImage)
.Image(&SlAiStyle::GetMenuStyle()->MenuItemBrush)
]
+SOverlay::Slot()
.HAlign(HAlign_Left)
.VAlign(VAlign_Center)
.Padding(FMargin(20.f,0.f,0.f,0.f))
[
SNew(STextBlock)
.Font(SlAiStyle::GetMenuStyle()->Font_40)
.Text(NSLOCTEXT("SlAiMenu","NewGame","NewGame"))
]
+ SOverlay::Slot()
.HAlign(HAlign_Right)
.VAlign(VAlign_Center)
.Padding(FMargin(0.f,0.f,20.f,0.f))
[
SNew(SBox)
.WidthOverride(300.f)
.HeightOverride(60.f)
]
[
SAssignNew(EditTextBox,SEditableText)
//文本框中没有文本时出现的提示文本
.HintText(NSLOCTEXT("SlAiMenu","RecordNameHint","Input Record Name!"))
.Font(SlAiStyle::GetMenuStyle()->Font_30)
]
]
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
bool SSlAiNewGameWidget::AllowEnterGame()
{
//获取输入的新存档名
FText InputText = EditTextBox->GetText();
//文字是否为空
if (InputText.ToString().IsEmpty()) return false;
//查询存档是否重名
for (TArray<FString>::TIterator It(SlAiDataHandle::Get()->RecordDataList); It; ++It)
{
if ((*It).Equals(InputText.ToString()))
{
//设置TextBox为空
EditTextBox->SetText(FText::FromString(""));
//修改Hint为存档名重复
EditTextBox->SetHintText(NSLOCTEXT("SlAiMenu", "NameRepeatHint", "Record Name Repeated!"));
//返回false
return false;
}
}
//保存新的存档名
SlAiDataHandle::Get()->RecordName = InputText.ToString();
return true;
}
将SlAiNewGameWidget插入菜单控件
//将SSlAiNewGameWidget插入ContentBox
ContentBox->AddSlot()
[
SNew(SSlAiNewGameWidget)
];
处理存档名
初始化存档名为空
SlAiDataHandle.h
public:
//存档名
FString RecordName;
SlAiDataHandle.cpp
SlAiDataHandle::SlAiDataHandle()
{
//初始化存档数据
InitRecordData();
}
void SlAiDataHandle::InitRecordData()
{
RecordName = FString("");
}
实现选择存档
SlAiChooseRecordWidget .h
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class SLAICOURSE_API SSlAiChooseRecordWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSlAiChooseRecordWidget)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
//更新存档名
void UpdateRecordName();
private:
//下拉菜单
TSharedPtr<class STextComboBox> RecordComboBox;
//字符指针数组
TArray<TSharedPtr<FString>> OptionsSource;
};
SlAiChooseRecordWidget .cpp
#include "SSlAiChooseRecordWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include "SlAiMenuWidgetStyle.h"
#include"SBox.h"
#include"STextBlock.h"
#include"SOverlay.h"
#include"SImage.h"
#include"STextComboBox.h"
#include"SlAiDataHandle.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiChooseRecordWidget::Construct(const FArguments& InArgs)
{
//初始化下拉菜单数据
for (TArray<FString>::TIterator It(SlAiDataHandle::Get()->RecordDataList); It; ++It)
{
OptionsSource.Add(MakeShareable(new FString(*It)));
}
ChildSlot
[
SNew(SBox)
.WidthOverride(500.f)
.HeightOverride(100.f)
[
SNew(SOverlay)
+SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SImage)
.Image(&SlAiStyle::GetMenuStyle()->MenuItemBrush)
]
+SOverlay::Slot()
.HAlign(HAlign_Left)
.VAlign(VAlign_Center)
.Padding(FMargin(20.f,0.f,0.f,0.f))
[
SNew(STextBlock)
.Font(SlAiStyle::GetMenuStyle()->Font_40)
.Text(NSLOCTEXT("SlAiMenu","NewGame","NewGame"))
]
+ SOverlay::Slot()
.HAlign(HAlign_Right)
.VAlign(VAlign_Center)
.Padding(FMargin(0.f,0.f,20.f,0.f))
[
SNew(SBox)
.WidthOverride(300.f)
.HeightOverride(60.f)
]
[
SAssignNew(RecordComboBox,STextComboBox)
.Font(SlAiStyle::GetMenuStyle()->Font_30)
.OptionsSource(&OptionsSource)
]
]
];
//设置默认的选项
RecordComboBox->SetSelectedItem(OptionsSource[0]);
}
void SSlAiChooseRecordWidget::UpdateRecordName()
{
//修改存档名
SlAiDataHandle::Get()->RecordName = *RecordComboBox->GetSelectedItem().Get();
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
将SlAiChooseRecordWidget插入菜单控件
//将SSlAiChooseRecordWidget插入ContentBox
ContentBox->AddSlot()
[
SNew(SSlAiChooseRecordWidget)
];
Debug忘了删