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 в переменных уровневого класса.
Примечание
Рефакторинг означает внутреннюю смену
способа работы кода, так чтобы он был
более организованным и более удобным для чтения, но в то же время имел тот же
видимый результат для пользователя, запускающего программу. Зачастую
рефакторинг это хорошая практика. Причина, по которой проводится рефакторинг
– в том, что никто на момент начала написания кода, не знает, как должен будет
выглядеть код в итоге.
Достарыңызбен бөлісу: