Files
BXSSP_Andriod/Source/BXSSP/Private/RoverController.cpp

100 lines
3.0 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "RoverController.h"
#include "Rover.h"
#include "RoverGameModeBase.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetMathLibrary.h"
ARoverController* ARoverController::PlayerController = nullptr;
ARoverController::ARoverController()
{
PlayerController = this;
}
void ARoverController::BeginPlay()
{
Super::BeginPlay();
ARoverGameModeBase::Init();
if (UGameplayStatics::GetPlayerController(GetWorld(), 0) == this) {
SetShowMouseCursor(true);
Rover = Cast<ARover>(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
UE_LOG(LogTemp, Log, TEXT("Init Successful"));
}
}
void ARoverController::SetMouseShowStatus(bool bStatus)
{
if (bStatus) {
GetWorldTimerManager().ClearTimer(ResetMousePositionTimer);
}
else {
GetMousePosition(ClickMousePosition.X, ClickMousePosition.Y);
GetWorldTimerManager().ClearTimer(ResetMousePositionTimer);
GetWorldTimerManager().SetTimer(ResetMousePositionTimer, this, &ARoverController::ResetMousePositionToClickPoint, 0.05f, true);
}
SetShowMouseCursor(bStatus);
}
bool ARoverController::GetUnderMouseHitPosition(FHitResult& HitResult)
{
FVector2D MousePosition;
GetMousePosition(MousePosition.X, MousePosition.Y);
return GetUnderScreenHitPosition(MousePosition, HitResult);
}
bool ARoverController::GetUnderScreenHitPosition(const FVector2D& ScreenPosition, FHitResult& HitResult)
{
FVector WorldLocation;
FVector WorldDirection;
DeprojectScreenPositionToWorld(ScreenPosition.X, ScreenPosition.Y, WorldLocation, WorldDirection);
FVector End = WorldLocation + WorldDirection * 10000000000;
if (GetWorld()->LineTraceSingleByChannel(HitResult, WorldLocation, End, ECollisionChannel::ECC_Visibility)) {
return true;
}
return false;
}
bool ARoverController::GetUnderscreenCenterHitPosition(FHitResult& HitResult)
{
FVector WorldLocation;
FVector WorldDirection;
FVector2D ScreenCenter = GetScreenCenterPosition();
DeprojectScreenPositionToWorld(ScreenCenter.X, ScreenCenter.Y, WorldLocation, WorldDirection);
FVector End = WorldLocation + WorldDirection * 10000000000;
if (GetWorld()->LineTraceSingleByChannel(HitResult, WorldLocation, End, ECollisionChannel::ECC_Visibility)) {
return true;
}
return false;
}
FVector2D ARoverController::GetScreenCenterPosition()
{
FVector2D ScreenCenter;
GEngine->GameViewport->GetViewportSize(ScreenCenter);
ScreenCenter *= 0.5;
return ScreenCenter;
}
void ARoverController::ResetMousePositionToClickPoint()
{
SetMouseLocation(ClickMousePosition.X, ClickMousePosition.Y);
}
void ARoverController::RotateCameraToTargetPoint(FRotator Rotation)
{
FRotator SelfRotation = GetControlRotation();
if (UKismetMathLibrary::Dot_VectorVector(SelfRotation.Vector(), Rotation.Vector()) >= 0.999999) {
SetControlRotation(Rotation);
Rover->UpdatascreenCenterPointLocation();
GetWorldTimerManager().ClearTimer(RotateCameraTimer);
return;
}
SetControlRotation(UKismetMathLibrary::RInterpTo(SelfRotation, Rotation, GetWorld()->GetDeltaSeconds(), 5.f));
}