diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index 9d51a6e..1928a2a 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -74,6 +74,25 @@ void UCombatComponent::SetHUDCrosshairs(float DeltaTime) HUDPackage.CrosshairsBottom = nullptr; } + // Calculate crosshair spread + // Velocity [0, 600] -> Spread [0, 1] + const FVector2D WalkSpeedRange(0.f, Character->GetCharacterMovement()->MaxWalkSpeed); + const FVector2D VelocityMultiplierRange(0.f, 1.f); + FVector Velocity = Character->GetVelocity(); + Velocity.Z = 0.f; + + CrosshairVelocityFactor = FMath::GetMappedRangeValueClamped(WalkSpeedRange, VelocityMultiplierRange, Velocity.Size()); + + if (Character->GetCharacterMovement()->IsFalling()) + { + CrosshairInAirFactor = FMath::FInterpTo(CrosshairInAirFactor, 2.25f, DeltaTime, 2.25f); + } + else + { + CrosshairInAirFactor = FMath::FInterpTo(CrosshairInAirFactor, 0.f, DeltaTime, 30.f); + } + + HUDPackage.CrosshairSpread = CrosshairVelocityFactor + CrosshairInAirFactor; HUD->SetHUDPackage(HUDPackage); } } diff --git a/Source/Blaster/Components/CombatComponent.h b/Source/Blaster/Components/CombatComponent.h index 2e25cde..9cb07b4 100644 --- a/Source/Blaster/Components/CombatComponent.h +++ b/Source/Blaster/Components/CombatComponent.h @@ -62,4 +62,11 @@ private: float AimWalkSpeed; bool bFireButtonPressed; + + /* + * HUD and Crosshairs + */ + + float CrosshairVelocityFactor; + float CrosshairInAirFactor; }; diff --git a/Source/Blaster/HUD/BlasterHUD.cpp b/Source/Blaster/HUD/BlasterHUD.cpp index 77614b3..92d1b3d 100644 --- a/Source/Blaster/HUD/BlasterHUD.cpp +++ b/Source/Blaster/HUD/BlasterHUD.cpp @@ -7,42 +7,48 @@ void ABlasterHUD::DrawHUD() { Super::DrawHUD(); - FVector2D ViewportSize; if (GEngine) { + FVector2D ViewportSize; GEngine->GameViewport->GetViewportSize(ViewportSize); const FVector2D ViewportCenter(ViewportSize.X / 2.f, ViewportSize.Y / 2.f); + const float SpreadScaled = CrosshairSpreadMax * HUDPackage.CrosshairSpread; if (HUDPackage.CrosshairsCenter) { - DrawCrosshair(HUDPackage.CrosshairsCenter, ViewportCenter); + const FVector2D Spread(0.f, 0.f); + DrawCrosshair(HUDPackage.CrosshairsCenter, ViewportCenter, Spread); } if (HUDPackage.CrosshairsLeft) { - DrawCrosshair(HUDPackage.CrosshairsLeft, ViewportCenter); + const FVector2D Spread(-SpreadScaled, 0.f); + DrawCrosshair(HUDPackage.CrosshairsLeft, ViewportCenter, Spread); } if (HUDPackage.CrosshairsRight) { - DrawCrosshair(HUDPackage.CrosshairsRight, ViewportCenter); + const FVector2D Spread(SpreadScaled, 0.f); + DrawCrosshair(HUDPackage.CrosshairsRight, ViewportCenter, Spread); } if (HUDPackage.CrosshairsTop) { - DrawCrosshair(HUDPackage.CrosshairsTop, ViewportCenter); + const FVector2D Spread(0.f, -SpreadScaled); + DrawCrosshair(HUDPackage.CrosshairsTop, ViewportCenter, Spread); } if (HUDPackage.CrosshairsBottom) { - DrawCrosshair(HUDPackage.CrosshairsBottom, ViewportCenter); + const FVector2D Spread(0.f, SpreadScaled); + DrawCrosshair(HUDPackage.CrosshairsBottom, ViewportCenter, Spread); } } } -void ABlasterHUD::DrawCrosshair(UTexture2D* Texture, FVector2D ViewportCenter) +void ABlasterHUD::DrawCrosshair(UTexture2D* Texture, FVector2D ViewportCenter, FVector2D Spread) { const float TextureWidth = Texture->GetSizeX(); const float TextureHeight = Texture->GetSizeY(); const FVector2D TextureDrawPoint( - ViewportCenter.X - (TextureWidth / 2.f), - ViewportCenter.Y - (TextureHeight / 2.f) + ViewportCenter.X - (TextureWidth / 2.f) + Spread.X, + ViewportCenter.Y - (TextureHeight / 2.f) + Spread.Y ); DrawTexture( diff --git a/Source/Blaster/HUD/BlasterHUD.h b/Source/Blaster/HUD/BlasterHUD.h index 4edf764..c36dcd2 100644 --- a/Source/Blaster/HUD/BlasterHUD.h +++ b/Source/Blaster/HUD/BlasterHUD.h @@ -17,6 +17,7 @@ public: UTexture2D* CrosshairsRight; UTexture2D* CrosshairsTop; UTexture2D* CrosshairsBottom; + float CrosshairSpread; }; /** @@ -33,7 +34,10 @@ public: private: FHUDPackage HUDPackage; - void DrawCrosshair(UTexture2D* Texture, FVector2D ViewportCenter); + void DrawCrosshair(UTexture2D* Texture, FVector2D ViewportCenter, FVector2D Spread); + + UPROPERTY(EditAnywhere) + float CrosshairSpreadMax = 16.f; public: FORCEINLINE void SetHUDPackage(const FHUDPackage& Package) { HUDPackage = Package; };