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; using Syntriax.Engine.Physics2D.Primitives; using Syntriax.Engine.Physics2D.Abstract; namespace Pong; public class Game1 : Game { public static GraphicsDeviceManager graphics = null!; public static IPhysicsEngine2D engine = null!; public static SpriteBatch spriteBatch = null!; public static ShapeBatch shapeBatch = null!; public static GameManager gameManager = null!; private MonoGameCameraBehaviour cameraBehaviour = null!; private PongScoreboard pongScoreboard; public Game1() { engine = new PhysicsEngine2D { IterationCount = 3 }; graphics = new GraphicsDeviceManager(this) { PreferredBackBufferWidth = 1024, PreferredBackBufferHeight = 576, GraphicsProfile = GraphicsProfile.HiDef }; Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void Initialize() { gameManager = new(); // TODO: Add your initialization logic here gameManager.Initialize(); base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); shapeBatch = new ShapeBatch(GraphicsDevice, Content); SpriteFont spriteFont = Content.Load("UbuntuMono"); IGameObject gameObjectCamera = gameManager.InstantiateGameObject(); gameObjectCamera.Name = "Camera"; gameObjectCamera.Transform.Position = Vector2D.Zero; gameObjectCamera.BehaviourController.AddBehaviour(); cameraBehaviour = gameObjectCamera.BehaviourController.AddBehaviour(); cameraBehaviour.Viewport = GraphicsDevice.Viewport; //////////////////////////////////////////////////////////////////////////////////// IGameObject gameObjectPongManager = gameManager.InstantiateGameObject(); gameObjectPongManager.Name = "Pong Game Manager"; pongScoreboard = gameObjectPongManager.BehaviourController.AddBehaviour(5); //////////////////////////////////////////////////////////////////////////////////// IGameObject gameObjectBall = gameManager.InstantiateGameObject(); gameObjectBall.Name = "Ball"; gameObjectBall.Transform.Position = new Vector2D(0, 0f); gameObjectBall.Transform.Scale = new Vector2D(10f, 10f); gameObjectBall.BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)); MovementBallBehaviour movementBallBehaviour = gameObjectBall.BehaviourController.AddBehaviour(); RigidBody2D rigidBodyBall = gameObjectBall.BehaviourController.AddBehaviour(); engine.AddRigidBody(rigidBodyBall); //////////////////////////////////////////////////////////////////////////////////// IGameObject gameObjectLeftPaddle = gameManager.InstantiateGameObject(); gameObjectLeftPaddle.Name = "Left Paddle"; gameObjectLeftPaddle.Transform.Position = new Vector2D(-468f, 0f); gameObjectLeftPaddle.Transform.Scale = new Vector2D(15f, 60f); gameObjectLeftPaddle.BehaviourController.AddBehaviour(Keys.W, Keys.S, 228f, -228f, 400f); gameObjectLeftPaddle.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyLeftPaddle = gameObjectLeftPaddle.BehaviourController.AddBehaviour(); rigidBodyLeftPaddle.IsStatic = true; engine.AddRigidBody(rigidBodyLeftPaddle); IGameObject gameObjectRightPaddle = gameManager.InstantiateGameObject(); gameObjectRightPaddle.Name = "Right Paddle"; gameObjectRightPaddle.Transform.Position = new Vector2D(468f, 0f); gameObjectRightPaddle.Transform.Scale = new Vector2D(15f, 60f); gameObjectRightPaddle.BehaviourController.AddBehaviour(Keys.Up, Keys.Down, 228f, -228f, 400f); gameObjectRightPaddle.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyRightPaddle = gameObjectRightPaddle.BehaviourController.AddBehaviour(); rigidBodyRightPaddle.IsStatic = true; engine.AddRigidBody(rigidBodyRightPaddle); //////////////////////////////////////////////////////////////////////////////////// IGameObject gameObjectWallTop = gameManager.InstantiateGameObject(); gameObjectWallTop.Name = "WallTop"; gameObjectWallTop.Transform.Position = new Vector2D(0f, 308f); gameObjectWallTop.Transform.Scale = new Vector2D(552f, 20f); gameObjectWallTop.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyWallTop = gameObjectWallTop.BehaviourController.AddBehaviour(); rigidBodyWallTop.IsStatic = true; engine.AddRigidBody(rigidBodyWallTop); IGameObject gameObjectWallBottom = gameManager.InstantiateGameObject(); gameObjectWallBottom.Name = "WallBottom"; gameObjectWallBottom.Transform.Position = new Vector2D(0f, -308f); gameObjectWallBottom.Transform.Scale = new Vector2D(552f, 20f); gameObjectWallBottom.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyWallBottom = gameObjectWallBottom.BehaviourController.AddBehaviour(); rigidBodyWallBottom.IsStatic = true; engine.AddRigidBody(rigidBodyWallBottom); IGameObject gameObjectWallRight = gameManager.InstantiateGameObject(); gameObjectWallRight.Name = "WallRight"; gameObjectWallRight.Transform.Position = new Vector2D(532f, 0f); gameObjectWallRight.Transform.Scale = new Vector2D(20f, 328f); gameObjectWallRight.BehaviourController.AddBehaviour((Action)pongScoreboard.ScoreToLeft); gameObjectWallRight.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyWallRight = gameObjectWallRight.BehaviourController.AddBehaviour(); rigidBodyWallRight.IsStatic = true; engine.AddRigidBody(rigidBodyWallRight); IGameObject gameObjectWallLeft = gameManager.InstantiateGameObject(); gameObjectWallLeft.Name = "WallLeft"; gameObjectWallLeft.Transform.Position = new Vector2D(-532f, 0f); gameObjectWallLeft.Transform.Scale = new Vector2D(20f, 328f); gameObjectWallLeft.BehaviourController.AddBehaviour((Action)pongScoreboard.ScoreToRight); gameObjectWallLeft.BehaviourController.AddBehaviour(Shape.Box); RigidBody2D rigidBodyWallLeft = gameObjectWallLeft.BehaviourController.AddBehaviour(); rigidBodyWallLeft.IsStatic = true; engine.AddRigidBody(rigidBodyWallLeft); //////////////////////////////////////////////////////////////////////////////////// IGameObject gameObjectLeftScoreText = gameManager.InstantiateGameObject(); gameObjectLeftScoreText.Name = "Score Left"; gameObjectLeftScoreText.Transform.Position = new Vector2D(-250f, 250f); gameObjectLeftScoreText.Transform.Scale = Vector2D.One * .25f; TextBehaviour textBehaviourLeft = gameObjectLeftScoreText.BehaviourController.AddBehaviour(); textBehaviourLeft.Font = spriteFont; textBehaviourLeft.Text = "0"; IGameObject gameObjectRightScoreText = gameManager.InstantiateGameObject(); gameObjectRightScoreText.Name = "Score Right"; gameObjectRightScoreText.Transform.Position = new Vector2D(250f, 250f); gameObjectRightScoreText.Transform.Scale = Vector2D.One * .25f; TextBehaviour textBehaviourRight = gameObjectRightScoreText.BehaviourController.AddBehaviour(); 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) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); if (Keyboard.GetState().IsKeyDown(Keys.Space)) pongScoreboard.Reset(); gameManager.Update(gameTime.ToEngineTime()); while (physicsTimer + 0.01f < gameTime.TotalGameTime.TotalMilliseconds * .001f)//seconds) { physicsTimer += 0.01f; engine.Step(.01f); } base.Update(gameTime); } static float physicsTimer = 0f; protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(new Color() { R = 32, G = 32, B = 32 }); // gameManager.Camera.Position = gameObjectBall.Transform.Position; // Console.WriteLine($"Pos: {gameManager.Camera.Position}"); // TODO: Add your drawing code here gameManager.PreDraw(); spriteBatch.Begin(SpriteSortMode.Deferred, transformMatrix: cameraBehaviour.MatrixTransform); foreach (IGameObject gameObject in gameManager) foreach (var displayable in gameObject.BehaviourController.GetBehaviours()) displayable.Draw(spriteBatch); spriteBatch.End(); shapeBatch.Begin(cameraBehaviour.MatrixTransform); foreach (IGameObject gameObject in gameManager) foreach (var displayableShape in gameObject.BehaviourController.GetBehaviours()) displayableShape.Draw(shapeBatch); shapeBatch.End(); base.Draw(gameTime); } }