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



Pdf көрінісі
бет211/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   207   208   209   210   211   212   213   214   ...   252
Вычитаем –М из 
каждого вектора в этой 
системе 
Остаётся M@(0,0) 


235 | 
С т р а н и ц а
 
 
 
SightSphere монстра 
Прямо сейчас, монстры не обращают внимания на компонент  SightSphere. Где бы 
ни находился игрок в мире, в текущей установке монстры будут идти на него. И мы 
хотим изменить это сейчас.  
Чтобы сделать это, нам нужно, чтобы Monster принимал во внимание ограничение 
SightSphere.  Если  игрок  внутри  объекта  SightSphere  монстра,  то  тогда  монстр 
устроит  погоню.  Иначе,  монстры  будут  в  неведении  местоположения  игрока  и 
естественно не будут за ним гнаться.  
Проверять находится ли объект внутри сферы легко. На следующем изображении, 
точка P находится внутри сферы, если расстояние d между P и центром меньше, 
чем радиус сферы r:  


236 | 
С т р а н и ц а
 
 
 
P находится внутри сферы, когда d меньше чем r 
Итак, в нашем коде, предыдущее изображение переходит в следующий код: 
void AMonster::Tick(float DeltaSeconds) 

Super::Tick( DeltaSeconds ); 
AAvatar *avatar = Cast( UGameplayStatics::GetPlayerPawn(GetWorld(), 0) ); 
if( !avatar ) return; 
    FVector toPlayer = avatar->GetActorLocation() - GetActorLocation(); 
float distanceToPlayer = toPlayer.Size(); 
// 
Если игрок не в SightSphere монстра, 
// 
идём назад 
if( distanceToPlayer > SightSphere->GetScaledSphereRadius() ) 

// 
Если игрок в не поля зрения
// 
то монстр не может гнаться за ним 
return; 

toPlayer /= distanceToPlayer; // 
нормализуем вектор 
// 
Собственно двигаем монстра на игрока по немногу 
AddMovementInput(toPlayer, Speed*DeltaSeconds); 
// (
остальная часть функции такая же как прежде (вращение)) 
}
 
Этот  кот  добавляет  дополнительный  интеллект  персонажу  Monster.  Персонаж 
Monster  сейчас  может  прекращать  погоню  за  игроком,  если  игрок  вне  объекта 
SightSphere монстра.  Вот как будет выглядеть результат:  


237 | 
С т р а н и ц а
 
 
 
 
Хорошо  было  бы  здесь  внести  сравнение  расстояния  в  простую  встроенную 
функцию.  Мы  можем  вести  эти  две  встроенные  функции-члены  в  заголовочный 
файл Monster: 
inline bool isInSightRange( float d ) 
{ return d < SightSphere->GetScaledSphereRadius(); } 
inline bool isInAttackRange( float d ) 
{ return d < AttackRangeSphere->GetScaledSphereRadius(); }
 
Эти  функции  возвращают  значение  true,  когда  переданный  параметр  d  внутри 
рассматриваемой сферы. 
Подсказка 
Функция inline (встроенная) означает, что функция больше походит на макрос, чем 
на  функцию.  Макросы  копируются  и  вставляются  в  вызываемую  локацию,  в  то 
время  как  функции  перепрыгивают  по  средством  С++  и  выполняются  на  своих 
локациях.  Встроенные  функции  хороши,  потому  что  они  предоставляют  хорошую 
производительность, наряду с тем, что код остаётся лёгок для чтения, и их можно 
использовать повторно.  
 


Достарыңызбен бөлісу:
1   ...   207   208   209   210   211   212   213   214   ...   252




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

    Басты бет