Implement basic combat system
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "SpaceshipProjectile.h"
|
||||
#include "GameFramework/ProjectileMovementComponent.h"
|
||||
#include "Components/StaticMeshComponent.h"
|
||||
#include "EnemySpaceship.h"
|
||||
|
||||
ASpaceshipProjectile::ASpaceshipProjectile()
|
||||
{
|
||||
@@ -12,6 +13,17 @@ ASpaceshipProjectile::ASpaceshipProjectile()
|
||||
ProjectileMesh->SetCollisionProfileName(TEXT("Projectile"));
|
||||
ProjectileMesh->OnComponentHit.AddDynamic(this, &ASpaceshipProjectile::OnHit);
|
||||
|
||||
// Set up collision
|
||||
ProjectileMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
|
||||
ProjectileMesh->SetCollisionObjectType(ECC_WorldDynamic);
|
||||
ProjectileMesh->SetCollisionResponseToAllChannels(ECR_Ignore);
|
||||
ProjectileMesh->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block); // Block pawns (enemies)
|
||||
ProjectileMesh->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); // Block world static
|
||||
ProjectileMesh->SetGenerateOverlapEvents(true);
|
||||
|
||||
// Bind hit event
|
||||
ProjectileMesh->OnComponentHit.AddDynamic(this, &ASpaceshipProjectile::OnHit);
|
||||
|
||||
// Create and setup projectile movement
|
||||
ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovement"));
|
||||
ProjectileMovement->UpdatedComponent = ProjectileMesh;
|
||||
@@ -32,12 +44,32 @@ void ASpaceshipProjectile::BeginPlay()
|
||||
void ASpaceshipProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp,
|
||||
FVector NormalImpulse, const FHitResult& Hit)
|
||||
{
|
||||
if (OtherActor && OtherActor != this)
|
||||
// Debug message to verify hit detection
|
||||
if (GEngine)
|
||||
{
|
||||
// Apply damage to the hit actor (if it implements damage interface)
|
||||
FDamageEvent DamageEvent;
|
||||
OtherActor->TakeDamage(DamageAmount, DamageEvent, nullptr, this);
|
||||
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Yellow,
|
||||
FString::Printf(TEXT("Projectile hit: %s"), *OtherActor->GetName()));
|
||||
}
|
||||
|
||||
if (OtherActor && OtherActor != this)
|
||||
{
|
||||
// Check if we hit an enemy
|
||||
AEnemySpaceship* Enemy = Cast<AEnemySpaceship>(OtherActor);
|
||||
if (Enemy)
|
||||
{
|
||||
// Apply damage
|
||||
FDamageEvent DamageEvent;
|
||||
Enemy->TakeDamage(DamageAmount, DamageEvent, nullptr, this);
|
||||
|
||||
// Debug message for damage
|
||||
if (GEngine)
|
||||
{
|
||||
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red,
|
||||
FString::Printf(TEXT("Dealt %f damage to enemy"), DamageAmount));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Destroy the projectile
|
||||
Destroy();
|
||||
}
|
||||
Reference in New Issue
Block a user