forked from ShrimpSquad/JuniperJam
139 lines
4.8 KiB
C++
139 lines
4.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "SpaceGamePlayerController.h"
|
|
#include "GameFramework/Pawn.h"
|
|
#include "Blueprint/AIBlueprintHelperLibrary.h"
|
|
#include "NiagaraSystem.h"
|
|
#include "NiagaraFunctionLibrary.h"
|
|
#include "SpaceGameCharacter.h"
|
|
#include "Engine/World.h"
|
|
#include "EnhancedInputComponent.h"
|
|
#include "Navigation/PathFollowingComponent.h"
|
|
#include "InputActionValue.h"
|
|
#include "EnhancedInputSubsystems.h"
|
|
#include "Engine/LocalPlayer.h"
|
|
#include "SpaceGame.h"
|
|
|
|
ASpaceGamePlayerController::ASpaceGamePlayerController()
|
|
{
|
|
bIsTouch = false;
|
|
bMoveToMouseCursor = false;
|
|
|
|
// create the path following comp
|
|
PathFollowingComponent = CreateDefaultSubobject<UPathFollowingComponent>(TEXT("Path Following Component"));
|
|
|
|
// configure the controller
|
|
bShowMouseCursor = true;
|
|
DefaultMouseCursor = EMouseCursor::Default;
|
|
CachedDestination = FVector::ZeroVector;
|
|
FollowTime = 0.f;
|
|
}
|
|
|
|
void ASpaceGamePlayerController::SetupInputComponent()
|
|
{
|
|
// set up gameplay key bindings
|
|
Super::SetupInputComponent();
|
|
|
|
// Only set up input on local player controllers
|
|
if (IsLocalPlayerController())
|
|
{
|
|
// Add Input Mapping Context
|
|
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
|
|
{
|
|
Subsystem->AddMappingContext(DefaultMappingContext, 0);
|
|
}
|
|
|
|
// Set up action bindings
|
|
if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
|
|
{
|
|
// Setup mouse input events
|
|
EnhancedInputComponent->BindAction(SetDestinationClickAction, ETriggerEvent::Started, this, &ASpaceGamePlayerController::OnInputStarted);
|
|
EnhancedInputComponent->BindAction(SetDestinationClickAction, ETriggerEvent::Triggered, this, &ASpaceGamePlayerController::OnSetDestinationTriggered);
|
|
EnhancedInputComponent->BindAction(SetDestinationClickAction, ETriggerEvent::Completed, this, &ASpaceGamePlayerController::OnSetDestinationReleased);
|
|
EnhancedInputComponent->BindAction(SetDestinationClickAction, ETriggerEvent::Canceled, this, &ASpaceGamePlayerController::OnSetDestinationReleased);
|
|
|
|
// Setup touch input events
|
|
EnhancedInputComponent->BindAction(SetDestinationTouchAction, ETriggerEvent::Started, this, &ASpaceGamePlayerController::OnInputStarted);
|
|
EnhancedInputComponent->BindAction(SetDestinationTouchAction, ETriggerEvent::Triggered, this, &ASpaceGamePlayerController::OnTouchTriggered);
|
|
EnhancedInputComponent->BindAction(SetDestinationTouchAction, ETriggerEvent::Completed, this, &ASpaceGamePlayerController::OnTouchReleased);
|
|
EnhancedInputComponent->BindAction(SetDestinationTouchAction, ETriggerEvent::Canceled, this, &ASpaceGamePlayerController::OnTouchReleased);
|
|
}
|
|
else
|
|
{
|
|
UE_LOG(LogSpaceGame, Error, TEXT("'%s' Failed to find an Enhanced Input Component! This template is built to use the Enhanced Input system. If you intend to use the legacy system, then you will need to update this C++ file."), *GetNameSafe(this));
|
|
}
|
|
}
|
|
}
|
|
|
|
void ASpaceGamePlayerController::OnInputStarted()
|
|
{
|
|
StopMovement();
|
|
|
|
// Update the move destination to wherever the cursor is pointing at
|
|
UpdateCachedDestination();
|
|
}
|
|
|
|
void ASpaceGamePlayerController::OnSetDestinationTriggered()
|
|
{
|
|
// We flag that the input is being pressed
|
|
FollowTime += GetWorld()->GetDeltaSeconds();
|
|
|
|
// Update the move destination to wherever the cursor is pointing at
|
|
UpdateCachedDestination();
|
|
|
|
// Move towards mouse pointer or touch
|
|
APawn* ControlledPawn = GetPawn();
|
|
if (ControlledPawn != nullptr)
|
|
{
|
|
FVector WorldDirection = (CachedDestination - ControlledPawn->GetActorLocation()).GetSafeNormal();
|
|
ControlledPawn->AddMovementInput(WorldDirection, 1.0, false);
|
|
}
|
|
}
|
|
|
|
void ASpaceGamePlayerController::OnSetDestinationReleased()
|
|
{
|
|
// If it was a short press
|
|
if (FollowTime <= ShortPressThreshold)
|
|
{
|
|
// We move there and spawn some particles
|
|
UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, CachedDestination);
|
|
UNiagaraFunctionLibrary::SpawnSystemAtLocation(this, FXCursor, CachedDestination, FRotator::ZeroRotator, FVector(1.f, 1.f, 1.f), true, true, ENCPoolMethod::None, true);
|
|
}
|
|
|
|
FollowTime = 0.f;
|
|
}
|
|
|
|
// Triggered every frame when the input is held down
|
|
void ASpaceGamePlayerController::OnTouchTriggered()
|
|
{
|
|
bIsTouch = true;
|
|
OnSetDestinationTriggered();
|
|
}
|
|
|
|
void ASpaceGamePlayerController::OnTouchReleased()
|
|
{
|
|
bIsTouch = false;
|
|
OnSetDestinationReleased();
|
|
}
|
|
|
|
void ASpaceGamePlayerController::UpdateCachedDestination()
|
|
{
|
|
// We look for the location in the world where the player has pressed the input
|
|
FHitResult Hit;
|
|
bool bHitSuccessful = false;
|
|
if (bIsTouch)
|
|
{
|
|
bHitSuccessful = GetHitResultUnderFinger(ETouchIndex::Touch1, ECollisionChannel::ECC_Visibility, true, Hit);
|
|
}
|
|
else
|
|
{
|
|
bHitSuccessful = GetHitResultUnderCursor(ECollisionChannel::ECC_Visibility, true, Hit);
|
|
}
|
|
|
|
// If we hit a surface, cache the location
|
|
if (bHitSuccessful)
|
|
{
|
|
CachedDestination = Hit.Location;
|
|
}
|
|
}
|