From 1797fd1ba67064241d45df3906bd78503b713416 Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Thu, 16 Oct 2025 15:27:44 +0200 Subject: [PATCH] =?UTF-8?q?Minor=20-=20Ajoute=20une=20cam=C3=A9ra=20orthog?= =?UTF-8?q?raphique=20-=20V01.06.00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implémente une caméra orthographique pour une vue 2D. Ajuste le mouvement du joueur pour qu'il soit contraint par les limites du niveau. Remplace l'ancienne caméra dans le PlayerPawn par une nouvelle dans le PlayerController. --- Content/CTP/01_Level/L_Default.umap | Bin 48646 -> 46073 bytes Content/CTP/03_Input/IA_Move.uasset | Bin 1637 -> 1637 bytes Content/CTP/03_Input/IMC_Default.uasset | Bin 3110 -> 4540 bytes Source/M4_CPP/private/M4_PlayerController.cpp | 15 +++++++++- Source/M4_CPP/private/M4_PlayerPawn.cpp | 27 ++++++++---------- Source/M4_CPP/public/M4_Gamemode.h | 3 +- Source/M4_CPP/public/M4_PlayerController.h | 5 ++++ Source/M4_CPP/public/M4_PlayerPawn.h | 6 ++-- 8 files changed, 35 insertions(+), 21 deletions(-) diff --git a/Content/CTP/01_Level/L_Default.umap b/Content/CTP/01_Level/L_Default.umap index b92d96f7f22cb53736a22ed211c10cdb7cfb0e8a..5006a924cf663bbef08393eaa6145ba6a3486ad2 100644 GIT binary patch literal 46073 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 I(2-r_j%(&EIsGETh8IPsRm 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 Ru%?7y#M=P3N&<4;mLGwIkh=f? diff --git a/Source/M4_CPP/private/M4_PlayerController.cpp b/Source/M4_CPP/private/M4_PlayerController.cpp index e7004b6..293298f 100644 --- a/Source/M4_CPP/private/M4_PlayerController.cpp +++ b/Source/M4_CPP/private/M4_PlayerController.cpp @@ -1,6 +1,5 @@ #include "M4_PlayerController.h" #include "EnhancedInputSubsystems.h" -#include "Camera/CameraComponent.h" AM4_PlayerController::AM4_PlayerController() { @@ -9,12 +8,26 @@ AM4_PlayerController::AM4_PlayerController() { DefaultMappingContext = MappingContextRef.Object; } + } void AM4_PlayerController::BeginPlay() { Super::BeginPlay(); + // Spawn a camera actor + FActorSpawnParameters SpawnParameters; + SpawnParameters.Owner = this; + CameraActor = GetWorld()->SpawnActor(SpawnParameters); + CameraActor->SetActorLocation(FVector(-500.f, 0.f, 0.f)); + + CameraActor->GetCameraComponent()->SetProjectionMode(ECameraProjectionMode::Orthographic); + CameraActor->GetCameraComponent()->SetOrthoWidth(1600.f); + CameraActor->GetCameraComponent()->SetWorldLocation(FVector(-500.f, 0.f, 0.f)); + CameraActor->GetCameraComponent()->SetAspectRatio(192.0f/160.0f); + + SetViewTarget(CameraActor); + if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) { if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(LocalPlayer)) diff --git a/Source/M4_CPP/private/M4_PlayerPawn.cpp b/Source/M4_CPP/private/M4_PlayerPawn.cpp index d98f178..8a42c66 100644 --- a/Source/M4_CPP/private/M4_PlayerPawn.cpp +++ b/Source/M4_CPP/private/M4_PlayerPawn.cpp @@ -1,5 +1,6 @@ #include "M4_PlayerPawn.h" #include "EnhancedInputComponent.h" +#include "M4_Gamemode.h" #include "GameFramework/PlayerController.h" #include "Camera/CameraComponent.h" @@ -17,15 +18,8 @@ AM4_PlayerPawn::AM4_PlayerPawn() MeshComponent->SetMobility(EComponentMobility::Movable); MeshComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); MeshComponent->SetCollisionProfileName(UCollisionProfile::Pawn_ProfileName); - MeshComponent->SetRelativeScale3D(FVector(1.0f)); - - CameraComponent = CreateDefaultSubobject(TEXT("CameraComponent")); - CameraComponent->ProjectionMode = ECameraProjectionMode::Orthographic; - CameraComponent->OrthoWidth = 2048.0f; - CameraComponent->SetAspectRatio(160.0f/192.0f); - CameraComponent->SetupAttachment(RootComponent); - CameraComponent->SetRelativeLocation(FVector(0,0,1000)); - CameraComponent->SetRelativeRotation(FRotator(-90.0f, 0.0f, 0.0f)); + MeshComponent->SetRelativeScale3D(FVector(1.0f, MeshScale.Y, MeshScale.X)); + static ConstructorHelpers::FObjectFinder DefaultMeshRef(TEXT("/Game/CTP/04_Mesh/SM_Cube.SM_Cube")); if (DefaultMeshRef.Succeeded()) @@ -43,19 +37,22 @@ AM4_PlayerPawn::AM4_PlayerPawn() void AM4_PlayerPawn::BeginPlay() { Super::BeginPlay(); - SetActorLocation(FVector(0.0f, 0.0f, 10.0f)); + SetActorLocation(FVector(0.0f, 0.0f, -400.0f)); } void AM4_PlayerPawn::Tick(float DeltaTime) { Super::Tick(DeltaTime); - if (LastMoveValue != 0) + if (AM4_Gamemode* GM = Cast(GetWorld()->GetAuthGameMode())) { - FVector Loc = GetActorLocation(); - Loc.Y += LastMoveValue * MoveSpeed * DeltaTime; - SetActorLocation(Loc); + FVector NewLocation = GetActorLocation() + FVector( 0.0f, LastMoveValue.Y, LastMoveValue.X) * MoveSpeed * DeltaTime; + NewLocation.Z = FMath::Clamp(NewLocation.Z, GM->Bounds.Min.X, GM->Bounds.Max.X); + NewLocation.Y = FMath::Clamp(NewLocation.Y, GM->Bounds.Min.Y, GM->Bounds.Max.Y); + SetActorLocation(NewLocation); } + + } void AM4_PlayerPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) @@ -72,5 +69,5 @@ void AM4_PlayerPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputCompo void AM4_PlayerPawn::Move(const FInputActionInstance& Instance) { - LastMoveValue = Instance.GetValue().Get(); + LastMoveValue = Instance.GetValue().Get().GetSafeNormal(); } \ 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 576a910..a81d4fb 100644 --- a/Source/M4_CPP/public/M4_Gamemode.h +++ b/Source/M4_CPP/public/M4_Gamemode.h @@ -20,5 +20,6 @@ public: virtual void BeginPlay() override; - + UPROPERTY(EditAnywhere) + FBox2D Bounds = FBox2D(FVector2D(-400.0f, -750.0f), FVector2D(-200.0f, 750.0f)); }; diff --git a/Source/M4_CPP/public/M4_PlayerController.h b/Source/M4_CPP/public/M4_PlayerController.h index 0ecedd8..b98dc25 100644 --- a/Source/M4_CPP/public/M4_PlayerController.h +++ b/Source/M4_CPP/public/M4_PlayerController.h @@ -3,6 +3,8 @@ #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "InputMappingContext.h" +#include "Camera/CameraComponent.h" +#include "Camera/CameraActor.h" #include "M4_PlayerController.generated.h" UCLASS() @@ -17,4 +19,7 @@ public: protected: UPROPERTY() UInputMappingContext* DefaultMappingContext; + + UPROPERTY() + TObjectPtr CameraActor; }; \ No newline at end of file diff --git a/Source/M4_CPP/public/M4_PlayerPawn.h b/Source/M4_CPP/public/M4_PlayerPawn.h index cbb898d..cd4ff8d 100644 --- a/Source/M4_CPP/public/M4_PlayerPawn.h +++ b/Source/M4_CPP/public/M4_PlayerPawn.h @@ -24,12 +24,10 @@ protected: UPROPERTY(VisibleAnywhere) UStaticMeshComponent* MeshComponent; - UPROPERTY(VisibleAnywhere) - UCameraComponent* CameraComponent; - UPROPERTY() UInputAction* MoveAction; float MoveSpeed = 500.f; - float LastMoveValue = 0; // Pour stockage du mouvement + FVector2D MeshScale = FVector2D(0.6f, 0.5f); + FVector2D LastMoveValue = FVector2D::ZeroVector; }; \ No newline at end of file