Files
Yamato/Source/MyProject3/SpaceshipPawn.h

208 lines
6.9 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "InputActionValue.h"
#include "Blueprint/UserWidget.h"
#include "SpaceshipPawn.generated.h"
// Movement mode enum to allow switching between different control schemes
UENUM(BlueprintType)
enum class EShipMovementMode : uint8
{
Arcade, // Direct control, minimal inertia
Assisted, // Some inertia with auto-stabilization
Realistic // Full physics with momentum (original)
};
UCLASS()
class MYPROJECT3_API ASpaceshipPawn : public APawn
{
GENERATED_BODY()
public:
ASpaceshipPawn();
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// Override TakeDamage to handle player damage
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent,
class AController* EventInstigator, AActor* DamageCauser) override;
// Get current health percentage
UFUNCTION(BlueprintCallable, Category = "Combat")
float GetHealthPercentage() const { return CurrentHealth / MaxHealth; }
// Get current shield percentage
UFUNCTION(BlueprintCallable, Category = "Combat")
float GetShieldPercentage() const { return CurrentShield / MaxShield; }
protected:
virtual void BeginPlay() override;
// Components
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Components")
class UStaticMeshComponent* ShipMesh;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Components")
class USpringArmComponent* CameraSpringArm;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Components")
class UCameraComponent* Camera;
// Enhanced Input Components
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputMappingContext* DefaultMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* ThrottleAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* MouseLookAction;
// Add a strafe input to allow lateral movement
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* StrafeAction;
// Input action for shooting
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* ShootAction;
// Movement Parameters
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
EShipMovementMode MovementMode = EShipMovementMode::Arcade;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float MaxSpeed = 3000.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float Acceleration = 2000.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float Deceleration = 1500.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float RotationSpeed = 5.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float MouseSensitivity = 2.0f;
// Auto-stabilization for assisted mode
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement", meta = (ClampMin = "0.0", ClampMax = "10.0"))
float StabilizationSpeed = 3.0f;
// How much momentum to preserve when changing direction (0 = none, 1 = full)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement", meta = (ClampMin = "0.0", ClampMax = "1.0"))
float DirectionalInertia = 0.1f;
// How quickly the ship aligns with its movement direction
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement", meta = (ClampMin = "0.0", ClampMax = "10.0"))
float VelocityAlignmentSpeed = 4.0f;
// Auto-braking when not thrusting in Arcade mode
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
bool bAutoBrakeEnabled = true;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float AutoBrakeStrength = 3.0f;
// Shooting properties
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
TSubclassOf<class ASpaceshipProjectile> ProjectileClass;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float FireRate = 0.2f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
USceneComponent* ProjectileSpawnPoint;
UPROPERTY(EditDefaultsOnly, Category = "UI")
TSubclassOf<UUserWidget> CrosshairWidgetClass;
UPROPERTY()
UUserWidget* CrosshairWidget;
// Input functions
void HandleThrottleInput(const FInputActionValue& Value);
void HandleStrafeInput(const FInputActionValue& Value);
void HandleMouseLook(const FInputActionValue& Value);
// Health properties
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float MaxHealth = 100.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float CurrentHealth = 100.0f;
// Shield properties
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float MaxShield = 100.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float CurrentShield = 100.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float ShieldRechargeRate = 5.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
float ShieldRechargeDelay = 3.0f;
// Impact effects
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects")
UParticleSystem* ImpactEffect;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects")
class USoundBase* ImpactSound;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects")
class UCameraShakeBase* DamageShake;
// Damage flash effect for the ship
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects")
float DamageFlashDuration = 0.2f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects")
FLinearColor DamageFlashColor = FLinearColor(1.0f, 0.0f, 0.0f, 0.5f);
private:
// Movement state
float CurrentThrottleInput;
float CurrentStrafeInput;
bool bThrottlePressed;
FVector CurrentVelocity;
FRotator TargetRotation;
float CurrentPitch;
float CurrentYaw;
APlayerController* PlayerControllerRef;
FVector2D MouseDeltaSmoothed;
FVector2D LastMouseDelta;
float MouseSmoothingSpeed = 10.0f;
FTimerHandle FireTimerHandle;
bool bCanFire = true;
void HandleShoot(const FInputActionValue& Value);
void Fire();
void ResetFire();
// Movement helper functions
void UpdateArcadeMovement(float DeltaTime);
void UpdateAssistedMovement(float DeltaTime);
void UpdateRealisticMovement(float DeltaTime);
void UpdateShipRotation(float DeltaTime);
// Damage handling
void ApplyDamageFlash();
void ResetDamageFlash();
FTimerHandle ShieldRechargeTimerHandle;
FTimerHandle DamageFlashTimerHandle;
float LastDamageTime;
void StartShieldRecharge();
void RechargeShield();
bool IsDead() const { return CurrentHealth <= 0.0f; }
void Die();
};