193 lines
5.5 KiB
C++
193 lines
5.5 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "AdventureCameraPawn.h"
|
|
|
|
#include "AdventureMap.h"
|
|
#include "AdventurePlayerController.h"
|
|
#include "AdventureCharacter.h"
|
|
|
|
#include "GameFramework/PlayerController.h"
|
|
#include "Kismet/GameplayStatics.h"
|
|
|
|
#include "math.h"
|
|
|
|
// Sets default values
|
|
AAdventureCameraPawn::AAdventureCameraPawn()
|
|
{
|
|
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
|
PrimaryActorTick.bCanEverTick = true;
|
|
|
|
ESASize = .01;
|
|
BaseScrollSpeed = 16;
|
|
ScrollAccelleration = BaseScrollSpeed * 2.4;
|
|
|
|
ESAMaxBoundSlope = 1 / (1 - (1-ESASize));
|
|
ESAMaxBoundIntercept = 1 - ESAMaxBoundSlope;
|
|
|
|
ESAMinBoundSlope = -1 / ESASize;
|
|
ESAMinBoundIntercept = 0 - (ESAMinBoundSlope * ESASize);
|
|
|
|
AutoPossessPlayer = EAutoReceiveInput::Player0;
|
|
}
|
|
|
|
// Called when the game starts or when spawned
|
|
void AAdventureCameraPawn::BeginPlay()
|
|
{
|
|
Super::BeginPlay();
|
|
ControllerRef = (AAdventurePlayerController*)UGameplayStatics::GetPlayerController(GetWorld(), 0);
|
|
|
|
// Viewport properties not accurate on BeginPlay (must wait before accessing)
|
|
FTimerHandle UnusedHandle;
|
|
GetWorldTimerManager().SetTimer(
|
|
UnusedHandle, this, &AAdventureCameraPawn::GetTheDamnViewport, 1, false);
|
|
}
|
|
|
|
void AAdventureCameraPawn::GetTheDamnViewport()
|
|
{
|
|
Viewport = GetWorld()->GetGameViewport();
|
|
ViewSize = Viewport->Viewport->GetSizeXY();
|
|
}
|
|
|
|
// Called every frame
|
|
void AAdventureCameraPawn::Tick(float DeltaTime)
|
|
{
|
|
Super::Tick(DeltaTime);
|
|
|
|
}
|
|
|
|
// Called to bind functionality to input
|
|
void AAdventureCameraPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
|
|
{
|
|
Super::SetupPlayerInputComponent(PlayerInputComponent);
|
|
if (PlayerInputComponent)
|
|
{
|
|
PlayerInputComponent->BindAxis("Mouse X", this, &AAdventureCameraPawn::EdgeScrollSide);
|
|
PlayerInputComponent->BindAxis("Mouse Y", this, &AAdventureCameraPawn::EdgeScrollVert);
|
|
|
|
PlayerInputComponent->BindAxis("Move AD", this, &AAdventureCameraPawn::ScrollSide);
|
|
PlayerInputComponent->BindAxis("Move WS", this, &AAdventureCameraPawn::ScrollVert);
|
|
}
|
|
}
|
|
void AAdventureCameraPawn::ScrollSide(float AxisValue)
|
|
{
|
|
float DeltaLoc = AxisValue * BaseScrollSpeed * 3;
|
|
AddActorLocalOffset(FVector(DeltaLoc, 0, 0));
|
|
}
|
|
void AAdventureCameraPawn::ScrollVert(float AxisValue)
|
|
{
|
|
float DeltaLoc = AxisValue * BaseScrollSpeed * -3;
|
|
AddActorLocalOffset(FVector(0, DeltaLoc, 0));
|
|
}
|
|
|
|
|
|
void AAdventureCameraPawn::EdgeScrollSide(float AxisValue)
|
|
{
|
|
float mouseX;
|
|
float mouseY;
|
|
ControllerRef->GetMousePosition(mouseX, mouseY);
|
|
float mousePosX = mouseX / ViewSize.X;
|
|
float mousePosY = mouseY / ViewSize.Y;
|
|
float VertAccelleration = GetInputAxisValue("Mouse Y") * (ScrollAccelleration * .75);
|
|
|
|
if (mousePosX <= ESASize) // if in LEFT area
|
|
{
|
|
////// Scroll LEFT
|
|
float SpeedX = (mousePosX * ESAMinBoundSlope + ESAMinBoundIntercept) * BaseScrollSpeed;
|
|
AddActorLocalOffset(FVector(-SpeedX, 0, 0));
|
|
|
|
if (mousePosY > .005) // if not touching TOP EDGE
|
|
{
|
|
AddActorLocalOffset(FVector(0, -VertAccelleration, 0));
|
|
}
|
|
|
|
if (AxisValue < .0 && mousePosX <= .005) // if mouse moving LEFT and touching EDGE
|
|
{
|
|
////// Add LEFT accelleration
|
|
SpeedX = AxisValue * ScrollAccelleration;
|
|
AddActorLocalOffset(FVector(SpeedX, 0, 0));
|
|
}
|
|
}
|
|
|
|
if (mousePosX >= 1-ESASize) // if in RIGHT area
|
|
{
|
|
////// Scroll RIGHT
|
|
float SpeedX = (mousePosX * ESAMaxBoundSlope + ESAMaxBoundIntercept) * BaseScrollSpeed;
|
|
AddActorLocalOffset(FVector(SpeedX, 0, 0));
|
|
|
|
if (mousePosY < .995) // if not touching BOT EDGE
|
|
{
|
|
AddActorLocalOffset(FVector(0, -VertAccelleration, 0));
|
|
}
|
|
|
|
if (AxisValue > .0 && mousePosX >= .995) // if mouse moving RIGHT and touching EDGE
|
|
{
|
|
////// Add RIGHT accelleration
|
|
SpeedX = AxisValue * ScrollAccelleration;
|
|
AddActorLocalOffset(FVector(SpeedX, 0, 0));
|
|
}
|
|
}
|
|
}
|
|
|
|
void AAdventureCameraPawn::EdgeScrollVert(float AxisValue)
|
|
{
|
|
float mouseX;
|
|
float mouseY;
|
|
ControllerRef->GetMousePosition(mouseX, mouseY);
|
|
float mousePosY = mouseY / ViewSize.Y;
|
|
float mousePosX = mouseX / ViewSize.X;
|
|
float SideAccelleration = GetInputAxisValue("Mouse X") * (ScrollAccelleration * .75);
|
|
|
|
if (mousePosY <= ESASize) // if in TOP area
|
|
{
|
|
////// Scroll TOP
|
|
float SpeedY = (mousePosY * ESAMinBoundSlope + ESAMinBoundIntercept) * BaseScrollSpeed;
|
|
AddActorLocalOffset(FVector(0, -SpeedY, 0));
|
|
|
|
if (mousePosX > .005) // if not touching EDGE
|
|
{
|
|
AddActorLocalOffset(FVector(SideAccelleration, 0, 0));
|
|
}
|
|
|
|
if (AxisValue > .0 && mousePosY <= .005) // if mouse moving TOP and touching EDGE
|
|
{
|
|
////// Add TOP accelleration
|
|
SpeedY = AxisValue * ScrollAccelleration;
|
|
AddActorLocalOffset(FVector(0, -SpeedY, 0));
|
|
}
|
|
}
|
|
|
|
if (mousePosY >= 1-ESASize) // if in BOTTOM area
|
|
{
|
|
////// Scroll BOTTOM
|
|
float SpeedY = (mousePosY * ESAMaxBoundSlope + ESAMaxBoundIntercept) * BaseScrollSpeed;
|
|
AddActorLocalOffset(FVector(0, SpeedY, 0));
|
|
|
|
if (mousePosX < .995) // if not touching BOT EDGE
|
|
{
|
|
AddActorLocalOffset(FVector(SideAccelleration, 0, 0));
|
|
}
|
|
|
|
if (AxisValue < .0 && mousePosY >= .995) // if mouse moving BOTTOM and touching EDGE
|
|
{
|
|
////// add BOTTOM accelleration
|
|
SpeedY = AxisValue * ScrollAccelleration;
|
|
AddActorLocalOffset(FVector(0, -SpeedY, 0));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void AAdventureCameraPawn::FollowAdvPawn()
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("following..."));
|
|
|
|
AdvPawnLocationCurrent = AdvPawnRef->GetActorLocation();
|
|
AdvPawnLocationDelta = AdvPawnLocationCurrent - AdvPawnLocationPrevious;
|
|
|
|
UE_LOG(LogTemp, Warning, TEXT("%s"), *AdvPawnLocationDelta.ToString());
|
|
|
|
AddActorLocalOffset(AdvPawnLocationDelta);
|
|
|
|
AdvPawnLocationPrevious = AdvPawnLocationCurrent;
|
|
} |