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 IUniverseObject platformSpecificUniverseObject = null!; private readonly GraphicsDeviceManager graphics = null!; private SpriteBatch spriteBatch = null!; private ShapeBatch shapeBatch = null!; private Universe universe = null!; private BehaviourCollector displayableCollector = null!; private BehaviourCollector displayableShapeCollector = null!; private MonoGameCamera2DBehaviour cameraBehaviour = null!; private PongManagerBehaviour pongManager = null!; public GamePong(IUniverseObject platformSpecificUniverseObject) { this.platformSpecificUniverseObject = platformSpecificUniverseObject; 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 universe = new(); displayableCollector = new(universe); displayableShapeCollector = new(universe); universe.Initialize(); base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); shapeBatch = new ShapeBatch(GraphicsDevice, Content); SpriteFont spriteFont = Content.Load("UbuntuMono"); universe.Register(platformSpecificUniverseObject); universe.InstantiateUniverseObject().SetUniverseObject("Physics Engine 2D"); //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectCamera = universe.InstantiateUniverseObject().SetUniverseObject("Camera"); ; UniverseObjectCamera.BehaviourController.AddBehaviour(); UniverseObjectCamera.BehaviourController.AddBehaviour(); cameraBehaviour = UniverseObjectCamera.BehaviourController.AddBehaviour(graphics); //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectPongManager = universe.InstantiateUniverseObject().SetUniverseObject("Pong Game Manager"); pongManager = UniverseObjectPongManager.BehaviourController.AddBehaviour(5); //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectBall = universe.InstantiateUniverseObject().SetUniverseObject("Ball"); UniverseObjectBall.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)); UniverseObjectBall.BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)); UniverseObjectBall.BehaviourController.AddBehaviour(); UniverseObjectBall.BehaviourController.AddBehaviour(); //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectLeftPaddle = universe.InstantiateUniverseObject().SetUniverseObject("Left Paddle"); UniverseObjectLeftPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f)); UniverseObjectLeftPaddle.BehaviourController.AddBehaviour(Keys.W, Keys.S, 228f, -228f, 400f); UniverseObjectLeftPaddle.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectLeftPaddle.BehaviourController.AddBehaviour().IsStatic = true; IUniverseObject UniverseObjectRightPaddle = universe.InstantiateUniverseObject().SetUniverseObject("Right Paddle"); UniverseObjectRightPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f)); UniverseObjectRightPaddle.BehaviourController.AddBehaviour(Keys.Up, Keys.Down, 228f, -228f, 400f); UniverseObjectRightPaddle.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectRightPaddle.BehaviourController.AddBehaviour().IsStatic = true; //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectWallTop = universe.InstantiateUniverseObject().SetUniverseObject("Wall Top"); UniverseObjectWallTop.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, 308f), scale: new Vector2D(552f, 20f)); UniverseObjectWallTop.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectWallTop.BehaviourController.AddBehaviour().IsStatic = true; IUniverseObject UniverseObjectWallBottom = universe.InstantiateUniverseObject().SetUniverseObject("Wall Bottom"); UniverseObjectWallBottom.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, -308f), scale: new Vector2D(552f, 20f)); UniverseObjectWallBottom.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectWallBottom.BehaviourController.AddBehaviour().IsStatic = true; IUniverseObject UniverseObjectWallRight = universe.InstantiateUniverseObject().SetUniverseObject("Wall Right"); UniverseObjectWallRight.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(532f, 0f), scale: new Vector2D(20f, 328f)); UniverseObjectWallRight.BehaviourController.AddBehaviour((Action)pongManager.ScoreToLeft); UniverseObjectWallRight.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectWallRight.BehaviourController.AddBehaviour().IsStatic = true; IUniverseObject UniverseObjectWallLeft = universe.InstantiateUniverseObject().SetUniverseObject("Wall Left"); UniverseObjectWallLeft.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-532f, 0f), scale: new Vector2D(20f, 328f)); UniverseObjectWallLeft.BehaviourController.AddBehaviour((Action)pongManager.ScoreToRight); UniverseObjectWallLeft.BehaviourController.AddBehaviour(Shape2D.Square); UniverseObjectWallLeft.BehaviourController.AddBehaviour().IsStatic = true; //////////////////////////////////////////////////////////////////////////////////// IUniverseObject UniverseObjectLeftScoreText = universe.InstantiateUniverseObject().SetUniverseObject("Score Left"); UniverseObjectLeftScoreText.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-250f, 250f), scale: Vector2D.One * .25f); UniverseObjectLeftScoreText.BehaviourController.AddBehaviour(true, spriteFont); IUniverseObject UniverseObjectRightScoreText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right"); UniverseObjectRightScoreText.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f); UniverseObjectRightScoreText.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(); universe.Update(gameTime.ToUniverseTime()); 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 universe.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); } }