十二、进入游戏控件

实现选择存档控件

实现写入存档

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忘了删
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51032168/article/details/121487254