presidents-brigade/Source/PresidentsBrigade/EnemySpawner.cpp
2022-11-19 12:50:05 -08:00

74 lines
1.8 KiB
C++
Executable File

// Fill out your copyright notice in the Description page of Project Settings.
#include "EnemySpawner.h"
// Sets default values
AEnemySpawner::AEnemySpawner()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
level_location = TUniquePtr<LevelLocation>(new LevelLocation());
spawn_delay_s = 5.0f;
max_spawn_count = 5;
}
// Called when the game starts or when spawned
void AEnemySpawner::BeginPlay()
{
Super::BeginPlay();
/*
* Initialize random stream.
*/
random.Initialize(FMath::Rand());
}
// Called every frame
void AEnemySpawner::Tick(float delta_s)
{
Super::Tick(delta_s);
if (!level_location->is_initialized())
{
level_location->initialize(GetWorld(), marker_class);
}
spawn_wait_s += delta_s;
if (next_spawn_threshold_s == 0)
{
next_spawn_threshold_s = spawn_delay_s + random.GetFraction();
}
else if (spawn_wait_s > next_spawn_threshold_s)
{
const int spawn_count = random.RandRange(0, max_spawn_count);
for (int i = 0; i < spawn_count; i++)
{
const FVector location = level_location->get_random_mark();
FActorSpawnParameters spawnParameters;
spawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
spawnParameters.Owner = this;
AAIController* controller = GetWorld()->SpawnActor<AAIController>(
controller_class,
location,
FRotator(0,0,0),
spawnParameters
);
ABasePawn* enemy = GetWorld()->SpawnActor<ABasePawn>(
pawn_class,
location,
FRotator(0,0,0),
spawnParameters
);
controller->Possess(enemy);
}
spawn_wait_s = 0;
next_spawn_threshold_s = spawn_delay_s + random.GetFraction();
}
}