From bb8d95d8c21a027c15aec843d0eeb99d4b761fe2 Mon Sep 17 00:00:00 2001 From: Chad Doty Date: Mon, 21 Jul 2025 05:08:41 -0400 Subject: [PATCH] Projectile Spawn and Projectile Mesh --- .../Blueprints/Actors/BP_Projectile.uasset | Bin 0 -> 30219 bytes Content/Blueprints/Pawns/BP_PawnTurret.uasset | Bin 34426 -> 34727 bytes Content/Blueprints/Pawns/BP_Tank.uasset | Bin 37649 -> 37881 bytes Content/Maps/Main.umap | Bin 139524 -> 139524 bytes Source/ToonTanks/BasePawn.cpp | 10 ++-- Source/ToonTanks/BasePawn.h | 3 ++ Source/ToonTanks/Projectile.cpp | 33 ++++++++++++ Source/ToonTanks/Projectile.h | 33 ++++++++++++ Source/ToonTanks/Tower.cpp | 47 ++++++++++++++---- Source/ToonTanks/Tower.h | 5 ++ ToonTanks.uproject | 5 +- 11 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 Content/Blueprints/Actors/BP_Projectile.uasset create mode 100644 Source/ToonTanks/Projectile.cpp create mode 100644 Source/ToonTanks/Projectile.h diff --git a/Content/Blueprints/Actors/BP_Projectile.uasset b/Content/Blueprints/Actors/BP_Projectile.uasset new file mode 100644 index 0000000000000000000000000000000000000000..fa79088e33abff32ab09d1d5d97d2f5e8c6427d8 GIT binary patch literal 30219 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 HvHt%9C4@tr literal 0 HcmV?d00001 diff --git a/Content/Blueprints/Pawns/BP_PawnTurret.uasset b/Content/Blueprints/Pawns/BP_PawnTurret.uasset index 2f97f90f2ae7efb6a60f4b6078f855b72950354e..ebb49e947e5374925830ecc6436d69e3cc3c775a 100644 GIT binary patch delta 6177 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 delta 7497 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 RJ<}8SGfHkh{+ZEM7XTOj|EmB1 delta 567 zcmZoU#L;qyV}gVT-`$4}di)$gE>9LGdix(WJeHQjy-_FkD5L*mt)uyqKb#laEPpJC ziQCcHI54x+!z{7LV)Djbc_nA3kcz;n)IgV#GNba$3ZwiI7r$bCg8<`1$G`y3P*+ET z$!AYUiuna*hgjrlSNJ*VlVyU`WUgbPn{!SkF);^vyG_1$T7xIhxGdAvC$K81%-mx# z>lr;hFN?&?Bz-549k|p0{h_=0!kGwAEQ9)?WI+} z-|d|HXzG?HpB67T1d>aizCn|bW&7jlj5XW>>hmQ|E#)hEu+p1h;lVz|>mUW1+h;6h z+~P0k`RDbi>dl=8Vm=&ZJ)qm~puOyjzK48)L*Mj=JdDEA5ud XO)_&}fP$XsiTfEPw;%t^XsZhVt#{|W diff --git a/Source/ToonTanks/BasePawn.cpp b/Source/ToonTanks/BasePawn.cpp index 42f09cb..12d26c5 100644 --- a/Source/ToonTanks/BasePawn.cpp +++ b/Source/ToonTanks/BasePawn.cpp @@ -4,6 +4,7 @@ #include "BasePawn.h" #include "Components/CapsuleComponent.h" #include "Kismet/GameplayStatics.h" +#include "Projectile.h" // Sets default values ABasePawn::ABasePawn() @@ -40,16 +41,19 @@ void ABasePawn::RotateTurret(FVector LookAtTarget) void ABasePawn::Fire() { - FVector ProjectileSpawnPointLocation = ProjectileSpawnPoint->GetComponentLocation(); + FVector Location = ProjectileSpawnPoint->GetComponentLocation(); + FRotator Rotation = ProjectileSpawnPoint->GetComponentRotation(); - DrawDebugSphere( + GetWorld()->SpawnActor(ProjectileClass, Location, Rotation); + + /*DrawDebugSphere( GetWorld(), ProjectileSpawnPointLocation, 25.f, 12, FColor::Red, false, - 3.f); + 3.f); */ } // Called every frame diff --git a/Source/ToonTanks/BasePawn.h b/Source/ToonTanks/BasePawn.h index 7afe486..5fbfa96 100644 --- a/Source/ToonTanks/BasePawn.h +++ b/Source/ToonTanks/BasePawn.h @@ -36,6 +36,7 @@ protected: void RotateTurret(FVector LookAtTarget); void Fire(); + private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) @@ -57,4 +58,6 @@ private: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Super Duper Variables", meta = (AllowPrivateAccess = "true")) int32 VisibleAnywhere = 12; + UPROPERTY(EditDefaultsOnly, Category = "Combat") + TSubclassOf ProjectileClass; }; diff --git a/Source/ToonTanks/Projectile.cpp b/Source/ToonTanks/Projectile.cpp new file mode 100644 index 0000000..92cfe43 --- /dev/null +++ b/Source/ToonTanks/Projectile.cpp @@ -0,0 +1,33 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Projectile.h" +#include "Components/StaticMeshComponent.h" +#include "GameFramework/ProjectileMovementComponent.h" + +// Sets default values +AProjectile::AProjectile() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = false; + + ProjectileMesh = CreateDefaultSubobject(TEXT("Projectile Mesh")); + RootComponent = ProjectileMesh; + + ProjectileMovementComponent = CreateDefaultSubobject(TEXT("Projectile Movement Component")); + ProjectileMovementComponent->MaxSpeed = 1300.f; + ProjectileMovementComponent->InitialSpeed = 1300.f; +} + +// Called when the game starts or when spawned +void AProjectile::BeginPlay() +{ + Super::BeginPlay(); +} + +// Called every frame +void AProjectile::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); +} + diff --git a/Source/ToonTanks/Projectile.h b/Source/ToonTanks/Projectile.h new file mode 100644 index 0000000..c997084 --- /dev/null +++ b/Source/ToonTanks/Projectile.h @@ -0,0 +1,33 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Projectile.generated.h" + +UCLASS() +class TOONTANKS_API AProjectile : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + AProjectile(); + +protected: + // Called when the game starts or when spawned + virtual void BeginPlay() override; + +private: + //Mesh in the bp + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Combat", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* ProjectileMesh; + + UPROPERTY(VisibleAnywhere, Category = "Movement") + class UProjectileMovementComponent* ProjectileMovementComponent; + +public: + // Called every frame + virtual void Tick(float DeltaTime) override; +}; diff --git a/Source/ToonTanks/Tower.cpp b/Source/ToonTanks/Tower.cpp index 513164c..e6f03f6 100644 --- a/Source/ToonTanks/Tower.cpp +++ b/Source/ToonTanks/Tower.cpp @@ -4,24 +4,17 @@ #include "Tower.h" #include "Tank.h" #include "Kismet/GameplayStatics.h" +#include "TimerManager.h" void ATower::Tick(float DeltaTime) { Super::Tick(DeltaTime); - // Find the distance to the tank - if (Tank) + if (InFireRange()) { - float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation()); - - // check to see if the tank is in range - if (Distance <= FireRange) - { - // if in range, rotate turret toward the tank - RotateTurret(Tank->GetActorLocation()); - } + // if in range, rotate turret toward the tank + RotateTurret(Tank->GetActorLocation()); } - } void ATower::BeginPlay() @@ -29,4 +22,36 @@ void ATower::BeginPlay() Super::BeginPlay(); Tank = Cast(UGameplayStatics::GetPlayerPawn(this, 0)); + + GetWorldTimerManager().SetTimer( + FireRateTimerHandle, + this, + &ATower::CheckFireCondition, + FireRate, + true); } + +void ATower::CheckFireCondition() +{ + // Find the distance to the tank + if (InFireRange()) + { + //UE_LOG(LogTemp, Warning, TEXT("Shot Fired!")); + Fire(); + } +} + +bool ATower::InFireRange() +{ + // Find the distance to the tank + if (Tank) + { + float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation()); + // check to see if the tank is in range + if (Distance <= FireRange) + { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/Source/ToonTanks/Tower.h b/Source/ToonTanks/Tower.h index d1115cc..57dfff9 100644 --- a/Source/ToonTanks/Tower.h +++ b/Source/ToonTanks/Tower.h @@ -29,4 +29,9 @@ private: UPROPERTY(EditDefaultsOnly, Category="Combat") float FireRange = 700.f; + FTimerHandle FireRateTimerHandle; + float FireRate = 2.f; + void CheckFireCondition(); + + bool InFireRange(); }; diff --git a/ToonTanks.uproject b/ToonTanks.uproject index c7673e5..b5b9dd7 100644 --- a/ToonTanks.uproject +++ b/ToonTanks.uproject @@ -7,7 +7,10 @@ { "Name": "ToonTanks", "Type": "Runtime", - "LoadingPhase": "Default" + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] } ], "Plugins": [