using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Pong.Behaviours; using Apos.Shapes; using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Physics2D; namespace Pong; public class GamePong : Game { private readonly IHierarchyObject platformSpecificHierarchyObject = null!; private readonly GraphicsDeviceManager graphics = null!; private SpriteBatch spriteBatch = null!; private ShapeBatch shapeBatch = null!; private GameManager gameManager = null!; private BehaviourCollector displayableCollector = null!; private BehaviourCollector displayableShapeCollector = null!; private MonoGameCamera2DBehaviour cameraBehaviour = null!; private PongManagerBehaviour pongManager = null!; public GamePong(IHierarchyObject platformSpecificHierarchyObject) { this.platformSpecificHierarchyObject = platformSpecificHierarchyObject; graphics = new GraphicsDeviceManager(this) { PreferredBackBufferWidth = 1024, PreferredBackBufferHeight = 576, GraphicsProfile = GraphicsProfile.HiDef }; Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void Initialize() { // TODO: Add your initialization logic here gameManager = new(); displayableCollector = new(gameManager); displayableShapeCollector = new(gameManager); gameManager.Initialize(); base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); shapeBatch = new ShapeBatch(GraphicsDevice, Content); SpriteFont spriteFont = Content.Load("UbuntuMono"); gameManager.Register(platformSpecificHierarchyObject); gameManager.InstantiateHierarchyObject().SetHierarchyObject("Physics Engine 2D"); //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectCamera = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Camera"); ; HierarchyObjectCamera.BehaviourController.AddBehaviour(); HierarchyObjectCamera.BehaviourController.AddBehaviour(); cameraBehaviour = HierarchyObjectCamera.BehaviourController.AddBehaviour(graphics); //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectPongManager = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Pong Game Manager"); pongManager = HierarchyObjectPongManager.BehaviourController.AddBehaviour(5); //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectBall = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Ball"); HierarchyObjectBall.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)); HierarchyObjectBall.BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)); HierarchyObjectBall.BehaviourController.AddBehaviour(); HierarchyObjectBall.BehaviourController.AddBehaviour(); //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectLeftPaddle = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Left Paddle"); HierarchyObjectLeftPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f)); HierarchyObjectLeftPaddle.BehaviourController.AddBehaviour(Keys.W, Keys.S, 228f, -228f, 400f); HierarchyObjectLeftPaddle.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectLeftPaddle.BehaviourController.AddBehaviour().IsStatic = true; IHierarchyObject HierarchyObjectRightPaddle = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Right Paddle"); HierarchyObjectRightPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f)); HierarchyObjectRightPaddle.BehaviourController.AddBehaviour(Keys.Up, Keys.Down, 228f, -228f, 400f); HierarchyObjectRightPaddle.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectRightPaddle.BehaviourController.AddBehaviour().IsStatic = true; //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectWallTop = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Wall Top"); HierarchyObjectWallTop.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, 308f), scale: new Vector2D(552f, 20f)); HierarchyObjectWallTop.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectWallTop.BehaviourController.AddBehaviour().IsStatic = true; IHierarchyObject HierarchyObjectWallBottom = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Wall Bottom"); HierarchyObjectWallBottom.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, -308f), scale: new Vector2D(552f, 20f)); HierarchyObjectWallBottom.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectWallBottom.BehaviourController.AddBehaviour().IsStatic = true; IHierarchyObject HierarchyObjectWallRight = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Wall Right"); HierarchyObjectWallRight.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(532f, 0f), scale: new Vector2D(20f, 328f)); HierarchyObjectWallRight.BehaviourController.AddBehaviour((Action)pongManager.ScoreToLeft); HierarchyObjectWallRight.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectWallRight.BehaviourController.AddBehaviour().IsStatic = true; IHierarchyObject HierarchyObjectWallLeft = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Wall Left"); HierarchyObjectWallLeft.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-532f, 0f), scale: new Vector2D(20f, 328f)); HierarchyObjectWallLeft.BehaviourController.AddBehaviour((Action)pongManager.ScoreToRight); HierarchyObjectWallLeft.BehaviourController.AddBehaviour(Shape2D.Square); HierarchyObjectWallLeft.BehaviourController.AddBehaviour().IsStatic = true; //////////////////////////////////////////////////////////////////////////////////// IHierarchyObject HierarchyObjectLeftScoreText = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Score Left"); HierarchyObjectLeftScoreText.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-250f, 250f), scale: Vector2D.One * .25f); HierarchyObjectLeftScoreText.BehaviourController.AddBehaviour(true, spriteFont); IHierarchyObject HierarchyObjectRightScoreText = gameManager.InstantiateHierarchyObject().SetHierarchyObject("Score Right"); HierarchyObjectRightScoreText.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f); HierarchyObjectRightScoreText.BehaviourController.AddBehaviour(false, spriteFont); } protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); gameManager.Update(gameTime.ToEngineTime()); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(new Color() { R = 32, G = 32, B = 32 }); // TODO: Add your drawing code here gameManager.PreDraw(); spriteBatch.Begin(SpriteSortMode.Deferred, transformMatrix: cameraBehaviour.MatrixTransform); foreach (var displayable in displayableCollector) displayable.Draw(spriteBatch); spriteBatch.End(); shapeBatch.Begin(cameraBehaviour.MatrixTransform); foreach (var displayableShape in displayableShapeCollector) displayableShape.Draw(shapeBatch); shapeBatch.End(); base.Draw(gameTime); } }