#include "SpaceShooterGameMode.h" #include "SpaceshipPawn.h" #include "EnemySpaceship.h" #include "Kismet/GameplayStatics.h" ASpaceShooterGameMode::ASpaceShooterGameMode() { // Set default pawn class using the inherited DefaultPawnClass static ConstructorHelpers::FClassFinder PlayerPawnBPClass(TEXT("/Game/Blueprints/BP_SpaceshipPawn")); if (PlayerPawnBPClass.Class != nullptr) { DefaultPawnClass = PlayerPawnBPClass.Class; } // Enable Tick() PrimaryActorTick.bCanEverTick = true; // Debug message if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("GameMode Constructor")); } } void ASpaceShooterGameMode::StartPlay() { Super::StartPlay(); // Start spawning enemies GetWorldTimerManager().SetTimer(EnemySpawnTimer, this, &ASpaceShooterGameMode::SpawnEnemy, EnemySpawnInterval, true); // Debug message if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("GameMode StartPlay")); } } void ASpaceShooterGameMode::Tick(float DeltaTime) { Super::Tick(DeltaTime); } void ASpaceShooterGameMode::SpawnEnemy() { // Count current enemies TArray 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::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; }