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().
Достарыңызбен бөлісу: