From 8d6b666563d8de548a02da3a9c071b305930a96d Mon Sep 17 00:00:00 2001 From: Samuel Pattuzzi Date: Fri, 2 Jun 2017 16:11:11 +0100 Subject: [PATCH] Templated solution to bug. --- Source/S05_TestingGrounds/Terrain/Tile.cpp | 64 +++++++++------------- Source/S05_TestingGrounds/Terrain/Tile.h | 9 +-- 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/Source/S05_TestingGrounds/Terrain/Tile.cpp b/Source/S05_TestingGrounds/Terrain/Tile.cpp index 2c891cf..b2f5c0e 100644 --- a/Source/S05_TestingGrounds/Terrain/Tile.cpp +++ b/Source/S05_TestingGrounds/Terrain/Tile.cpp @@ -38,29 +38,29 @@ void ATile::PositionNavMeshBoundsVolume() GetWorld()->GetNavigationSystem()->Build(); } - -void ATile::PlaceActors(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale) -{ - TArray SpawnPositions = RandomSpawnPositions(MinSpawn, MaxSpawn, Radius, MinScale, MaxScale); - for (FSpawnPosition SpawnPosition : SpawnPositions) - { - PlaceActor(ToSpawn, SpawnPosition); - } +template<> +void ATile::PlaceActor(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition) { + AActor* Spawned = GetWorld()->SpawnActor(ToSpawn); + Spawned->SetActorRelativeLocation(SpawnPosition.Location); + Spawned->AttachToActor(this, FAttachmentTransformRules(EAttachmentRule::KeepRelative, false)); + Spawned->SetActorRotation(FRotator(0, SpawnPosition.Rotation, 0)); + Spawned->SetActorScale3D(FVector(SpawnPosition.Scale)); } -void ATile::PlaceAIPawns(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius) +template<> +void ATile::PlaceActor(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition) { - TArray SpawnPositions = RandomSpawnPositions(MinSpawn, MaxSpawn, Radius, 1, 1); - for (FSpawnPosition SpawnPosition : SpawnPositions) - { - PlaceAIPawn(ToSpawn, SpawnPosition); - } - + APawn* Spawned = GetWorld()->SpawnActor(ToSpawn); + Spawned->SetActorRelativeLocation(SpawnPosition.Location); + Spawned->AttachToActor(this, FAttachmentTransformRules(EAttachmentRule::KeepRelative, false)); + Spawned->SetActorRotation(FRotator(0, SpawnPosition.Rotation, 0)); + Spawned->SpawnDefaultController(); + Spawned->Tags.Add(FName("Enemy")); } -TArray ATile::RandomSpawnPositions(int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale) +template +void ATile::SpawnRandomActors(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale) { - TArray SpawnPositions; int NumberToSpawn = FMath::RandRange(MinSpawn, MaxSpawn); for (size_t i = 0; i < NumberToSpawn; i++) { @@ -70,11 +70,19 @@ TArray ATile::RandomSpawnPositions(int MinSpawn, int MaxSpawn, f if (found) { SpawnPosition.Rotation = FMath::RandRange(-180.f, 180.f); - SpawnPositions.Add(SpawnPosition); + PlaceActor(ToSpawn, SpawnPosition); } } +} - return SpawnPositions; +void ATile::PlaceActors(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale) +{ + SpawnRandomActors(ToSpawn, MinSpawn, MaxSpawn, Radius, MinScale, MaxScale); +} + +void ATile::PlaceAIPawns(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius) +{ + SpawnRandomActors(ToSpawn, MinSpawn, MaxSpawn, Radius, 1, 1); } bool ATile::FindEmptyLocation(FVector& OutLocation, float Radius) { @@ -91,24 +99,6 @@ bool ATile::FindEmptyLocation(FVector& OutLocation, float Radius) { return false; } -void ATile::PlaceActor(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition) { - AActor* Spawned = GetWorld()->SpawnActor(ToSpawn); - Spawned->SetActorRelativeLocation(SpawnPosition.Location); - Spawned->AttachToActor(this, FAttachmentTransformRules(EAttachmentRule::KeepRelative, false)); - Spawned->SetActorRotation(FRotator(0, SpawnPosition.Rotation, 0)); - Spawned->SetActorScale3D(FVector(SpawnPosition.Scale)); -} - -void ATile::PlaceAIPawn(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition) -{ - APawn* Spawned = GetWorld()->SpawnActor(ToSpawn); - Spawned->SetActorRelativeLocation(SpawnPosition.Location); - Spawned->AttachToActor(this, FAttachmentTransformRules(EAttachmentRule::KeepRelative, false)); - Spawned->SetActorRotation(FRotator(0, SpawnPosition.Rotation, 0)); - Spawned->SpawnDefaultController(); - Spawned->Tags.Add(FName("Enemy")); -} - // Called when the game starts or when spawned void ATile::BeginPlay() { diff --git a/Source/S05_TestingGrounds/Terrain/Tile.h b/Source/S05_TestingGrounds/Terrain/Tile.h index b8ef130..b748ce7 100644 --- a/Source/S05_TestingGrounds/Terrain/Tile.h +++ b/Source/S05_TestingGrounds/Terrain/Tile.h @@ -57,13 +57,13 @@ class S05_TESTINGGROUNDS_API ATile : public AActor void PositionNavMeshBoundsVolume(); - TArray RandomSpawnPositions(int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale); + template + void SpawnRandomActors(TSubclassOf ToSpawn, int MinSpawn, int MaxSpawn, float Radius, float MinScale, float MaxScale); bool FindEmptyLocation(FVector& OutLocation, float Radius); - void PlaceActor(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition); - - void PlaceAIPawn(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition); + template + void PlaceActor(TSubclassOf ToSpawn, FSpawnPosition SpawnPosition); bool CanSpawnAtLocation(FVector Location, float Radius); @@ -71,3 +71,4 @@ class S05_TESTINGGROUNDS_API ATile : public AActor AActor* NavMeshBoundsVolume; }; +