149 lines
4.7 KiB
C++
149 lines
4.7 KiB
C++
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
|
||
|
#include "OSSCharacter.h"
|
||
|
#include "Animation/AnimInstance.h"
|
||
|
#include "Camera/CameraComponent.h"
|
||
|
#include "Components/CapsuleComponent.h"
|
||
|
#include "Components/InputComponent.h"
|
||
|
#include "GameFramework/InputSettings.h"
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// AOSSCharacter
|
||
|
|
||
|
AOSSCharacter::AOSSCharacter()
|
||
|
{
|
||
|
// Set size for collision capsule
|
||
|
GetCapsuleComponent()->InitCapsuleSize(55.f, 96.0f);
|
||
|
|
||
|
// set our turn rates for input
|
||
|
TurnRateGamepad = 45.f;
|
||
|
|
||
|
// Create a CameraComponent
|
||
|
FirstPersonCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
|
||
|
FirstPersonCameraComponent->SetupAttachment(GetCapsuleComponent());
|
||
|
FirstPersonCameraComponent->SetRelativeLocation(FVector(-39.56f, 1.75f, 64.f)); // Position the camera
|
||
|
FirstPersonCameraComponent->bUsePawnControlRotation = true;
|
||
|
|
||
|
// Create a mesh component that will be used when being viewed from a '1st person' view (when controlling this pawn)
|
||
|
Mesh1P = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("CharacterMesh1P"));
|
||
|
Mesh1P->SetOnlyOwnerSee(true);
|
||
|
Mesh1P->SetupAttachment(FirstPersonCameraComponent);
|
||
|
Mesh1P->bCastDynamicShadow = false;
|
||
|
Mesh1P->CastShadow = false;
|
||
|
Mesh1P->SetRelativeRotation(FRotator(1.9f, -19.19f, 5.2f));
|
||
|
Mesh1P->SetRelativeLocation(FVector(-0.5f, -4.4f, -155.7f));
|
||
|
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::BeginPlay()
|
||
|
{
|
||
|
// Call the base class
|
||
|
Super::BeginPlay();
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////// Input
|
||
|
|
||
|
void AOSSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
|
||
|
{
|
||
|
// Set up gameplay key bindings
|
||
|
check(PlayerInputComponent);
|
||
|
|
||
|
// Bind jump events
|
||
|
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
|
||
|
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
|
||
|
|
||
|
// Bind fire event
|
||
|
PlayerInputComponent->BindAction("PrimaryAction", IE_Pressed, this, &AOSSCharacter::OnPrimaryAction);
|
||
|
|
||
|
// Enable touchscreen input
|
||
|
EnableTouchscreenMovement(PlayerInputComponent);
|
||
|
|
||
|
// Bind movement events
|
||
|
PlayerInputComponent->BindAxis("Move Forward / Backward", this, &AOSSCharacter::MoveForward);
|
||
|
PlayerInputComponent->BindAxis("Move Right / Left", this, &AOSSCharacter::MoveRight);
|
||
|
|
||
|
// We have 2 versions of the rotation bindings to handle different kinds of devices differently
|
||
|
// "Mouse" versions handle devices that provide an absolute delta, such as a mouse.
|
||
|
// "Gamepad" versions are for devices that we choose to treat as a rate of change, such as an analog joystick
|
||
|
PlayerInputComponent->BindAxis("Turn Right / Left Mouse", this, &APawn::AddControllerYawInput);
|
||
|
PlayerInputComponent->BindAxis("Look Up / Down Mouse", this, &APawn::AddControllerPitchInput);
|
||
|
PlayerInputComponent->BindAxis("Turn Right / Left Gamepad", this, &AOSSCharacter::TurnAtRate);
|
||
|
PlayerInputComponent->BindAxis("Look Up / Down Gamepad", this, &AOSSCharacter::LookUpAtRate);
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::OnPrimaryAction()
|
||
|
{
|
||
|
// Trigger the OnItemUsed Event
|
||
|
OnUseItem.Broadcast();
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::BeginTouch(const ETouchIndex::Type FingerIndex, const FVector Location)
|
||
|
{
|
||
|
if (TouchItem.bIsPressed == true)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
if ((FingerIndex == TouchItem.FingerIndex) && (TouchItem.bMoved == false))
|
||
|
{
|
||
|
OnPrimaryAction();
|
||
|
}
|
||
|
TouchItem.bIsPressed = true;
|
||
|
TouchItem.FingerIndex = FingerIndex;
|
||
|
TouchItem.Location = Location;
|
||
|
TouchItem.bMoved = false;
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::EndTouch(const ETouchIndex::Type FingerIndex, const FVector Location)
|
||
|
{
|
||
|
if (TouchItem.bIsPressed == false)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
TouchItem.bIsPressed = false;
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::MoveForward(float Value)
|
||
|
{
|
||
|
if (Value != 0.0f)
|
||
|
{
|
||
|
// add movement in that direction
|
||
|
AddMovementInput(GetActorForwardVector(), Value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::MoveRight(float Value)
|
||
|
{
|
||
|
if (Value != 0.0f)
|
||
|
{
|
||
|
// add movement in that direction
|
||
|
AddMovementInput(GetActorRightVector(), Value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::TurnAtRate(float Rate)
|
||
|
{
|
||
|
// calculate delta for this frame from the rate information
|
||
|
AddControllerYawInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
|
||
|
}
|
||
|
|
||
|
void AOSSCharacter::LookUpAtRate(float Rate)
|
||
|
{
|
||
|
// calculate delta for this frame from the rate information
|
||
|
AddControllerPitchInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
|
||
|
}
|
||
|
|
||
|
bool AOSSCharacter::EnableTouchscreenMovement(class UInputComponent* PlayerInputComponent)
|
||
|
{
|
||
|
if (FPlatformMisc::SupportsTouchInput() || GetDefault<UInputSettings>()->bUseMouseForTouch)
|
||
|
{
|
||
|
PlayerInputComponent->BindTouch(EInputEvent::IE_Pressed, this, &AOSSCharacter::BeginTouch);
|
||
|
PlayerInputComponent->BindTouch(EInputEvent::IE_Released, this, &AOSSCharacter::EndTouch);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|