From 987856ca094d93faad3f646afcd1ab58254fed1b Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Fri, 17 Oct 2025 16:32:27 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Major=20-=20Impl=C3=A9mente=20le=20contr?= =?UTF-8?q?=C3=B4leur=20de=20mille-pattes=20-=20V2.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit introduces a centipede controller subsystem, managing centipede spawning, movement, and segment behavior. It adds centipede body materials, movement logic, collision detection, and head assignment. The controller handles segment following, direction changes at boundaries, and dynamic head updates upon segment destruction. --- Config/DefaultEngine.ini | 3 + Content/CTP/05_Material/MI_Body.uasset | Bin 0 -> 8972 bytes Content/CTP/05_Material/MI_Head.uasset | Bin 0 -> 8923 bytes Source/M4_CPP/private/M4_CentipedeBody.cpp | 46 +++- .../M4_CPP/private/M4_CentipedeController.cpp | 242 +++++++++++------- Source/M4_CPP/private/M4_Gamemode.cpp | 15 +- Source/M4_CPP/private/M4_Mushroom.cpp | 5 +- Source/M4_CPP/public/M4_CentipedeBody.h | 6 + Source/M4_CPP/public/M4_CentipedeController.h | 42 +-- Source/M4_CPP/public/M4_Gamemode.h | 2 +- 10 files changed, 225 insertions(+), 136 deletions(-) create mode 100644 Content/CTP/05_Material/MI_Body.uasset create mode 100644 Content/CTP/05_Material/MI_Head.uasset diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 1b1c8ac..5db7bd6 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -94,3 +94,6 @@ ConnectionType=USBOnly bUseManualIPAddress=False ManualIPAddress= + +[CoreRedirects] ++ClassRedirects=(OldName="/Script/M4_CPP.M4_CentipedeController",NewName="/Script/M4_CPP.M4_CentipedeController") \ No newline at end of file diff --git a/Content/CTP/05_Material/MI_Body.uasset b/Content/CTP/05_Material/MI_Body.uasset new file mode 100644 index 0000000000000000000000000000000000000000..092eb17535fb7582932967d7d2479a293fd684e6 GIT binary patch literal 8972 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.Object); } + // Charger les matériaux par défaut (ajustez les chemins selon vos assets) + static ConstructorHelpers::FObjectFinder HeadMatRef(TEXT("/Game/CTP/05_Material/MI_Head.MI_Head")); + if (HeadMatRef.Succeeded()) + { + HeadMaterial = HeadMatRef.Object; + } + + static ConstructorHelpers::FObjectFinder BodyMatRef(TEXT("/Game/CTP/05_Material/MI_Body.MI_Body")); + if (BodyMatRef.Succeeded()) + { + BodyMaterial = BodyMatRef.Object; + } + GetStaticMeshComponent()->SetRelativeScale3D(FVector(1.f, 0.4f, 0.4f)); - GetStaticMeshComponent()->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - GetStaticMeshComponent()->SetGenerateOverlapEvents(true); GetStaticMeshComponent()->SetMobility(EComponentMobility::Movable); + GetStaticMeshComponent()->SetCollisionObjectType(ECollisionChannel::ECC_WorldDynamic); + GetStaticMeshComponent()->SetGenerateOverlapEvents(true); + GetStaticMeshComponent()->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + GetStaticMeshComponent()->SetCollisionProfileName(TEXT("OverlapAll")); } void AM4_CentipedeBody::SetAsHead(bool bHead) { - bIsHead = bHead; - if (bIsHead) - { - GetStaticMeshComponent()->SetDefaultCustomPrimitiveDataVector4(0, FVector4(1.0, 0.0, 0.0, 1.0)); - } - else - { - GetStaticMeshComponent()->SetDefaultCustomPrimitiveDataVector4(0, FVector4(0.0, 1.0, 0.0, 1.0)); - } -} + bIsHead = bHead; + + if (bIsHead) + { + if (HeadMaterial) + { + GetStaticMeshComponent()->SetMaterial(0, HeadMaterial); + } + } + else + { + if (BodyMaterial) + { + GetStaticMeshComponent()->SetMaterial(0, BodyMaterial); + } + } +} \ No newline at end of file diff --git a/Source/M4_CPP/private/M4_CentipedeController.cpp b/Source/M4_CPP/private/M4_CentipedeController.cpp index 445d7d8..2c965cf 100644 --- a/Source/M4_CPP/private/M4_CentipedeController.cpp +++ b/Source/M4_CPP/private/M4_CentipedeController.cpp @@ -1,40 +1,110 @@ #include "M4_CentipedeController.h" +#include "M4_LOG.h" #include "M4_Gamemode.h" -AM4_CentipedeController::AM4_CentipedeController() +UM4_CentipedeController::UM4_CentipedeController() { - PrimaryActorTick.bCanEverTick = true; - Root = CreateDefaultSubobject(TEXT("RootComponent")); - RootComponent = Root; + } -void AM4_CentipedeController::BeginPlay() +void UM4_CentipedeController::Initialize(FSubsystemCollectionBase& Collection) { - Super::BeginPlay(); - SpawnCentipede(); + Super::Initialize(Collection); - PreviousPositions.SetNum(BodyCount); - for (int i = 0; i < BodyCount; ++i) + UE_LOG(M4_CPP, Warning, TEXT("Centipede Controller Initialized")); + +} + +void UM4_CentipedeController::Deinitialize() +{ + UE_LOG(M4_CPP, Warning, TEXT("Centipede Controller Deinitialized")); + + BodySegments.Empty(); + PreviousPositions.Empty(); + SegmentDirections.Empty(); + + Super::Deinitialize(); +} + +void UM4_CentipedeController::StartCentipede(FVector SpawnLocation) +{ + if (BodySegments.Num() > 0) { - PreviousPositions[i] = BodySegments[i]->GetActorLocation(); + UE_LOG(M4_CPP, Warning, TEXT("Centipede already spawned")); + return; } - + + for (int32 i = 0; i < BodyCount; ++i) + { + FVector SegmentLocation = SpawnLocation - FVector(0.f, 0.f, i * CellSize); + + AM4_CentipedeBody* Body = GetWorld()->SpawnActor( + AM4_CentipedeBody::StaticClass(), + SegmentLocation, + FRotator::ZeroRotator + ); + + if (Body) + { + BodySegments.Add(Body); + + if (i > 0) + { + Body->PreviousBody = BodySegments[i - 1]; + BodySegments[i - 1]->NextBody = Body; + } + + Body->SetAsHead(i == 0); + } + } + + // Initialiser l'historique + SegmentHistory.SetNum(BodyCount); + for (int32 i = 0; i < BodyCount; ++i) + { + if (BodySegments.IsValidIndex(i) && BodySegments[i]) + { + FVector InitialPos = BodySegments[i]->GetActorLocation(); + + // Remplir avec position initiale + int32 InitialHistorySize = SegmentSpacing * (i + 1) + MaxHistorySize; + for (int32 j = 0; j < InitialHistorySize; ++j) + { + SegmentHistory[i].Add(InitialPos); + } + } + } + for (AM4_CentipedeBody* Segment : BodySegments) { SegmentDirections.Add(Segment, FVector2D(0.f, 1.f)); } + + UE_LOG(M4_CPP, Warning, TEXT("Centipede spawned with %d segments"), BodySegments.Num()); } -void AM4_CentipedeController::SpawnCentipede() +TStatId UM4_CentipedeController::GetStatId() const { - FVector SpawnLocation = GetActorLocation(); + RETURN_QUICK_DECLARE_CYCLE_STAT(UM4_CentipedeController, STATGROUP_Tickables); +} + +void UM4_CentipedeController::SpawnCentipede() +{ + AM4_Gamemode* GM = Cast(GetWorld()->GetAuthGameMode()); + if (!GM) return; - UE_LOG(LogTemp, Warning, TEXT("Controller spawn location: X=%.2f, Y=%.2f, Z=%.2f"), + FVector SpawnLocation = FVector( + GM->MushroomSpawnBounds.Max.X, + 0.f, + 0.f + ); + + UE_LOG(M4_CPP, Warning, TEXT("Controller spawn location: X=%.2f, Y=%.2f, Z=%.2f"), SpawnLocation.X, SpawnLocation.Y, SpawnLocation.Z); if (SpawnLocation.IsZero()) { - UE_LOG(LogTemp, Error, TEXT("Controller position is zero! Check spawn parameters.")); + UE_LOG(M4_CPP, Error, TEXT("Controller position is zero! Check spawn parameters.")); return; } @@ -63,80 +133,73 @@ void AM4_CentipedeController::SpawnCentipede() } } -void AM4_CentipedeController::Tick(float DeltaTime) +void UM4_CentipedeController::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (BodySegments.Num() == 0) return; - TimeSinceLastMove += DeltaTime; - - if (TimeSinceLastMove >= MoveInterval) + // Déplacer la tête + AM4_CentipedeBody* Head = BodySegments[0]; + if (Head && Head->bIsHead) { - TimeSinceLastMove = 0.f; - - TArray TempPositions; - TempPositions.SetNum(BodySegments.Num()); - - for (int32 i = 0; i < BodySegments.Num(); ++i) + FVector CurrentPos = Head->GetActorLocation(); + FVector2D SegmentDirection = GetSegmentDirection(Head); + + bool bShouldDescend = CheckCollision(Head, SegmentDirection); + + if (bShouldDescend) { - TempPositions[i] = BodySegments[i]->GetActorLocation(); + FVector NewPos = CurrentPos - FVector(0.f, 0.f, CellSize); + Head->SetActorLocation(NewPos); + + SegmentDirection.Y *= -1.f; + SetSegmentDirection(Head, SegmentDirection); } - - for (int32 i = 0; i < BodySegments.Num(); ++i) + else { - AM4_CentipedeBody* Segment = BodySegments[i]; - - if (!Segment) continue; - - if (Segment->bIsHead) - { - FVector CurrentPos = Segment->GetActorLocation(); - FVector2D SegmentDirection = GetSegmentDirection(Segment); - - bool bShouldDescend = CheckCollision(Segment, SegmentDirection); - - if (bShouldDescend) - { - FVector NewPos = CurrentPos - FVector(0.f, 0.f, CellSize); - Segment->SetActorLocation(NewPos); - - SegmentDirection.Y *= -1.f; - SetSegmentDirection(Segment, SegmentDirection); - - UE_LOG(LogTemp, Warning, TEXT("Head at index %d descending"), i); - } - else - { - FVector NewPos = CurrentPos + FVector(0.f, SegmentDirection.Y * CellSize, 0.f); - Segment->SetActorLocation(NewPos); - } - } - else - { - if (i > 0) - { - Segment->SetActorLocation(PreviousPositions[i - 1]); - - if (BodySegments[i - 1]) - { - FVector2D PrevDirection = GetSegmentDirection(BodySegments[i - 1]); - SetSegmentDirection(Segment, PrevDirection); - } - } - } - } - - for (int32 i = 0; i < BodySegments.Num(); ++i) - { - PreviousPositions[i] = BodySegments[i]->GetActorLocation(); + FVector NewPos = CurrentPos + FVector(0.f, SegmentDirection.Y * CentipedeSpeed * DeltaTime, 0.f); + Head->SetActorLocation(NewPos); } - UpdateHeadStatus(); + // Enregistrer position de la tête + SegmentHistory[0].Add(Head->GetActorLocation()); + if (SegmentHistory[0].Num() > MaxHistorySize) + { + SegmentHistory[0].RemoveAt(0); + } } + + // Faire suivre les autres segments + for (int32 i = 1; i < BodySegments.Num(); ++i) + { + AM4_CentipedeBody* Segment = BodySegments[i]; + if (!Segment) continue; + + // Récupérer position dans l'historique du segment précédent + int32 PrevIndex = i - 1; + int32 HistoryLookback = SegmentSpacing; + + if (SegmentHistory[PrevIndex].Num() > HistoryLookback) + { + int32 HistoryIndex = SegmentHistory[PrevIndex].Num() - HistoryLookback - 1; + FVector TargetPos = SegmentHistory[PrevIndex][HistoryIndex]; + + Segment->SetActorLocation(TargetPos); + + // Enregistrer position actuelle + SegmentHistory[i].Add(Segment->GetActorLocation()); + if (SegmentHistory[i].Num() > MaxHistorySize) + { + SegmentHistory[i].RemoveAt(0); + } + } + } + + UpdateHeadStatus(); } -bool AM4_CentipedeController::CheckCollision(AM4_CentipedeBody* Segment, FVector2D Direction) +bool UM4_CentipedeController::CheckCollision(AM4_CentipedeBody* Segment, FVector2D Direction) { if (!Segment) return false; @@ -154,13 +217,10 @@ bool AM4_CentipedeController::CheckCollision(AM4_CentipedeBody* Segment, FVector return true; } - // TODO: Ajouter vérification collision avec mushroom - // if (IsMushroomAt(NextPos)) return true; - return false; } -FVector2D AM4_CentipedeController::GetSegmentDirection(AM4_CentipedeBody* Segment) +FVector2D UM4_CentipedeController::GetSegmentDirection(AM4_CentipedeBody* Segment) { if (SegmentDirections.Contains(Segment)) { @@ -169,7 +229,7 @@ FVector2D AM4_CentipedeController::GetSegmentDirection(AM4_CentipedeBody* Segmen return FVector2D(0.f, 1.f); } -void AM4_CentipedeController::SetSegmentDirection(AM4_CentipedeBody* Segment, FVector2D Direction) +void UM4_CentipedeController::SetSegmentDirection(AM4_CentipedeBody* Segment, FVector2D Direction) { if (Segment) { @@ -177,7 +237,7 @@ void AM4_CentipedeController::SetSegmentDirection(AM4_CentipedeBody* Segment, FV } } -void AM4_CentipedeController::UpdateHeadStatus() +void UM4_CentipedeController::UpdateHeadStatus() { for (int32 i = 0; i < BodySegments.Num(); ++i) { @@ -193,37 +253,29 @@ void AM4_CentipedeController::UpdateHeadStatus() } } -void AM4_CentipedeController::OnSegmentDestroyed(AM4_CentipedeBody* DestroyedSegment) +void UM4_CentipedeController::OnSegmentDestroyed(AM4_CentipedeBody* DestroyedSegment) { if (!DestroyedSegment) return; int32 SegmentIndex = BodySegments.Find(DestroyedSegment); - if (SegmentIndex == INDEX_NONE) return; - UE_LOG(LogTemp, Warning, TEXT("Segment %d destroyed"), SegmentIndex); - if (SegmentIndex + 1 < BodySegments.Num()) { AM4_CentipedeBody* NewHead = BodySegments[SegmentIndex + 1]; if (NewHead) { NewHead->SetAsHead(true); - NewHead->PreviousBody = nullptr; - - UE_LOG(LogTemp, Warning, TEXT("New head created at index %d"), SegmentIndex + 1); + NewHead->PreviousBody = nullptr; } } - + if (SegmentIndex > 0 && BodySegments[SegmentIndex - 1]) { BodySegments[SegmentIndex - 1]->NextBody = nullptr; } - - BodySegments.RemoveAt(SegmentIndex); - PreviousPositions.RemoveAt(SegmentIndex); - SegmentDirections.Remove(DestroyedSegment); - // TODO: Spawner un mushroom à la position du segment détruit - // SpawnMushroomAt(DestroyedSegment->GetActorLocation()); + BodySegments.RemoveAt(SegmentIndex); + SegmentHistory.RemoveAt(SegmentIndex); + SegmentDirections.Remove(DestroyedSegment); } \ No newline at end of file diff --git a/Source/M4_CPP/private/M4_Gamemode.cpp b/Source/M4_CPP/private/M4_Gamemode.cpp index 27496e7..304dfeb 100644 --- a/Source/M4_CPP/private/M4_Gamemode.cpp +++ b/Source/M4_CPP/private/M4_Gamemode.cpp @@ -98,16 +98,13 @@ void AM4_Gamemode::BeginPlay() // PRINT SCREEN Max.X value PRINT_SCREEN(*FString::Printf(TEXT("Mushroom Spawn Bounds Max.X: %.2f"), MushroomSpawnBounds.Max.X), FColor::Green); - CentipedeController = GetWorld()->SpawnActor( - AM4_CentipedeController::StaticClass(), - CentipedeSpawnLocation, - FRotator::ZeroRotator - ); - - if (CentipedeController) + UM4_CentipedeController* Controller = GetWorld()->GetSubsystem(); + if (Controller) { - CentipedeController->BodyCount = CentipedeBodyCount; - CentipedeController->CellSize = CellSize; + Controller->BodyCount = CentipedeBodyCount; + Controller->CellSize = CellSize; + + Controller->StartCentipede(CentipedeSpawnLocation); } } diff --git a/Source/M4_CPP/private/M4_Mushroom.cpp b/Source/M4_CPP/private/M4_Mushroom.cpp index a315033..456a14f 100644 --- a/Source/M4_CPP/private/M4_Mushroom.cpp +++ b/Source/M4_CPP/private/M4_Mushroom.cpp @@ -31,9 +31,8 @@ AM4_Mushroom::AM4_Mushroom() 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); + // Set collision profile to overlap all + GetStaticMeshComponent()->SetCollisionProfileName(TEXT("OverlapAll")); } diff --git a/Source/M4_CPP/public/M4_CentipedeBody.h b/Source/M4_CPP/public/M4_CentipedeBody.h index 14855b5..81a2416 100644 --- a/Source/M4_CPP/public/M4_CentipedeBody.h +++ b/Source/M4_CPP/public/M4_CentipedeBody.h @@ -22,4 +22,10 @@ public: bool bIsHead = false; void SetAsHead(bool bHead); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Materials") + UMaterialInterface* HeadMaterial; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Materials") + UMaterialInterface* BodyMaterial; }; \ No newline at end of file diff --git a/Source/M4_CPP/public/M4_CentipedeController.h b/Source/M4_CPP/public/M4_CentipedeController.h index 325b994..53a98ca 100644 --- a/Source/M4_CPP/public/M4_CentipedeController.h +++ b/Source/M4_CPP/public/M4_CentipedeController.h @@ -1,50 +1,60 @@ #pragma once #include "CoreMinimal.h" -#include "GameFramework/Actor.h" #include "M4_CentipedeBody.h" +#include "Subsystems/WorldSubsystem.h" #include "M4_CentipedeController.generated.h" UCLASS() -class M4_CPP_API AM4_CentipedeController : public AActor +class M4_CPP_API UM4_CentipedeController : public UTickableWorldSubsystem { GENERATED_BODY() public: - AM4_CentipedeController(); + UM4_CentipedeController(); + + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + void StartCentipede(FVector SpawnLocation); - virtual void BeginPlay() override; virtual void Tick(float DeltaTime) override; + + virtual TStatId GetStatId() const override; - UPROPERTY(EditAnywhere) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Centipede") int32 BodyCount = 10; - UPROPERTY(EditAnywhere) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Centipede") float CellSize = 50.f; - UPROPERTY(EditAnywhere) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Centipede") float MoveInterval = 0.1f; - + + UFUNCTION(BlueprintCallable, Category = "Centipede") void OnSegmentDestroyed(AM4_CentipedeBody* DestroyedSegment); private: UPROPERTY() TArray BodySegments; - - UPROPERTY() - USceneComponent* Root; + TArray> SegmentHistory; // Historique pour chaque segment + int32 MaxHistorySize = 200; + + UPROPERTY(EditAnywhere, Category = "Centipede") + int32 SegmentSpacing = 15; // Distance en nombre de frames entre segments float TimeSinceLastMove = 0.f; - + float CentipedeSpeed = 400.f; + bool bFirstTick = true; + TArray PreviousPositions; - + TMap SegmentDirections; void SpawnCentipede(); void UpdateHeadStatus(); - + bool CheckCollision(AM4_CentipedeBody* Segment, FVector2D Direction); - + FVector2D GetSegmentDirection(AM4_CentipedeBody* Segment); void SetSegmentDirection(AM4_CentipedeBody* Segment, FVector2D Direction); -}; \ No newline at end of file +}; diff --git a/Source/M4_CPP/public/M4_Gamemode.h b/Source/M4_CPP/public/M4_Gamemode.h index 2271f9d..0f940fc 100644 --- a/Source/M4_CPP/public/M4_Gamemode.h +++ b/Source/M4_CPP/public/M4_Gamemode.h @@ -67,7 +67,7 @@ private: int32 CentipedeBodyCount = 10; UPROPERTY() - TObjectPtr CentipedeController; + TObjectPtr CentipedeController; int Score = 0; int Lives = 3; From 7e3424d0f64dd7a588690030be13cb5e0ad3452e Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Fri, 17 Oct 2025 16:51:24 +0200 Subject: [PATCH 2/5] Minor - Modifie la trajectoire de la centipede - V2.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajuste le déplacement de la centipede en modifiant le calcul de sa trajectoire. La centipede se déplace désormais horizontalement, ce qui améliore sa visibilité. --- Source/M4_CPP/private/M4_CentipedeBody.cpp | 1 - .../M4_CPP/private/M4_CentipedeController.cpp | 21 +++++++------------ Source/M4_CPP/private/M4_Gamemode.cpp | 3 +-- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Source/M4_CPP/private/M4_CentipedeBody.cpp b/Source/M4_CPP/private/M4_CentipedeBody.cpp index 3643cfd..df0bdc3 100644 --- a/Source/M4_CPP/private/M4_CentipedeBody.cpp +++ b/Source/M4_CPP/private/M4_CentipedeBody.cpp @@ -10,7 +10,6 @@ AM4_CentipedeBody::AM4_CentipedeBody() GetStaticMeshComponent()->SetStaticMesh(MeshRef.Object); } - // Charger les matériaux par défaut (ajustez les chemins selon vos assets) static ConstructorHelpers::FObjectFinder HeadMatRef(TEXT("/Game/CTP/05_Material/MI_Head.MI_Head")); if (HeadMatRef.Succeeded()) { diff --git a/Source/M4_CPP/private/M4_CentipedeController.cpp b/Source/M4_CPP/private/M4_CentipedeController.cpp index 2c965cf..96b237f 100644 --- a/Source/M4_CPP/private/M4_CentipedeController.cpp +++ b/Source/M4_CPP/private/M4_CentipedeController.cpp @@ -36,7 +36,7 @@ void UM4_CentipedeController::StartCentipede(FVector SpawnLocation) for (int32 i = 0; i < BodyCount; ++i) { - FVector SegmentLocation = SpawnLocation - FVector(0.f, 0.f, i * CellSize); + FVector SegmentLocation = SpawnLocation - FVector(0.f, i * CellSize, 0.f); AM4_CentipedeBody* Body = GetWorld()->SpawnActor( AM4_CentipedeBody::StaticClass(), @@ -57,8 +57,7 @@ void UM4_CentipedeController::StartCentipede(FVector SpawnLocation) Body->SetAsHead(i == 0); } } - - // Initialiser l'historique + SegmentHistory.SetNum(BodyCount); for (int32 i = 0; i < BodyCount; ++i) { @@ -66,7 +65,6 @@ void UM4_CentipedeController::StartCentipede(FVector SpawnLocation) { FVector InitialPos = BodySegments[i]->GetActorLocation(); - // Remplir avec position initiale int32 InitialHistorySize = SegmentSpacing * (i + 1) + MaxHistorySize; for (int32 j = 0; j < InitialHistorySize; ++j) { @@ -138,8 +136,7 @@ void UM4_CentipedeController::Tick(float DeltaTime) Super::Tick(DeltaTime); if (BodySegments.Num() == 0) return; - - // Déplacer la tête + AM4_CentipedeBody* Head = BodySegments[0]; if (Head && Head->bIsHead) { @@ -161,22 +158,19 @@ void UM4_CentipedeController::Tick(float DeltaTime) FVector NewPos = CurrentPos + FVector(0.f, SegmentDirection.Y * CentipedeSpeed * DeltaTime, 0.f); Head->SetActorLocation(NewPos); } - - // Enregistrer position de la tête + SegmentHistory[0].Add(Head->GetActorLocation()); if (SegmentHistory[0].Num() > MaxHistorySize) { SegmentHistory[0].RemoveAt(0); } } - - // Faire suivre les autres segments + for (int32 i = 1; i < BodySegments.Num(); ++i) { AM4_CentipedeBody* Segment = BodySegments[i]; if (!Segment) continue; - - // Récupérer position dans l'historique du segment précédent + int32 PrevIndex = i - 1; int32 HistoryLookback = SegmentSpacing; @@ -186,8 +180,7 @@ void UM4_CentipedeController::Tick(float DeltaTime) FVector TargetPos = SegmentHistory[PrevIndex][HistoryIndex]; Segment->SetActorLocation(TargetPos); - - // Enregistrer position actuelle + SegmentHistory[i].Add(Segment->GetActorLocation()); if (SegmentHistory[i].Num() > MaxHistorySize) { diff --git a/Source/M4_CPP/private/M4_Gamemode.cpp b/Source/M4_CPP/private/M4_Gamemode.cpp index 304dfeb..2d97557 100644 --- a/Source/M4_CPP/private/M4_Gamemode.cpp +++ b/Source/M4_CPP/private/M4_Gamemode.cpp @@ -85,8 +85,7 @@ void AM4_Gamemode::BeginPlay() ); } } - - // Spawn centipede controller + PRINT_SCREEN(TEXT("Spawning Centipede Controller"), FColor::Green); FVector CentipedeSpawnLocation = FVector( From a85c596e2320739b4b46fa16eacc97817397b16a Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Sat, 18 Oct 2025 22:25:27 +0200 Subject: [PATCH 3/5] =?UTF-8?q?Minor=20-=20Optimise=20les=20param=C3=A8tre?= =?UTF-8?q?s=20graphiques=20-=20V?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduit les paramètres graphiques par défaut pour une meilleure performance. Desactive le ray tracing matériel et d'autres fonctionnalités gourmandes en ressources. --- Config/DefaultEngine.ini | 13 ++++++++++--- Content/CTP/01_Level/L_Default.umap | Bin 30325 -> 38060 bytes 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 5db7bd6..bb351c0 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -10,9 +10,9 @@ r.AllowStaticLighting=False r.GenerateMeshDistanceFields=True -r.DynamicGlobalIlluminationMethod=1 +r.DynamicGlobalIlluminationMethod=0 -r.ReflectionMethod=1 +r.ReflectionMethod=0 r.SkinCache.CompileShaders=True @@ -27,6 +27,12 @@ r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 +r.Lumen.HardwareRayTracing=False +r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject=False +r.Mobile.SupportsGen4TAA=False +r.CustomDepthTemporalAAJitter=False +r.AntiAliasingMethod=1 +r.DefaultFeature.MotionBlur=False [/Script/WindowsTargetPlatform.WindowsTargetSettings] DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 @@ -96,4 +102,5 @@ ManualIPAddress= [CoreRedirects] -+ClassRedirects=(OldName="/Script/M4_CPP.M4_CentipedeController",NewName="/Script/M4_CPP.M4_CentipedeController") \ No newline at end of file ++ClassRedirects=(OldName="/Script/M4_CPP.M4_CentipedeController",NewName="/Script/M4_CPP.M4_CentipedeController") + diff --git a/Content/CTP/01_Level/L_Default.umap b/Content/CTP/01_Level/L_Default.umap index c957fa72e4a7c495e5758a84572f01b517a9b55a..0bb66cfc185c45be978f47b5ade4e48a6a937fef 100644 GIT binary patch literal 38060 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 Date: Sat, 18 Oct 2025 22:25:27 +0200 Subject: [PATCH 4/5] =?UTF-8?q?Patch=20-=20Optimise=20les=20param=C3=A8tre?= =?UTF-8?q?s=20graphiques=20-=20V2.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduit les paramètres graphiques par défaut pour une meilleure performance. Desactive le ray tracing matériel et d'autres fonctionnalités gourmandes en ressources. --- Config/DefaultEngine.ini | 13 ++++++++++--- Content/CTP/01_Level/L_Default.umap | Bin 30325 -> 38060 bytes 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 5db7bd6..bb351c0 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -10,9 +10,9 @@ r.AllowStaticLighting=False r.GenerateMeshDistanceFields=True -r.DynamicGlobalIlluminationMethod=1 +r.DynamicGlobalIlluminationMethod=0 -r.ReflectionMethod=1 +r.ReflectionMethod=0 r.SkinCache.CompileShaders=True @@ -27,6 +27,12 @@ r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 +r.Lumen.HardwareRayTracing=False +r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject=False +r.Mobile.SupportsGen4TAA=False +r.CustomDepthTemporalAAJitter=False +r.AntiAliasingMethod=1 +r.DefaultFeature.MotionBlur=False [/Script/WindowsTargetPlatform.WindowsTargetSettings] DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 @@ -96,4 +102,5 @@ ManualIPAddress= [CoreRedirects] -+ClassRedirects=(OldName="/Script/M4_CPP.M4_CentipedeController",NewName="/Script/M4_CPP.M4_CentipedeController") \ No newline at end of file ++ClassRedirects=(OldName="/Script/M4_CPP.M4_CentipedeController",NewName="/Script/M4_CPP.M4_CentipedeController") + diff --git a/Content/CTP/01_Level/L_Default.umap b/Content/CTP/01_Level/L_Default.umap index c957fa72e4a7c495e5758a84572f01b517a9b55a..0bb66cfc185c45be978f47b5ade4e48a6a937fef 100644 GIT binary patch literal 38060 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 Date: Thu, 30 Oct 2025 23:44:26 +0100 Subject: [PATCH 5/5] Minor - Change le comportement du mille-pattes - V2.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Améliore la logique de collision du mille-pattes avec les bords et les champignons. Le mille-pattes change de direction lorsqu'il atteint les limites de la zone de jeu ou rencontre un champignon. --- .../M4_CPP/private/M4_CentipedeController.cpp | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/Source/M4_CPP/private/M4_CentipedeController.cpp b/Source/M4_CPP/private/M4_CentipedeController.cpp index 96b237f..39884d4 100644 --- a/Source/M4_CPP/private/M4_CentipedeController.cpp +++ b/Source/M4_CPP/private/M4_CentipedeController.cpp @@ -1,6 +1,8 @@ #include "M4_CentipedeController.h" #include "M4_LOG.h" #include "M4_Gamemode.h" +#include "M4_Mushroom.h" +#include "Kismet/GameplayStatics.h" UM4_CentipedeController::UM4_CentipedeController() { @@ -143,9 +145,9 @@ void UM4_CentipedeController::Tick(float DeltaTime) FVector CurrentPos = Head->GetActorLocation(); FVector2D SegmentDirection = GetSegmentDirection(Head); - bool bShouldDescend = CheckCollision(Head, SegmentDirection); + bool bRowChanged = CheckCollision(Head, SegmentDirection); - if (bShouldDescend) + if (bRowChanged) { FVector NewPos = CurrentPos - FVector(0.f, 0.f, CellSize); Head->SetActorLocation(NewPos); @@ -204,11 +206,53 @@ bool UM4_CentipedeController::CheckCollision(AM4_CentipedeBody* Segment, FVector const float LeftBound = GM->MushroomSpawnBounds.Min.Y; const float RightBound = GM->MushroomSpawnBounds.Max.Y; + const float MinRows = GM->MushroomSpawnBounds.Min.X; + const float MaxRows = GM->MushroomSpawnBounds.Max.X; if (NextPos.Y <= LeftBound || NextPos.Y >= RightBound) { return true; } + + if (CurrentPos.Z > MinRows && NextPos.Z <= MinRows) + { + // On inverse la direction de descente pour remonter + FVector2D CurrentDirection = GetSegmentDirection(Segment); + CurrentDirection.Y *= -1.f; + SetSegmentDirection(Segment, CurrentDirection); + return true; // Collision détectée, le centipede descendra à la prochaine itération + } + + // Vérification si on atteint la limite haute + if (CurrentPos.Z < MaxRows && NextPos.Z >= MaxRows) + { + // On inverse la direction de montée pour descendre + FVector2D CurrentDirection = GetSegmentDirection(Segment); + CurrentDirection.Y *= -1.f; + SetSegmentDirection(Segment, CurrentDirection); + return true; // Collision détectée, le centipede remontera à la prochaine itération + } + + int32 NextGridZ = FMath::RoundToInt(NextPos.Z / CellSize); + int32 NextGridY = FMath::RoundToInt(NextPos.Y / CellSize); + + TArray FoundMushrooms; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), AM4_Mushroom::StaticClass(), FoundMushrooms); + + for (AActor* Actor : FoundMushrooms) + { + FVector MushroomPos = Actor->GetActorLocation(); + + // Conversion de la position du mushroom en coordonnées de grille (Z, Y) + int32 MushroomGridZ = FMath::RoundToInt(MushroomPos.Z / CellSize); + int32 MushroomGridY = FMath::RoundToInt(MushroomPos.Y / CellSize); + + // Vérification si c'est la même cellule de grille + if (NextGridZ == MushroomGridZ && NextGridY == MushroomGridY) + { + return true; + } + } return false; }