显示UI,需要继承HUD这个类:
创建基于PacManHUD的蓝图类
我们自定义的HUDFont需要指定字体:视图选项中 勾选 显示引擎内容,方可选择 RobotoDistanceField 字体。
修改完蓝图需要编辑保存
对 BP_PacManGameMode 的 HUD Class 指定成我们刚刚转化的 BP_PacManHUD 。
Canvas->SizeX / 2.0f , Canvas->SizeY / 2.0f 显示的文字不在正中间
PacManHUD.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "PacManHUD.generated.h"
/**
*
*/
UCLASS()
class PACMAN_API APacManHUD : public AHUD
{
GENERATED_BODY()
public:
// UFont 字体,显示的文字,字体,为了寻找字体方便,修改字体方便,一个蓝图类来继承它,在蓝图中修改字体
// EditAnyWhere 在哪块都能修改
// BlueprintReadWrite 表示可以在蓝图中修改这个属性/定义
// Category 分类,分到HUDFont类中去
UPROPERTY(EditAnyWhere,BlueprintReadWrite,Category=HUDFont)
UFont* HUDFont;
// 介绍一个函数,这个函数很重要,在屏幕上显示文字,靠这个函数来实现的
// DrawHUD 就像 Tick 一样,每帧调用一次,这样把我输入的文字显示在屏幕上
virtual void DrawHUD() override;
};
PacManHUD.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "Public/PacManHUD.h"
#include "PacManGameModeBase.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/Canvas.h"
#include "Public/PacManCharacter.h"
void APacManHUD::DrawHUD()
{
// 获得当前的游戏模式
class APacManGameModeBase* GameMode = Cast<APacManGameModeBase>(UGameplayStatics::GetGameMode(this));
// 根据不同的状态,显示不同的文字
switch (GameMode->GetCurrentState())
{
case EGameState::EMenu:
// 显示文字的函数,
// 第一个参数:需要显示的文字;
// 第二个参数:文字的颜色;
// 第三个参数:获得横的屏幕的宽度;
// 第四个参数:获得纵的屏幕的长度
// 第五个参数:显示的字体
// (Canvas->SizeX/2.0f) 就是在屏幕中间
// 使用 Canvas 需要引入头文件:#include "Engine/Canvas.h"
// 向下,向右为正方向,为了移动正中心,进行了减法运算到屏幕中间
DrawText(TEXT("Welcome To PacMan!\n\nN to start a new game \nP to pause the game"), FColor::White, (Canvas->SizeX / 2.0f) - 150.0f, (Canvas->SizeY / 2.0f) - 100.0f, HUDFont);
break;
case EGameState::EPlaying:
{// 这个括号需要
// 获得主角,0 表示第一个玩家,场景只有一个玩家
APacManCharacter* PacMan = Cast<APacManCharacter>(UGameplayStatics::GetPlayerPawn(this, 0));
if (PacMan)
{
// FString::FromInt() 将 int类型的变量转换成字符串
FString LiveString = TEXT("Lives: ") + FString::FromInt(PacMan->Lives);
DrawText(LiveString, FColor::Green, 50, 50, HUDFont);
FString CollectablesToEatString = TEXT("CollectablesToEat: ") + FString::FromInt(PacMan->CollectablesToEat);
DrawText(CollectablesToEatString, FColor::Green, Canvas->SizeX - 150, 50, HUDFont);
}
}// 这个括号需要
break;
case EGameState::EPause:
DrawText(TEXT("P To Continue"), FColor::White, (Canvas->SizeX / 2.0f) - 150.0f, (Canvas->SizeY / 2.0f) - 100.0f, HUDFont);
break;
case EGameState::EWin:
DrawText(TEXT("You Win!\n\n R for another"), FColor::White, (Canvas->SizeX / 2.0f) - 150.0f, (Canvas->SizeY / 2.0f) - 100.0f, HUDFont);
break;
case EGameState::EGameOver:
DrawText(TEXT("CameOver!\n\nR for another"), FColor::White, (Canvas->SizeX / 2.0f) - 150.0f, (Canvas->SizeY / 2.0f) - 100.0f, HUDFont);
break;
default:
break;
}
}
PacManCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PacManGameModeBase.h"
#include "PacManCharacter.generated.h"
UCLASS()
class PACMAN_API APacManCharacter : public ACharacter
{
// 改成了Public可供PacManHUD显示调用
public:
// 需要吃的 豆 的数量
int CollectablesToEat;
// 当前的生命值
int Lives;
};