82 - Crosshair Spread

This commit is contained in:
Kingsmedia 2022-05-05 18:48:17 +02:00
parent e75c93aeb4
commit afa339d8c1
4 changed files with 46 additions and 10 deletions

View File

@ -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);
}
}

View File

@ -62,4 +62,11 @@ private:
float AimWalkSpeed;
bool bFireButtonPressed;
/*
* HUD and Crosshairs
*/
float CrosshairVelocityFactor;
float CrosshairInAirFactor;
};

View File

@ -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(

View File

@ -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; };