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



Pdf көрінісі
бет250/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   244   245   246   247   248   249   250   251   252
spell->SetCaster(this) 
При  начальной  установке  значений,  если  заклинание  проходит  успешно,  то  мы 
прикрепляем его  к  объекту Avatar, вызывая spell->SetCaster( this  ).  Помните, что в 
контексте  программирования  в  пределах  класса  Avatar,  метод  this  является 
ссылкой на объект Avatar.  
Теперь,  как  мы  собственно  соединим  посылание  заклинания  от  вводных  данных 
UI,  к  вызову  функции  AAvatar::CastSpell()  на  первом  месте?  Нам  нужно  снова 
выполнить немного программирования HUD.
  
Написание AMyHUD::MouseRightClicked() 
Команда посылания  заклинания, в конечном  счете, будет приходить из  HUD. Нам 
нужно  написать  С++  функцию,  которая  будет  проходить  через  все  графические 
элементы  HUD  и  выявлять  клик  по  какому-либо  из  них.  Если  клик  на  объекте 
widget,  то  этот  объект  widget  должен  отвечать  заклинанием,  если  оно  ему 
назначено.  Нам  нужно  расширить  наш  объект  Widget,  чтобы  иметь  переменную, 
которая  будет  содержать  блупринт  посылания  заклинания.  Добавьте  элемент  в 
ваш объект struct Widget, используя следующий код:  
struct Widget 

Icon icon; 
// bpSpell 
является блупринтом заклинания, которое посылает этот графический элемент 
UClass *bpSpell; 
FVector2D pos, size; 
Widget(Icon iicon, UClass *iClassName) 
}
   


293 | 
С т р а н и ц а
 
 
Теперь  вспомните,  что  наш  PickupItem  имел  прикреплённый  к  нему  ранее 
блупринт  заклинания,  которое  он  посылает.  Однако  когда  класс  PickupItem 
(подбираемый  предмет)  подбирался  в  уровне  игроком,  то  класс  PickupItem 
ликвидировался.  
// 
Из APickupItem::Prox_Implementation(): 
avatar->Pickup( this ); // give this item to the avatar 
// 
удаляем подбираемый предмет, как только он был подобран 
Destroy();
 
Так  что  нам  нужно  удерживать  информацию  о  том,  какое  заклинание  посылает 
каждый  PickupItem.  Мы  можем  сделать  это,  кода  этот  PickupItem  подбирается 
первый раз.  
Внутри  класса  AAvatar  добавьте  дополнительную  карту,  чтобы  запоминать 
блупринт заклинания, которое посылает предмет, по имени предмета: 
// Поместите это в Avatar.h 
TMap Spells;
 
Теперь  в  AAvatar::Pickup(),  запомните  класс  заклинания,  экземпляр  которого 
создаёт класс PickupItem, с помощью следующей строки кода: 
// 
заклинание связанное с предметом 
Spells.Add(item->Name, item->Spell);
   
Теперь  в  AAvatar::ToggleInventory()  мы  может  иметь  объект  Widget,  который 
отображается  на  экране.  Вспомните,  какое  заклинание  он  должен  посылать, 
посмотрев на карту Spells.  
Найдите строку, на которой мы создали графический элемент (widget), и сразу под 
ней добавьте назначение объектов bpSpell, которые посылает Widget: 
// 
В AAvatar::ToggleInventory() 
Widget w( Icon( fs, tex ) ); 
w.bpSpell = Spells[it->Key];
    
Добавьте  следующую  функцию  к  AMyHUD,  которую  установим  для  запуска,  когда 
правая кнопка мыши щёлкает по значку: 
void AMyHUD::MouseRightClicked() 

FVector2D mouse; 
APlayerController *PController = GetWorld()- >GetFirstPlayerController(); 
PController->GetMousePosition( mouse.X, mouse.Y ); 
for( int c = 0; c < widgets.Num(); c++ ) 

if( widgets[c].hit( mouse ) ) 

AAvatar *avatar = Cast( UGameplayStatics::GetPlayerPawn(GetWorld(), 0) ); 
if( widgets[c].spellName ) 
avatar->CastSpell( widgets[c].spellName ); 



294 | 
С т р а н и ц а
 
 

}
  
Это  очень  похоже  на  нашу  функцию  левого  клика  мыши.  Мы  просто  проверяем 
положение  клика  в  отношении  графического  элемента.  Если  какой-либо  Widget 
был  нажат  правым  кликом  и  этот  Widget  имеет  связанный  с  ним  объект  Spell,  то 
заклинание будет послано вызовом метода аватара CastSpell().   


Достарыңызбен бөлісу:
1   ...   244   245   246   247   248   249   250   251   252




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

    Басты бет