Изучаем С++ создавая игры в ue4 Уилльям Шериф Изучайте программирование С++ с интересным применением реально мира, что позволит вам создавать ваши собственные игры!



Pdf көрінісі
бет177/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   173   174   175   176   177   178   179   180   ...   252
Применение TArray 
Каждое  сообщение,  которое  мы  хотим  вывести  игроку,  будет  иметь  несколько 
свойств: 

 
Переменная FString для сообщения 

 
Переменная float для времени отображения 

 
Переменная FColor для цвета сообщения 
Так  что  для  нас  есть  смысл  написать  маленькую  функцию  struct,  чтобы  она 
содержала всю эту информацию.  
Вверху MyHUD, введите следующее объявление struct: 
struct Message 

FString message; 
float time; 
FColor color; 
Message() 

// 
Устанавливаем время по умолчания. 
time = 5.f; 
color = FColor::White; 

Message( FString iMessage, float iTime, FColor iColor ) 

message = iMessage; 
time = iTime; 
color = iColor; 

}; 
Примечание 
Улучшенная версия для структуры Message (с цветом фона) в пакете кода для этой 
главы. Здесь мы применили код попроще, чтобы было легче понять главу. 
Теперь, внутри класса AMyHUD, мы хотим добавить TArray этих сообщений. TArray - 
это  специальный  определённый  в  UE4  тип  динамически  увеличивающегося 
массива  С++.  Мы  пройдём  детальное  применение  TArray  в  следующей  главе,  но 
данное  простое  использование  TArray  должно  быть  хорошим  первым 
знакомством, чтобы подпитать ваш интерес к пользе и важности массивов в играх. 
Объявление должно быть как TArray:  
 
UCLASS() 
class GOLDENEGG_API AMyHUD : public AHUD 

GENERATED_UCLASS_BODY() 
// 
Шрифт, используемый для изображения текста в HUD. 
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUDFont) 


179 | 
С т р а н и ц а
 
 
UFont* hudFont; 
// 
Новое! Массив сообщений для отображения 
TArray messages; 
virtual void DrawHUD() override; 
// 
Новое! Функция для возможности добавлять сообщение для отображения 
void addMessage( Message msg ); 
}; 
Теперь,  когда  у  NPC  есть  сообщение  для  отображения,  нам  просто  нужно  будет 
вызвать AMyHud::addMessage() с нашим сообщением. Сообщение будет добавлено 
в  TArray,  массив,  где  находятся  сообщения,  которые  будут  отображены.  Когда 
время для отображения сообщения истекает, оно будет удалено из HUD: 
В файле AMyHUD.cpp, добавьте следующий код: 
 
void AMyHUD::DrawHUD() 

Super::DrawHUD(); 
// 
выполняем итерацию задом наперёд, так что если мы удаляем 
// 
пункт во время итерации, не возникнет никаких проблем 
for( int c = messages.Num() - 1; c >= 0; c-- ) 

// 
изображаем фоновое окно для сообщения 
// 
нужного размера 
float outputWidth, outputHeight, pad=10.f; 
GetTextSize( messages[c].message, outputWidth, outputHeight, hudFont, 
1.f ); 
float messageH = outputHeight + 2.f*pad; 
float x = 0.f, y = c*messageH; 
// 
чёрный фон 
DrawRect( FLinearColor::Black, x, y, Canvas->SizeX, messageH ); 
// 
изображаем наше сообщение используя hudFont 
DrawText( messages[c].message, messages[c].color, x + pad, y + pad, 
hudFont ); 
// 
сокращаем время отображения на время прошедшее 
// 
с последнего кадра. 
messages[c].time -= GetWorld()->GetDeltaSeconds(); 
// 
если время сообщения вышло, удаляем его 
if( messages[c].time < 0 ) 

    messages.RemoveAt( c ); 



void AMyHUD::addMessage( Message msg ) 

messages.Add( msg ); 

Функция  AMyHUD::DrawHUD()  сейчас  изображает  все  сообщения  в  массиве 
messages и упорядочивает каждое сообщение в этом массиве количеству времени 
прошедшему  с  последнего  кадра.  Истёкшие  сообщения  удаляются  из  собрания 
messages, как только их значение time падает ниже 0.   


180 | 
С т р а н и ц а
 
 
Упражнение 
Выполните  рефакторинг  функции  DrawHUD(),  так  чтобы  код,  который  изображает 
сообщения на экране, был в раздельных функциях названных DrawMessages(). 
Переменная  Canvas  доступна  только  в  DrawHUD(),  так  что  вам  будет  нужно 
сохранить Canvas->SizeX и Canvas->SizeY в переменных уровневого класса. 
Примечание 
Рефакторинг означает внутреннюю смену способа работы кода, так чтобы он был 
более организованным и более удобным для чтения, но в то же время имел тот же 
видимый  результат  для  пользователя,  запускающего  программу.  Зачастую 
рефакторинг это хорошая практика. Причина, по которой проводится рефакторинг 
– в том, что никто на момент начала написания кода, не знает,  как должен будет 
выглядеть код в итоге.   


Достарыңызбен бөлісу:
1   ...   173   174   175   176   177   178   179   180   ...   252




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет