refactor: General
This commit is contained in:
parent
677fec7acc
commit
b7d49e41c3
2
Engine
2
Engine
|
@ -1 +1 @@
|
|||
Subproject commit 4000e761a7827bb76d657b10a3341248b90b0aa5
|
||||
Subproject commit 07666359f26d4761914aac05d73fdbe0020b0b6a
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
|
||||
using Syntriax.Engine.Core;
|
||||
using Syntriax.Engine.Physics2D;
|
||||
using Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
namespace Pong.Behaviours;
|
||||
|
||||
public class PongBall : BehaviourOverride
|
||||
{
|
||||
public Vector2D StartDirection { get; private set; } = Vector2D.Zero;
|
||||
public float Speed { get; set; } = 500f;
|
||||
public float SpeedUpMultiplier { get; set; } = .0125f;
|
||||
|
||||
private IRigidBody2D rigidBody = null!;
|
||||
|
||||
public PongBall(Vector2D startDirection, float speed)
|
||||
{
|
||||
StartDirection = Vector2D.Normalize(startDirection);
|
||||
Speed = speed;
|
||||
}
|
||||
public PongBall() { }
|
||||
|
||||
protected override void OnFirstActiveFrame()
|
||||
{
|
||||
if (!BehaviourController.TryGetBehaviour(out IRigidBody2D? foundRigidBody))
|
||||
throw new Exception($"{nameof(IRigidBody2D)} is missing on {GameObject.Name}.");
|
||||
if (!BehaviourController.TryGetBehaviour(out ICollider2D? foundCollider))
|
||||
throw new Exception($"{nameof(ICollider2D)} is missing on {GameObject.Name}.");
|
||||
|
||||
foundCollider.OnCollisionDetected += OnCollisionDetected;
|
||||
|
||||
rigidBody = foundRigidBody;
|
||||
|
||||
if (GameObject.GameManager.TryFindBehaviour(out PongManager? pongManager))
|
||||
{
|
||||
pongManager.OnReset += ResetBall;
|
||||
pongManager.OnScored += ResetBall;
|
||||
pongManager.OnFinished += DisableBall;
|
||||
}
|
||||
}
|
||||
|
||||
private void DisableBall(PongManager pongManager)
|
||||
{
|
||||
BehaviourController.GameObject.Transform.Position = Vector2D.Zero;
|
||||
rigidBody.Velocity = Vector2D.Zero;
|
||||
}
|
||||
|
||||
private void ResetBall(PongManager pongManager)
|
||||
{
|
||||
StateEnable.Enabled = true;
|
||||
BehaviourController.GameObject.Transform.Position = Vector2D.Zero;
|
||||
rigidBody.Velocity = Vector2D.One.Normalized * Speed;
|
||||
}
|
||||
|
||||
protected override void OnUpdate()
|
||||
{
|
||||
if (rigidBody.Velocity.MagnitudeSquared <= 0.01f)
|
||||
return;
|
||||
|
||||
Vector2D speedUp = rigidBody.Velocity.Normalized * (float)Time.Elapsed.TotalMilliseconds;
|
||||
rigidBody.Velocity += speedUp * SpeedUpMultiplier;
|
||||
}
|
||||
|
||||
private void OnCollisionDetected(ICollider2D collider2D, CollisionDetectionInformation information)
|
||||
{
|
||||
if (Syntriax.Engine.Core.Math.Abs(information.Normal.Dot(Vector2D.Right)) > .25)
|
||||
rigidBody.Velocity = information.Left.Transform.Position.FromTo(information.Right.Transform.Position).Normalized * rigidBody.Velocity.Magnitude;
|
||||
else
|
||||
rigidBody.Velocity = rigidBody.Velocity.Reflect(information.Normal);
|
||||
}
|
||||
}
|
|
@ -3,22 +3,23 @@ using System;
|
|||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
using Syntriax.Engine.Core;
|
||||
using Syntriax.Engine.Input;
|
||||
|
||||
namespace Pong.Behaviours;
|
||||
|
||||
public class PongScoreboard(int WinScore) : BehaviourOverride
|
||||
public class PongManager : BehaviourOverride
|
||||
{
|
||||
public Action? OnReset { get; set; } = null;
|
||||
public Action? OnFinished { get; set; } = null;
|
||||
public Action? OnScored { get; set; } = null;
|
||||
public Action<PongManager>? OnReset { get; set; } = null;
|
||||
public Action<PongManager>? OnFinished { get; set; } = null;
|
||||
public Action<PongManager>? OnScored { get; set; } = null;
|
||||
|
||||
public int ScoreLeft { get; private set; } = 0;
|
||||
public int ScoreRight { get; private set; } = 0;
|
||||
public int ScoreSum => ScoreLeft + ScoreRight;
|
||||
|
||||
public int WinScore { get; } = WinScore;
|
||||
public int WinScore { get; } = 5;
|
||||
|
||||
public PongManager() => WinScore = 5;
|
||||
public PongManager(int winScore) => WinScore = winScore;
|
||||
|
||||
protected override void OnFirstActiveFrame()
|
||||
{
|
||||
|
@ -34,7 +35,7 @@ public class PongScoreboard(int WinScore) : BehaviourOverride
|
|||
public void ScoreToLeft()
|
||||
{
|
||||
ScoreLeft++;
|
||||
OnScored?.Invoke();
|
||||
OnScored?.Invoke(this);
|
||||
|
||||
CheckFinish();
|
||||
}
|
||||
|
@ -42,7 +43,7 @@ public class PongScoreboard(int WinScore) : BehaviourOverride
|
|||
public void ScoreToRight()
|
||||
{
|
||||
ScoreRight++;
|
||||
OnScored?.Invoke();
|
||||
OnScored?.Invoke(this);
|
||||
|
||||
CheckFinish();
|
||||
}
|
||||
|
@ -50,7 +51,7 @@ public class PongScoreboard(int WinScore) : BehaviourOverride
|
|||
public void Reset()
|
||||
{
|
||||
ScoreLeft = ScoreRight = 0;
|
||||
OnReset?.Invoke();
|
||||
OnReset?.Invoke(this);
|
||||
}
|
||||
|
||||
private void CheckFinish()
|
||||
|
@ -58,6 +59,6 @@ public class PongScoreboard(int WinScore) : BehaviourOverride
|
|||
int halfwayScore = (int)(WinScore * .5f);
|
||||
|
||||
if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore)
|
||||
OnFinished?.Invoke();
|
||||
OnFinished?.Invoke(this);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
using Syntriax.Engine.Core;
|
||||
|
||||
namespace Pong.Behaviours;
|
||||
|
||||
public class PongTextBehaviour(bool IsLeft) : TextBehaviour
|
||||
{
|
||||
public bool IsLeft { get; } = IsLeft;
|
||||
|
||||
private PongManager? pongManager = null;
|
||||
|
||||
protected override void OnFirstActiveFrame()
|
||||
{
|
||||
if (!GameObject.GameManager.TryFindBehaviour(out pongManager))
|
||||
return;
|
||||
|
||||
pongManager.OnScored += UpdateScores;
|
||||
pongManager.OnReset += UpdateScores;
|
||||
}
|
||||
|
||||
private void UpdateScores(PongManager pongManager)
|
||||
{
|
||||
if (IsLeft)
|
||||
Text = pongManager.ScoreLeft.ToString();
|
||||
else
|
||||
Text = pongManager.ScoreRight.ToString();
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
using Syntriax.Engine.Core;
|
||||
using Syntriax.Engine.Core.Abstract;
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ public class Game1 : Game
|
|||
public static GameManager gameManager = null!;
|
||||
|
||||
private MonoGameCameraBehaviour cameraBehaviour = null!;
|
||||
private PongScoreboard pongScoreboard;
|
||||
private PongManager pongManager;
|
||||
|
||||
public Game1()
|
||||
{
|
||||
|
@ -72,7 +72,7 @@ public class Game1 : Game
|
|||
|
||||
IGameObject gameObjectPongManager = gameManager.InstantiateGameObject<GameObject>();
|
||||
gameObjectPongManager.Name = "Pong Game Manager";
|
||||
pongScoreboard = gameObjectPongManager.BehaviourController.AddBehaviour<PongScoreboard>(5);
|
||||
pongManager = gameObjectPongManager.BehaviourController.AddBehaviour<PongManager>(5);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -81,7 +81,7 @@ public class Game1 : Game
|
|||
gameObjectBall.Transform.Position = new Vector2D(0, 0f);
|
||||
gameObjectBall.Transform.Scale = new Vector2D(10f, 10f);
|
||||
gameObjectBall.BehaviourController.AddBehaviour<CircleBehaviour>(new Circle(Vector2D.Zero, 1f));
|
||||
MovementBallBehaviour movementBallBehaviour = gameObjectBall.BehaviourController.AddBehaviour<MovementBallBehaviour>();
|
||||
PongBall ballBehaviour = gameObjectBall.BehaviourController.AddBehaviour<PongBall>();
|
||||
RigidBody2D rigidBodyBall = gameObjectBall.BehaviourController.AddBehaviour<RigidBody2D>();
|
||||
engine.AddRigidBody(rigidBodyBall);
|
||||
|
||||
|
@ -131,7 +131,7 @@ public class Game1 : Game
|
|||
gameObjectWallRight.Name = "WallRight";
|
||||
gameObjectWallRight.Transform.Position = new Vector2D(532f, 0f);
|
||||
gameObjectWallRight.Transform.Scale = new Vector2D(20f, 328f);
|
||||
gameObjectWallRight.BehaviourController.AddBehaviour<ScoreBoundary>((Action)pongScoreboard.ScoreToLeft);
|
||||
gameObjectWallRight.BehaviourController.AddBehaviour<ScoreBoundary>((Action)pongManager.ScoreToLeft);
|
||||
gameObjectWallRight.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape.Box);
|
||||
RigidBody2D rigidBodyWallRight = gameObjectWallRight.BehaviourController.AddBehaviour<RigidBody2D>();
|
||||
rigidBodyWallRight.IsStatic = true;
|
||||
|
@ -141,7 +141,7 @@ public class Game1 : Game
|
|||
gameObjectWallLeft.Name = "WallLeft";
|
||||
gameObjectWallLeft.Transform.Position = new Vector2D(-532f, 0f);
|
||||
gameObjectWallLeft.Transform.Scale = new Vector2D(20f, 328f);
|
||||
gameObjectWallLeft.BehaviourController.AddBehaviour<ScoreBoundary>((Action)pongScoreboard.ScoreToRight);
|
||||
gameObjectWallLeft.BehaviourController.AddBehaviour<ScoreBoundary>((Action)pongManager.ScoreToRight);
|
||||
gameObjectWallLeft.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape.Box);
|
||||
RigidBody2D rigidBodyWallLeft = gameObjectWallLeft.BehaviourController.AddBehaviour<RigidBody2D>();
|
||||
rigidBodyWallLeft.IsStatic = true;
|
||||
|
@ -153,38 +153,16 @@ public class Game1 : Game
|
|||
gameObjectLeftScoreText.Name = "Score Left";
|
||||
gameObjectLeftScoreText.Transform.Position = new Vector2D(-250f, 250f);
|
||||
gameObjectLeftScoreText.Transform.Scale = Vector2D.One * .25f;
|
||||
TextBehaviour textBehaviourLeft = gameObjectLeftScoreText.BehaviourController.AddBehaviour<TextBehaviour>();
|
||||
PongTextBehaviour textBehaviourLeft = gameObjectLeftScoreText.BehaviourController.AddBehaviour<PongTextBehaviour>(true);
|
||||
textBehaviourLeft.Font = spriteFont;
|
||||
textBehaviourLeft.Text = "0";
|
||||
IGameObject gameObjectRightScoreText = gameManager.InstantiateGameObject<GameObject>();
|
||||
gameObjectRightScoreText.Name = "Score Right";
|
||||
gameObjectRightScoreText.Transform.Position = new Vector2D(250f, 250f);
|
||||
gameObjectRightScoreText.Transform.Scale = Vector2D.One * .25f;
|
||||
TextBehaviour textBehaviourRight = gameObjectRightScoreText.BehaviourController.AddBehaviour<TextBehaviour>();
|
||||
PongTextBehaviour textBehaviourRight = gameObjectRightScoreText.BehaviourController.AddBehaviour<PongTextBehaviour>(false);
|
||||
textBehaviourRight.Font = spriteFont;
|
||||
textBehaviourRight.Text = "0";
|
||||
|
||||
pongScoreboard.OnScored += () =>
|
||||
{
|
||||
gameObjectBall.Transform.Position = Vector2D.Zero;
|
||||
rigidBodyBall.Velocity = rigidBodyBall.Velocity.Normalized * movementBallBehaviour.Speed;
|
||||
textBehaviourLeft.Text = pongScoreboard.ScoreLeft.ToString();
|
||||
textBehaviourRight.Text = pongScoreboard.ScoreRight.ToString();
|
||||
};
|
||||
pongScoreboard.OnFinished += () =>
|
||||
{
|
||||
rigidBodyBall.BehaviourController.GameObject.Transform.Position = Vector2D.Zero;
|
||||
rigidBodyBall.Velocity = Vector2D.Zero;
|
||||
};
|
||||
|
||||
pongScoreboard.OnReset += () =>
|
||||
{
|
||||
gameObjectBall.StateEnable.Enabled = true;
|
||||
rigidBodyBall.BehaviourController.GameObject.Transform.Position = Vector2D.Zero;
|
||||
rigidBodyBall.Velocity = Vector2D.One.Normalized * movementBallBehaviour.Speed;
|
||||
textBehaviourLeft.Text = pongScoreboard.ScoreLeft.ToString();
|
||||
textBehaviourRight.Text = pongScoreboard.ScoreRight.ToString();
|
||||
};
|
||||
}
|
||||
|
||||
protected override void Update(GameTime gameTime)
|
||||
|
|
Loading…
Reference in New Issue