215 |
С т р а н и ц а
Далее, мы объявляем функцию, которая будет визуализировать графические
элементы на экране, в классе AMyHUD:
void AMyHUD::DrawWidgets()
{
for( int c = 0; c < widgets.Num(); c++ )
{
DrawTexture( widgets[c].icon.tex, widgets[c].pos.X, widgets[c].pos.Y, widgets[c].size.X,
widgets[c].size.Y, 0, 0, 1, 1 );
DrawText( widgets[c].icon.name, FLinearColor::Yellow, widgets[c].pos.X, widgets[c].pos.Y,
hudFont, .6f, false );
}
}
Вызов функции DrawWidgets() должен быть добавлен к функции DrawHUD():
void AMyHUD::DrawHUD()
{
Super::DrawHUD();
// dims
существуют только здесь в stock переменной Canvas
// Обновите их, чтобы использовать в addWidget()
dims.X = Canvas->SizeX;
dims.Y = Canvas->SizeY;
DrawMessages();
DrawWidgets();
}
Далее, мы заполним функцию ToggleInventory() (ПереключатьИнвентарь). Вот
функция, которая запускается, когда пользователь нажимает
I:
void AAvatar::ToggleInventory()
{
//
Получаем контроллер и HUD
APlayerController* PController = GetWorld()- >GetFirstPlayerController();
AMyHUD* hud = Cast
( PController->GetHUD() );
// Если инвентарь отображается, то прекращаем отображать его.
if( inventoryShowing )
{
hud->clearWidgets();
inventoryShowing = false;
PController->bShowMouseCursor = false;
return;
}
//
Иначе отображаем инвентарь игрока
inventoryShowing = true;
PController->bShowMouseCursor = true;
for( TMap::TIterator it = Backpack.CreateIterator(); it; ++it )
{
// Комбинируем имя предмета с количеством, то есть Cow x 5
FString fs = it->Key + FString::Printf( TEXT(" x %d"), it- >Value );
UTexture2D* tex;
if( Icons.Find( it->Key ) )
tex = Icons[it->Key];
hud->addWidget( Widget( Icon( fs, tex ) ) );
}
}
216 |
С т р а н и ц а
Чтобы компилировать предыдущий код, нам нужно добавить
функцию в AMyHUD:
void AMyHUD::addWidget( Widget widget )
{
//
находим положение графического элемента, расположенного в сетке.
//
изображаем значки...
FVector2D start( 200, 200 ), pad( 12, 12 );
widget.size = FVector2D( 100, 100 );
widget.pos = start;
//
вычисляем
положение здесь
for( int c = 0; c < widgets.Num(); c++ )
{
//
Немного смещаем положение вправо.
widget.pos.X += widget.size.X + pad.X;
//
Если справа больше нет места, то
//
переходим на
следующую строку
if( widget.pos.X + widget.size.X > dims.X )
{
widget.pos.X = start.X;
widget.pos.Y += widget.size.Y + pad.Y;
}
}
widgets.Add( widget );
}
Мы продолжаем применять переменную типа Boolean в inventoryShowing, чтобы
сообщать нам отображается ли сейчас инвентарь или нет. Когда инвентарь
показан, мы также показываем мышь, чтобы пользователь знал на, что он
нажимает. Также когда отображается инвентарь, свободно движение игрока
невозможно. Самый лёгкий
способ отключить свободное движение игрока, просто
вернуться из
функции движения, до самого движения. Следующий код даёт
пример:
void AAvatar::Yaw( float amount )
{
if( inventoryShowing )
{
return; //
когда мой инвентарь показывается,
//
игрок не
может двигаться
}
AddControllerYawInput(200.f*amount * GetWorld()- >GetDeltaSeconds());
}
Достарыңызбен бөлісу: