71 lines
2.2 KiB
C++
71 lines
2.2 KiB
C++
#include "SpaceShooterGameMode.h"
|
|
#include "SpaceshipPawn.h"
|
|
#include "EnemySpaceship.h"
|
|
#include "Kismet/GameplayStatics.h"
|
|
|
|
ASpaceShooterGameMode::ASpaceShooterGameMode()
|
|
{
|
|
PrimaryActorTick.bCanEverTick = true;
|
|
|
|
// Set default pawn class to our spaceship
|
|
DefaultPawnClass = ASpaceshipPawn::StaticClass();
|
|
}
|
|
|
|
void ASpaceShooterGameMode::StartPlay()
|
|
{
|
|
Super::StartPlay();
|
|
|
|
// Start spawning enemies
|
|
GetWorldTimerManager().SetTimer(EnemySpawnTimer, this, &ASpaceShooterGameMode::SpawnEnemy,
|
|
EnemySpawnInterval, true);
|
|
}
|
|
|
|
void ASpaceShooterGameMode::Tick(float DeltaTime)
|
|
{
|
|
Super::Tick(DeltaTime);
|
|
}
|
|
|
|
void ASpaceShooterGameMode::SpawnEnemy()
|
|
{
|
|
// Count current enemies
|
|
TArray<AActor*> FoundEnemies;
|
|
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AEnemySpaceship::StaticClass(), FoundEnemies);
|
|
|
|
// Only spawn if we haven't reached the maximum
|
|
if (FoundEnemies.Num() < MaxEnemies)
|
|
{
|
|
UWorld* World = GetWorld();
|
|
if (World)
|
|
{
|
|
FVector SpawnLocation = GetRandomSpawnLocation();
|
|
FRotator SpawnRotation = FRotator::ZeroRotator;
|
|
FActorSpawnParameters SpawnParams;
|
|
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
|
|
|
|
World->SpawnActor<AEnemySpaceship>(AEnemySpaceship::StaticClass(), SpawnLocation,
|
|
SpawnRotation, SpawnParams);
|
|
}
|
|
}
|
|
}
|
|
|
|
FVector ASpaceShooterGameMode::GetRandomSpawnLocation()
|
|
{
|
|
APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
|
|
if (PlayerController && PlayerController->GetPawn())
|
|
{
|
|
FVector PlayerLocation = PlayerController->GetPawn()->GetActorLocation();
|
|
|
|
// Generate random angle
|
|
float Angle = FMath::RandRange(0.0f, 2.0f * PI);
|
|
|
|
// Calculate spawn position in a circle around the player
|
|
FVector SpawnLocation;
|
|
SpawnLocation.X = PlayerLocation.X + SpawnRadius * FMath::Cos(Angle);
|
|
SpawnLocation.Y = PlayerLocation.Y + SpawnRadius * FMath::Sin(Angle);
|
|
SpawnLocation.Z = PlayerLocation.Z;
|
|
|
|
return SpawnLocation;
|
|
}
|
|
|
|
return FVector::ZeroVector;
|
|
} |