Files

103 lines
2.9 KiB
C#

using System;
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerMoveHandler : IFixedTickable
{
readonly LevelBoundary _levelBoundary;
readonly Settings _settings;
readonly Player _player;
readonly PlayerInputState _inputState;
public PlayerMoveHandler(
PlayerInputState inputState,
Player player,
Settings settings,
LevelBoundary levelBoundary)
{
_levelBoundary = levelBoundary;
_settings = settings;
_player = player;
_inputState = inputState;
}
public void FixedTick()
{
if (_player.IsDead)
{
return;
}
if (_inputState.IsMovingLeft)
{
_player.AddForce(
Vector3.left * _settings.MoveSpeed);
}
if (_inputState.IsMovingRight)
{
_player.AddForce(
Vector3.right * _settings.MoveSpeed);
}
if (_inputState.IsMovingUp)
{
_player.AddForce(
Vector3.up * _settings.MoveSpeed);
}
if (_inputState.IsMovingDown)
{
_player.AddForce(
Vector3.down * _settings.MoveSpeed);
}
// Always ensure we are on the main plane
_player.Position = new Vector3(_player.Position.x, _player.Position.y, 0);
KeepPlayerOnScreen();
}
void KeepPlayerOnScreen()
{
var extentLeft = (_levelBoundary.Left + _settings.BoundaryBuffer) - _player.Position.x;
var extentRight = _player.Position.x - (_levelBoundary.Right - _settings.BoundaryBuffer);
if (extentLeft > 0)
{
_player.AddForce(
Vector3.right * _settings.BoundaryAdjustForce * extentLeft);
}
else if (extentRight > 0)
{
_player.AddForce(
Vector3.left * _settings.BoundaryAdjustForce * extentRight);
}
var extentTop = _player.Position.y - (_levelBoundary.Top - _settings.BoundaryBuffer);
var extentBottom = (_levelBoundary.Bottom + _settings.BoundaryBuffer) - _player.Position.y;
if (extentTop > 0)
{
_player.AddForce(
Vector3.down * _settings.BoundaryAdjustForce * extentTop);
}
else if (extentBottom > 0)
{
_player.AddForce(
Vector3.up * _settings.BoundaryAdjustForce * extentBottom);
}
}
[Serializable]
public class Settings
{
public float BoundaryBuffer;
public float BoundaryAdjustForce;
public float MoveSpeed;
public float SlowDownSpeed;
}
}
}