Minor - Ajoute l'instanciation des champignons dans un grid - V01.10.00
Instanciation et placement aléatoire des champignons dans une zone définie.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
#include "M4_Gamemode.h"
|
||||
|
||||
#include "M4_Mushroom.h"
|
||||
#include "M4_PlayerController.h"
|
||||
#include "M4_PlayerPawn.h"
|
||||
|
||||
@@ -11,10 +12,53 @@ AM4_Gamemode::AM4_Gamemode()
|
||||
|
||||
PlayerControllerClass = AM4_PlayerController::StaticClass();
|
||||
DefaultPawnClass = AM4_PlayerPawn::StaticClass();
|
||||
|
||||
MushroomCount = FMath::RandRange(20, 25);
|
||||
|
||||
}
|
||||
|
||||
void AM4_Gamemode::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
}
|
||||
|
||||
Score = 0;
|
||||
Lives = 3;
|
||||
|
||||
// Get mushroom size from the class
|
||||
AM4_Mushroom* TempMushroom = GetWorld()->SpawnActor<AM4_Mushroom>(AM4_Mushroom::StaticClass());
|
||||
if (TempMushroom)
|
||||
{
|
||||
FVector MushroomSize = TempMushroom->GetStaticMeshComponent()->Bounds.BoxExtent * 2.0f;
|
||||
CellSize = FMath::Max(MushroomSize.Y, MushroomSize.Z); // Use largest dimension
|
||||
TempMushroom->Destroy();
|
||||
}
|
||||
|
||||
// Calculate grid dimensions based on cell size
|
||||
const int32 GridRows = FMath::FloorToInt(MushroomSpawnBounds.GetSize().X / CellSize);
|
||||
const int32 GridCols = FMath::FloorToInt(MushroomSpawnBounds.GetSize().Y / CellSize);
|
||||
|
||||
// spawn mushrooms in a grid inside the spawn bounds and in random cell
|
||||
if (MushroomCount > 0)
|
||||
{
|
||||
TSet<FIntPoint> OccupiedCells;
|
||||
|
||||
for (int32 i = 0; i < MushroomCount; ++i)
|
||||
{
|
||||
FIntPoint Cell;
|
||||
do
|
||||
{
|
||||
Cell.X = FMath::RandRange(0, GridRows - 1);
|
||||
Cell.Y = FMath::RandRange(0, GridCols - 1);
|
||||
} while (OccupiedCells.Contains(Cell));
|
||||
|
||||
OccupiedCells.Add(Cell);
|
||||
|
||||
FVector SpawnLocation;
|
||||
SpawnLocation.Z = MushroomSpawnBounds.Min.X + Cell.X * CellSize + CellSize / 2.0f;
|
||||
SpawnLocation.Y = MushroomSpawnBounds.Min.Y + Cell.Y * CellSize + CellSize / 2.0f;
|
||||
SpawnLocation.X = -400.0f;
|
||||
|
||||
GetWorld()->SpawnActor<AM4_Mushroom>(AM4_Mushroom::StaticClass(), SpawnLocation, FRotator::ZeroRotator);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
42
Source/M4_CPP/private/M4_Mushroom.cpp
Normal file
42
Source/M4_CPP/private/M4_Mushroom.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "M4_Mushroom.h"
|
||||
|
||||
#include "M4_CTP_Macros.h"
|
||||
#include "Kismet/GameplayStatics.h"
|
||||
#include "M4_Gamemode.h"
|
||||
|
||||
|
||||
// Sets default values
|
||||
AM4_Mushroom::AM4_Mushroom()
|
||||
{
|
||||
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||
PrimaryActorTick.bCanEverTick = true;
|
||||
|
||||
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshRef(TEXT("/Game/CTP/04_Mesh/SM_Cube.SM_Cube"));
|
||||
if (StaticMeshRef.Succeeded())
|
||||
{
|
||||
GetStaticMeshComponent()->SetStaticMesh(StaticMeshRef.Object);
|
||||
}
|
||||
|
||||
GetStaticMeshComponent()->SetDefaultCustomPrimitiveDataVector4(0, FVector4(0.0, 0.2, 0.2, 1.0));
|
||||
|
||||
GetStaticMeshComponent()->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
||||
GetStaticMeshComponent()->SetGenerateOverlapEvents(true);
|
||||
// Set as static object
|
||||
GetStaticMeshComponent()->SetMobility(EComponentMobility::Static);
|
||||
|
||||
// Set scale
|
||||
const FVector2D MushroomScale = FVector2D(0.3f, 0.25f);
|
||||
GetStaticMeshComponent()->SetRelativeScale3D(FVector(1.f, 0.45f, 0.20f));
|
||||
|
||||
// Custom preset for more advanced collision configuration
|
||||
GetStaticMeshComponent()->SetCollisionProfileName(UCollisionProfile::CustomCollisionProfileName);
|
||||
GetStaticMeshComponent()->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
|
||||
}
|
||||
|
||||
void AM4_Mushroom::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
}
|
||||
Reference in New Issue
Block a user