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



Pdf көрінісі
бет233/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   229   230   231   232   233   234   235   236   ...   252
Байланысты:
аа

Подсказка 
Художник как правило введёт дополнительную кость в сетку модели, для выпуска 
пуль, которая как правило будет на конце ствола оружия.  
Работая  из  базовой  сетки  модели,  мы  можем  получить  местоположение  костей 
Mesh, и в коде заставить монстра выпускать экземпляры Bullet из кости.  
Готовые  функции  монстра  Tick  и  Attack  могут  быть  получены  при  использовании 
следующего кода: 
void AMonster::Tick(float DeltaSeconds) 

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

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

toPlayer /= distanceToPlayer; // 
нормализуем вектор 
// Обращение лицом к цели 
// Получаете ротатор для поворачивания того, 
// что смотрит в нправлении игрока `toPlayer` 
FRotator toPlayerRotation = toPlayer.Rotation(); 
toPlayerRotation.Pitch = 0; // 0 
от тангажа 
RootComponent->SetWorldRotation( toPlayerRotation ); 
if( isInAttackRange(distanceToPlayer) ) 

// 
Выполняем атаку 
if( !TimeSinceLastStrike ) 

    Attack(avatar); 

TimeSinceLastStrike += DeltaSeconds; 


267 | 
С т р а н и ц а
 
 
if( TimeSinceLastStrike > AttackTimeout ) 

    TimeSinceLastStrike = 0; 

return; // 
больше ничего не делаем 

else 

    // 
не в зоне досягаемости атаки, тогда идём к игроку 
    AddMovementInput(toPlayer, Speed*DeltaSeconds); 


Функция 
AMonster::Attack
  относительно  проста.  Конечно,  нам  сначала  нужно 
добавить объявление прототипа в файле Monster.h, чтобы написать нашу функцию 
в файле .cpp:  
void AMonster::Attack(AActor* thing); 
В Monster.cpp мы осуществляем функцию Attack, следующим образом: 
void AMonster::Attack(AActor* thing) 

if( MeleeWeapon ) 

// 
код для взмахов рукопашным оружием, если 
// 
рукопашное оружие используется 
MeleeWeapon->Swing(); 

else if( BPBullet ) 

// If a blueprint for a bullet to use was assigned, 
// then use that. Note we wouldn't execute this code 
// bullet firing code if a MeleeWeapon was equipped 
FVector fwd = GetActorForwardVector(); 
FVector nozzle = GetMesh()->GetBoneLocation( "RightHand" ); 
nozzle += fwd 
* 155;// двигаем её от монстра, так что 
/
/ она не сталкивается с моделью монстра 
FVector toOpponent = thing->GetActorLocation() - nozzle; 
toOpponent.Normalize(); 
ABullet *bullet = GetWorld()->SpawnActor( BPBullet, nozzle, RootComponent-
>GetComponentRotation()); 
if( bullet ) 

bullet->Firer = this; 
bullet->ProxSphere->AddImpulse( fwd*BulletLaunchImpulse ); 

else 

GEngine->AddOnScreenDebugMessage( 0, 5.f, 
FColor::Yellow, "monster: no bullet actor could be spawned. is the bullet overlapping something?" 
); 





268 | 
С т р а н и ц а
 
 
Мы  оставляем  код,  который  осуществляет  рукопашную  атаку.  Предполагая,  что 
монстр не держит оружие для рукопашной атаки, мы затем проверяем установлен 
ли  элемент  BPBullet.  Если  этот  элемент  установлен,  то  это  значит,  что  монстр 
создаст экземпляр BPBullet из блупринта класса и будет стрелять.  
Обратите особое внимание на следующую строку: 
ABullet *bullet = GetWorld()->SpawnActor(BPBullet, nozzle, RootComponent-
>GetComponentRotation() );
  
Это  то,  как  мы  добавляем  новый  актор  в  мир.  Функция  SpawnActor()  помещает 
экземпляр  UCLASS,  который  вы  передали,  в  spawnLoc,  с  некоторыми  начальными 
ориентировками.  
После того, как мы порождаем пулю, мы вызываем функцию AddImpulse() к её 
переменной ProxSphere, чтобы запускать её вперёд.  


Достарыңызбен бөлісу:
1   ...   229   230   231   232   233   234   235   236   ...   252




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

    Басты бет