122 lines
3.8 KiB
C#
122 lines
3.8 KiB
C#
using System;
|
|
using Pong.Scripts.Data;
|
|
|
|
namespace Pong.Scripts.Managers;
|
|
|
|
public partial class ScalingManager : Node
|
|
{
|
|
private HFlowContainer _score;
|
|
private RigidBody2D _paddle;
|
|
private CharacterBody2D _ball;
|
|
|
|
private Area2D _leftWall;
|
|
private Area2D _rightWall;
|
|
private StaticBody2D _topWall;
|
|
private StaticBody2D _bottomWall;
|
|
|
|
private RigidBody2D _enemy;
|
|
|
|
private Vector2I _gameResolution;
|
|
private GameArea _gameArea;
|
|
|
|
public event EventHandler<Vector2> NewPaddlePosition;
|
|
public event EventHandler<Vector2> NewEnemyPosition;
|
|
public event EventHandler<Vector2> NewBallPosition;
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
GetNodes();
|
|
GetTree().Root.SizeChanged += AdaptToGameResolution;
|
|
AdaptToGameResolution();
|
|
}
|
|
|
|
public override void _ExitTree()
|
|
{
|
|
GetTree().Root.SizeChanged -= AdaptToGameResolution;
|
|
}
|
|
|
|
/// <summary>
|
|
/// a method that gets all the nodes that the scaling manager will manage the position and scale of.
|
|
/// </summary>
|
|
private void GetNodes()
|
|
{
|
|
_score = GetNode<HFlowContainer>("../Score");
|
|
_paddle = GetNode<RigidBody2D>("../Paddle");
|
|
_ball = GetNode<CharacterBody2D>("../Ball");
|
|
|
|
_leftWall = GetNode<Area2D>("../Walls/Left");
|
|
_rightWall = GetNode<Area2D>("../Walls/Right");
|
|
_topWall = GetNode<StaticBody2D>("../Walls/Top");
|
|
_bottomWall = GetNode<StaticBody2D>("../Walls/Bottom");
|
|
|
|
_enemy = GetNode<RigidBody2D>("../Enemy");
|
|
}
|
|
|
|
/// <summary>
|
|
/// adapt to the current resolution of the game.
|
|
/// </summary>
|
|
private void AdaptToGameResolution()
|
|
{
|
|
var normalizedPaddlePosition =
|
|
_gameArea?.NormalizePosition(_paddle.Position) ?? new Vector2(0, 0.5);
|
|
var normalizedEnemyPosition = _gameArea?.NormalizePosition(_enemy.Position) ?? new Vector2(1, 0.5);
|
|
var normalizedBallPosition = _gameArea?.NormalizePosition(_ball.Position) ?? new Vector2(0, 0);
|
|
|
|
_gameResolution = DisplayServer.WindowGetSize();
|
|
_gameArea = new GameArea(_gameResolution);
|
|
|
|
SetWallPosition();
|
|
SetScorePosition();
|
|
SetPaddlePosition(normalizedPaddlePosition);
|
|
}
|
|
|
|
/// <summary>
|
|
/// set the position and scale of the walls according to the edge position.
|
|
/// </summary>
|
|
private void SetWallPosition()
|
|
{
|
|
var xSize = _gameArea.X.ByWallSizeExtents;
|
|
var ySize = _gameArea.Y.ByWallSizeExtents;
|
|
|
|
_leftWall.Position = new Vector2(-xSize, 0);
|
|
_rightWall.Position = new Vector2(xSize, 0);
|
|
_topWall.Position = new Vector2(0, -ySize);
|
|
_bottomWall.Position = new Vector2(0, ySize);
|
|
|
|
_leftWall.Scale = _leftWall.Scale with { Y = _gameResolution.Y };
|
|
_rightWall.Scale = _rightWall.Scale with { Y = _gameResolution.Y };
|
|
_topWall.Scale = _topWall.Scale with { X = _gameResolution.X - 60 };
|
|
_bottomWall.Scale = _bottomWall.Scale with { X = _gameResolution.X - 60 };
|
|
}
|
|
|
|
/// <summary>
|
|
/// set the position of the score ui. this has to be calculated with 0, 0 being the top left of the screen as
|
|
/// the UIs point starts from there instead of the point being in the middle of the screen.
|
|
/// </summary>
|
|
private void SetScorePosition()
|
|
{
|
|
_score.Position = new Vector2(-_gameArea.X.ByWallSize, -_gameArea.Y.ByWallSize);
|
|
_score.Size = new Vector2(_gameResolution.X - 60, _gameResolution.Y - 60);
|
|
}
|
|
|
|
/// <summary>
|
|
/// set the paddle position to a normalized position that gets globalized. the paddle gets the new position with an event.
|
|
/// </summary>
|
|
private void SetPaddlePosition(Vector2 normalizedPosition)
|
|
{
|
|
var newPaddlePos = _gameArea.GlobalizePosition(normalizedPosition with { X = 0 }) + new Vector2(48, 0);
|
|
NewPaddlePosition?.Invoke(this, newPaddlePos);
|
|
}
|
|
|
|
private void SetEnemyPosition(Vector2 normalizedPosition)
|
|
{
|
|
var newEnemyPos = _gameArea.GlobalizePosition(normalizedPosition with {X = 0}) + new Vector2(48,0);
|
|
NewEnemyPosition?.Invoke(this, newEnemyPos);
|
|
}
|
|
|
|
private void SetBallPosition(Vector2 normalizedPosition)
|
|
{
|
|
var newBallPos = _gameArea.GlobalizePosition(normalizedPosition);
|
|
NewBallPosition?.Invoke(this, newBallPos);
|
|
}
|
|
}
|