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



Pdf көрінісі
бет202/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   198   199   200   201   202   203   204   205   ...   252
Байланысты:
аа

Используем HUD::DrawTexture() 
Мы  дойдём  до  этого  в  два  шага.  Первый  шаг,  помещать  содержимое  нашего 
инвентаря в HUD, когда пользователь нажимает клавишу I. Второй шаг, собственно 
визуализировать значки на HUD в форме сетки.  
Чтобы содержать всю информацию о том, как графический элемент (widget) может 
быть  визуализирован,  мы  объявляем  простую  структуру  для  содержания 
информации касающейся того, какой значок она использует, это текущая позиция и 
текущий размер. 
Вот как выглядят структуры Icon (значок) и Widget (графический элемент): 
struct Icon 

FString name; 
UTexture2D* tex; 
Icon(){ name = "UNKNOWN ICON"; tex = 0; } 
Icon( FString& iName, UTexture2D* iTex ) 

name = iName; 
tex = iTex; 

}; 
 
 
struct Widget 

Icon icon; 
FVector2D pos, size; 
Widget(Icon iicon) 

icon = iicon; 

float left(){ return pos.X; } 
float right(){ return pos.X + size.X; } 
float top(){ return pos.Y; } 
float bottom(){ return pos.Y + size.Y; } 
}; 
Вы  можете  добавить  эти  объявления  структур  вверху  MyHUD.h,  либо  вы  можете 
добавить  их  отдельный  файл  и  включать  этот  файл  везде,  где  эти  структуры 
используются.  
Обратите  внимание  на  четыре  функции-члены  в  структуре  Widget,  функции  для 
перемещения  влево  -  left(),  вправо  -  right(),  вверх  –  top()  и  вниз  –  bottom()  по 
графическому  элементу.  Мы  будем  использовать  их  позже  для  определения, 
находится ли место щелчка мыши в окне.  


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()); 
}
   


Достарыңызбен бөлісу:
1   ...   198   199   200   201   202   203   204   205   ...   252




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

    Басты бет