diff --git a/Source/M4_CPP/private/M4_Mushroom.cpp b/Source/M4_CPP/private/M4_Mushroom.cpp index ba7fde7..3c2556c 100644 --- a/Source/M4_CPP/private/M4_Mushroom.cpp +++ b/Source/M4_CPP/private/M4_Mushroom.cpp @@ -6,6 +6,7 @@ #include "M4_CTP_Macros.h" #include "Kismet/GameplayStatics.h" #include "M4_Gamemode.h" +#include "M4_Projectile.h" // Sets default values @@ -38,19 +39,19 @@ AM4_Mushroom::AM4_Mushroom() void AM4_Mushroom::BeginPlay() { - MushLife = 3; + MushLife = 2; DestructionHit = 0; Super::BeginPlay(); } void AM4_Mushroom::OnHit(UPrimitiveComponent* HitComp,AActor* OtherActor,UPrimitiveComponent* OtherComp,FVector NormalImpulse,const FHitResult& Hit) { - if (OtherActor != this) - { - DestructionHit++; - if (DestructionHit == MushLife) - { - Destroy(); - } - } + // check if the other actor is a projectile + AM4_Projectile* Projectile = Cast(OtherActor); + if (!Projectile) + return; + + if (DestructionHit++ == MushLife) + Destroy(); + } \ No newline at end of file diff --git a/Source/M4_CPP/private/M4_Projectile.cpp b/Source/M4_CPP/private/M4_Projectile.cpp index 0252839..5b1ced5 100644 --- a/Source/M4_CPP/private/M4_Projectile.cpp +++ b/Source/M4_CPP/private/M4_Projectile.cpp @@ -2,51 +2,53 @@ #include "Components/MeshComponent.h" #include "M4_Gamemode.h" #include "M4_Mushroom.h" +#include "Components/SphereComponent.h" // Sets default values AM4_Projectile::AM4_Projectile() { - PrimaryActorTick.bCanEverTick = true; - - if(!RootComponent) - { - RootComponent = CreateDefaultSubobject(TEXT("ProjectileSceneComponent")); - ProjectileMeshComponent = CreateDefaultSubobject(TEXT("ProjectileMeshComponent")); - ProjectileMeshComponent->SetupAttachment(RootComponent); - - static ConstructorHelpers::FObjectFinder Mesh(TEXT("/Game/CTP/04_Mesh/SM_Projectile.SM_Projectile")); - if(Mesh.Succeeded()) - { - ProjectileMeshComponent->SetStaticMesh(Mesh.Object); - } + PrimaryActorTick.bCanEverTick = true; + + // Crée d'abord le composant de collision comme root + CollisionComp = CreateDefaultSubobject(TEXT("SphereComponent")); + CollisionComp->InitSphereRadius(15.0f); + CollisionComp->SetCollisionProfileName(TEXT("Projectile")); + CollisionComp->OnComponentBeginOverlap.AddDynamic(this, &AM4_Projectile::OnOverlap); + CollisionComp->SetGenerateOverlapEvents(true); + RootComponent = CollisionComp; + + // Ensuite attache le mesh au composant de collision + ProjectileMeshComponent = CreateDefaultSubobject(TEXT("ProjectileMeshComponent")); + ProjectileMeshComponent->SetupAttachment(RootComponent); + ProjectileMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Le mesh ne gère pas la collision + + static ConstructorHelpers::FObjectFinder Mesh(TEXT("/Game/CTP/04_Mesh/SM_Projectile.SM_Projectile")); + if(Mesh.Succeeded()) + { + ProjectileMeshComponent->SetStaticMesh(Mesh.Object); + } - static ConstructorHelpers::FObjectFinder Material(TEXT("/Game/CTP/05_Material/M_Player.M_Player")); - if (Material.Succeeded()) - { - ProjectileMat = UMaterialInstanceDynamic::Create(Material.Object, ProjectileMeshComponent); - } + static ConstructorHelpers::FObjectFinder Material(TEXT("/Game/CTP/05_Material/M_Player.M_Player")); + if (Material.Succeeded()) + { + ProjectileMat = UMaterialInstanceDynamic::Create(Material.Object, ProjectileMeshComponent); + } - ProjectileMeshComponent->SetMaterial(0, ProjectileMat); - ProjectileMeshComponent->SetRelativeScale3D(FVector(.8f, .3f, .35f)); - ProjectileMeshComponent->SetMobility(EComponentMobility::Movable); - ProjectileMeshComponent->SetRelativeLocation(InitialLoc); + ProjectileMeshComponent->SetMaterial(0, ProjectileMat); + ProjectileMeshComponent->SetRelativeScale3D(FVector(.8f, .3f, .35f)); + ProjectileMeshComponent->SetMobility(EComponentMobility::Movable); + ProjectileMeshComponent->SetRelativeLocation(FVector::ZeroVector); - ProjectileMovementComponent = CreateDefaultSubobject(TEXT("ProjectileMovementComponent")); - ProjectileMovementComponent->SetUpdatedComponent(CollisionComp); - ProjectileMovementComponent->InitialSpeed = 380.f; - ProjectileMovementComponent->MaxSpeed = 380.f; - ProjectileMovementComponent->bRotationFollowsVelocity = false; - ProjectileMovementComponent->bShouldBounce = false; - ProjectileMovementComponent->ProjectileGravityScale = 0.0f; - - InitialLifeSpan = 10.f; - } - - if(!CollisionComp) - { - CollisionComp = CreateDefaultSubobject(TEXT("MeshComponent")); - } + // Configure le ProjectileMovementComponent + ProjectileMovementComponent = CreateDefaultSubobject(TEXT("ProjectileMovementComponent")); + ProjectileMovementComponent->SetUpdatedComponent(CollisionComp); // Maintenant CollisionComp existe + ProjectileMovementComponent->InitialSpeed = 380.f; + ProjectileMovementComponent->MaxSpeed = 380.f; + ProjectileMovementComponent->bRotationFollowsVelocity = false; + ProjectileMovementComponent->bShouldBounce = false; + ProjectileMovementComponent->ProjectileGravityScale = 0.0f; + InitialLifeSpan = 10.f; } ///FAIRE SUPER GAFFE AUX INDENTATIONS ET LES FOR LOOPS sont à bien faire. ///Ce qui est critique dans notre code doit être vraiment bien mis en évidence sans être obscurci par la boucle. @@ -58,17 +60,21 @@ void AM4_Projectile::BeginPlay() InitialLoc = GetActorLocation(); } -void AM4_Projectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +void AM4_Projectile::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { + UE_LOG(LogTemp, Warning, TEXT("Projectile OVERLAP: %s"), *OtherActor->GetName()); + if (OtherActor && OtherActor != this && OtherComp != nullptr) { AM4_Mushroom* Mushroom = Cast(OtherActor); if (Mushroom) { - Mushroom->OnHit(HitComp,OtherActor,OtherComp,NormalImpulse,Hit); + UE_LOG(LogTemp, Warning, TEXT("OVERLAP MUSHROOM!")); + + FVector NormalImpulse = FVector::ZeroVector; + Mushroom->OnHit(OverlappedComponent, this, OtherComp, NormalImpulse, SweepResult); + Destroy(); } - - Destroy(); } } diff --git a/Source/M4_CPP/public/M4_Projectile.h b/Source/M4_CPP/public/M4_Projectile.h index 3d0059f..ba49c86 100644 --- a/Source/M4_CPP/public/M4_Projectile.h +++ b/Source/M4_CPP/public/M4_Projectile.h @@ -6,6 +6,7 @@ #include "GameFramework/Actor.h" #include "M4_Projectile.generated.h" +class USphereComponent; class UMeshComponent; UCLASS() @@ -25,7 +26,7 @@ public: FVector NewLoc; UPROPERTY(VisibleDefaultsOnly, Category = Projectile) - UMeshComponent* CollisionComp; + USphereComponent* CollisionComp; UPROPERTY(VisibleAnywhere, Category = Movement) UProjectileMovementComponent* ProjectileMovementComponent; @@ -36,7 +37,8 @@ public: UPROPERTY(VisibleDefaultsOnly, Category = Projectile) UMaterialInstanceDynamic* ProjectileMat; - UFUNCTION() - void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); + UFUNCTION() + void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); void FireInDir(const FVector& ShootDir); }; +