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



Pdf көрінісі
бет204/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   200   201   202   203   204   205   206   207   ...   252
Перетаскивание элементов 
Мы можем легко перетаскивать элементы. Первый шаг, чтобы сделать возможным 
перетаскивание,  это  отклик  на  нажатие  левой  кнопки  мыши.  Во  первых,  мы 
напишем  функцию,  для  выполнения  когда  нажата  левая  кнопка  мыши.  В  файле 
Avatar.h, добавьте следующий прототип к объявлению класса: 
void MouseClicked(); 
В  файле  Avatar.cpp,  мы  можем  прикрепить  функцию  для  выполнения  по  щелчку 
мыши и передачи запроса щелчка в HUD, следующим образом: 
void AAvatar::MouseClicked() 

APlayerController* PController = GetWorld()- >GetFirstPlayerController(); 
AMyHUD* hud = Cast( PController->GetHUD() ); 
hud->MouseClicked(); 

Затем в AAvatar::SetupPlayerInputComponent, нам нужно добавить наш ответчик: 
InputComponent->BindAction( "MouseClickedLMB", IE_Pressed, this, &AAvatar::MouseClicked ); 
Следующий скриншот демонстрирует, как вы можете добавить визуализацию: 
 
Добавьте элемент в класс AMyHUD: 
Widget* heldWidget; // 
держит последний затронутый Widget в памяти 
Далее,  в  AMyHUD::MouseClicked(),мы  начинаем  выполнять  поиск  нажатия  по 
Widget:   


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.  


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




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

    Басты бет