219 |
С т р а н и ц а
void AMyHUD::MouseClicked()
{
FVector2D mouse;
PController->GetMousePosition( mouse.X, mouse.Y );
heldWidget = NULL; //
очищает последний содержанный графический элемент
//
смотрим если положение щелчка мыши xy попадает по какому-нибудь элементу
for( int c = 0; c < widgets.Num(); c++ )
{
if( widgets[c].hit( mouse ) )
{
heldWidget = &widgets[c];//
сохраняем графический элемент
return; //
прекращаем
поиск
}
}
}
В
функции AMyHUD::MouseClicked, мы проходим цикл по всем графическим
элементам, которые находятся на экране, и проверяем совпадение с текущим
положением мыши. Вы можете получить текущее положение мыши от
контроллера, в любое время, просто посмотрев PController->GetMousePosition().
Каждый графический элемент (widget) проверяется на текущее положение мыши,
и тот элемент, на котором нажата кнопка мыши, будет перемещаться, когда
перетаскивается мышь. Как только мы определим, по какому элементу был
щёлчок, мы можем остановить проверку, так что мы получаем значение return от
функции MouseClicked().
Однако нажать на графический элемент не достаточно. Нам нужно тащить нажатый
элемент, когда двигается мышь. Для этого нам нужно осуществить функцию
MouseMoved() в AMyHUD:
void AMyHUD::MouseMoved()
{
static FVector2D lastMouse;
FVector2D thisMouse, dMouse;
PController->GetMousePosition( thisMouse.X, thisMouse.Y );
dMouse = thisMouse - lastMouse;
//
Смотрим если левая кнопка мыши удерживается зажатой
//
более чем 0 секунд. Если она зажата,
//
то можно начать перетаскивание.
float time = PController->GetInputKeyTimeDown( EKeys::LeftMouseButton );
if( time > 0.f && heldWidget )
{
//
мышь зажата.
//
двигаем графический элемент, изменяя
положение amt
heldWidget->pos.X += dMouse.X;
heldWidget->pos.Y += dMouse.Y; // y inverted
}
lastMouse = thisMouse;
}
Не забудьте включить объявление в файл MyHUD.h.
220 |
С т р а н и ц а
Функция перетаскивания просматривает разницу в положения мыши между
последним кадром и этим кадром, и двигает выбранный элемент на этот объём.
Переменная static (глобальная с локальной областью действия) используется,
чтобы запоминать lastMouse положение (последнее положение мыши) между
вызовами функции MouseMoved().
Как мы можем связать движение мыши с запущенной функцией MouseMoved() в
AMyHUD? Если вы помните, мы уже связывали движение мыши в классе Avatar.
Две функции, которые мы использовали, это AAvatar::Pitch() (ось y) и AAvatar::Yaw()
(ось x). Расширение этих
функций даст вам возможность передавать вводные
мыши в HUD. Сейчас я покажу вам
функцию Yaw и вы сможете экстраполировать
отсюда как работает Pitch:
void AAvatar::Yaw( float amount )
{
//
ось х
if( inventoryShowing )
{
//
Когда инвентарь показан,
//
передаём вводные в HUD
APlayerController* PController = GetWorld()->GetFirstPlayerController();
AMyHUD* hud = Cast
( PController->GetHUD() );
hud->MouseMoved();
return;
}
else
{
AddControllerYawInput(200.f*amount * GetWorld()- >GetDeltaSeconds());
}
}
Функция AAvatar::Yaw() сначала проверяет показывается ли инвентарь или нет.
Если показывается, вводные направляются прямо в HUD, без эффекта на Avatar.
Если HUD не показывается, то вводные просто идут в Avatar.
Достарыңызбен бөлісу: