title screen
							parent
							
								
									3251bcf7fd
								
							
						
					
					
						commit
						1c57a4a79f
					
				|  | @ -0,0 +1,15 @@ | ||||||
|  | using Encompass; | ||||||
|  | using PongFE.Enums; | ||||||
|  | 
 | ||||||
|  | namespace PongFE.Components | ||||||
|  | { | ||||||
|  |     public struct GameStateComponent : IComponent | ||||||
|  |     { | ||||||
|  |         public GameState GameState { get; } | ||||||
|  | 
 | ||||||
|  |         public GameStateComponent(GameState gameState) | ||||||
|  |         { | ||||||
|  |             GameState = gameState; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,153 @@ | ||||||
|  | using Encompass; | ||||||
|  | using Microsoft.Xna.Framework.Input; | ||||||
|  | using PongFE.Components; | ||||||
|  | using PongFE.Enums; | ||||||
|  | using PongFE.Messages; | ||||||
|  | 
 | ||||||
|  | namespace PongFE.Engines | ||||||
|  | { | ||||||
|  |     [Reads(typeof(GameStateComponent))] | ||||||
|  |     [Receives(typeof(ChangeGameStateMessage))] | ||||||
|  |     [Sends( | ||||||
|  |         typeof(BallSpawnMessage), | ||||||
|  |         typeof(PaddleSpawnMessage), | ||||||
|  |         typeof(BoundarySpawnMessage), | ||||||
|  |         typeof(GoalBoundarySpawnMessage) | ||||||
|  |     )] | ||||||
|  |     [Writes(typeof(GameStateComponent))] | ||||||
|  |     public class GameStateEngine : Engine | ||||||
|  |     { | ||||||
|  |         private int PlayAreaWidth { get; } | ||||||
|  |         private int PlayAreaHeight { get; } | ||||||
|  | 
 | ||||||
|  |         public GameStateEngine(int playAreaWidth, int playAreaHeight) | ||||||
|  |         { | ||||||
|  |             PlayAreaWidth = playAreaWidth; | ||||||
|  |             PlayAreaHeight = playAreaHeight; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override void Update(double dt) | ||||||
|  |         { | ||||||
|  |             ref readonly var gameStateEntity = ref ReadEntity<GameStateComponent>(); | ||||||
|  |             ref readonly var gameStateComponent = ref GetComponent<GameStateComponent>(gameStateEntity); | ||||||
|  | 
 | ||||||
|  |             if (gameStateComponent.GameState == GameState.Title) | ||||||
|  |             { | ||||||
|  |                 if (Keyboard.GetState().IsKeyDown(Keys.Enter)) | ||||||
|  |                 { | ||||||
|  |                     EndTitle(); | ||||||
|  |                     StartGame(); | ||||||
|  | 
 | ||||||
|  |                     SetComponent(gameStateEntity, new GameStateComponent(GameState.Game)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (SomeMessage<ChangeGameStateMessage>()) | ||||||
|  |             { | ||||||
|  |                 ref readonly var changeGameStateMessage = ref ReadMessage<ChangeGameStateMessage>(); | ||||||
|  | 
 | ||||||
|  |                 if (changeGameStateMessage.GameState == gameStateComponent.GameState) | ||||||
|  |                 { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (gameStateComponent.GameState == GameState.Game) | ||||||
|  |                 { | ||||||
|  |                     if (changeGameStateMessage.GameState == GameState.Title) | ||||||
|  |                     { | ||||||
|  |                         EndGame(); | ||||||
|  |                         StartTitle(); | ||||||
|  | 
 | ||||||
|  |                         SetComponent(gameStateEntity, new GameStateComponent(GameState.Title)); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void StartGame() | ||||||
|  |         { | ||||||
|  |             SendMessage( | ||||||
|  |                 new PaddleSpawnMessage( | ||||||
|  |                     new MoonTools.Structs.Position2D(20, PlayAreaHeight / 2 - 40), | ||||||
|  |                     Enums.PlayerIndex.One, | ||||||
|  |                     PaddleControl.Player, | ||||||
|  |                     20, | ||||||
|  |                     80 | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             SendMessage( | ||||||
|  |                 new PaddleSpawnMessage( | ||||||
|  |                     new MoonTools.Structs.Position2D(PlayAreaWidth - 45, PlayAreaHeight / 2 - 40), | ||||||
|  |                     Enums.PlayerIndex.Two, | ||||||
|  |                     PaddleControl.Computer, | ||||||
|  |                     20, | ||||||
|  |                     80 | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             SendMessage( | ||||||
|  |                 new BallSpawnMessage( | ||||||
|  |                     new MoonTools.Structs.Position2D(PlayAreaWidth / 2, PlayAreaHeight / 2), | ||||||
|  |                     500, | ||||||
|  |                     16, | ||||||
|  |                     16 | ||||||
|  |                 ), | ||||||
|  |                 0.5 | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             // top boundary | ||||||
|  |             SendMessage( | ||||||
|  |                 new BoundarySpawnMessage( | ||||||
|  |                     new MoonTools.Structs.Position2D(0, -6), | ||||||
|  |                     PlayAreaWidth, | ||||||
|  |                     6 | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             // bottom boundary | ||||||
|  |             SendMessage( | ||||||
|  |                 new BoundarySpawnMessage( | ||||||
|  |                     new MoonTools.Structs.Position2D(0, PlayAreaHeight), | ||||||
|  |                     PlayAreaWidth, | ||||||
|  |                     6 | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             // right boundary | ||||||
|  |             SendMessage( | ||||||
|  |                 new GoalBoundarySpawnMessage( | ||||||
|  |                     Enums.PlayerIndex.One, | ||||||
|  |                     new MoonTools.Structs.Position2D(PlayAreaWidth, 0), | ||||||
|  |                     6, | ||||||
|  |                     PlayAreaHeight | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             // left boundary | ||||||
|  |             SendMessage( | ||||||
|  |                 new GoalBoundarySpawnMessage( | ||||||
|  |                     Enums.PlayerIndex.Two, | ||||||
|  |                     new MoonTools.Structs.Position2D(-6, 0), | ||||||
|  |                     6, | ||||||
|  |                     PlayAreaHeight | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void EndGame() | ||||||
|  |         { | ||||||
|  |             DestroyAllWith<PositionComponent>(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void StartTitle() | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void EndTitle() | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -23,4 +23,10 @@ namespace PongFE.Enums | ||||||
|         Player, |         Player, | ||||||
|         Computer |         Computer | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     public enum GameState | ||||||
|  |     { | ||||||
|  |         Title, | ||||||
|  |         Game | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | using Encompass; | ||||||
|  | using PongFE.Enums; | ||||||
|  | 
 | ||||||
|  | namespace PongFE.Messages | ||||||
|  | { | ||||||
|  |     public struct ChangeGameStateMessage : IMessage | ||||||
|  |     { | ||||||
|  |         public GameState GameState { get; } | ||||||
|  | 
 | ||||||
|  |         public ChangeGameStateMessage(GameState gameState) | ||||||
|  |         { | ||||||
|  |             GameState = gameState; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -25,6 +25,7 @@ namespace PongFE | ||||||
|         RenderTarget2D GameRenderTarget { get; set; } |         RenderTarget2D GameRenderTarget { get; set; } | ||||||
| 
 | 
 | ||||||
|         DynamicSpriteFont ScoreFont { get; set; } |         DynamicSpriteFont ScoreFont { get; set; } | ||||||
|  |         DynamicSpriteFont InstructionFont { get; set; } | ||||||
| 
 | 
 | ||||||
|         const int PLAY_AREA_WIDTH = 1280; |         const int PLAY_AREA_WIDTH = 1280; | ||||||
|         const int PLAY_AREA_HEIGHT = 720; |         const int PLAY_AREA_HEIGHT = 720; | ||||||
|  | @ -63,6 +64,12 @@ namespace PongFE | ||||||
|                 128 |                 128 | ||||||
|             ); |             ); | ||||||
| 
 | 
 | ||||||
|  |             InstructionFont = DynamicSpriteFont.FromTtf( | ||||||
|  |                 File.ReadAllBytes(@"Content/Fonts/SquaredDisplay.ttf"), | ||||||
|  |                 48 | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             WorldBuilder.AddEngine(new GameStateEngine(PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT)); | ||||||
|             WorldBuilder.AddEngine(new InputEngine()); |             WorldBuilder.AddEngine(new InputEngine()); | ||||||
|             WorldBuilder.AddEngine(new PaddleMovementEngine()); |             WorldBuilder.AddEngine(new PaddleMovementEngine()); | ||||||
|             WorldBuilder.AddEngine(new VelocityEngine()); |             WorldBuilder.AddEngine(new VelocityEngine()); | ||||||
|  | @ -84,77 +91,14 @@ namespace PongFE | ||||||
|             WorldBuilder.AddOrderedRenderer(new Texture2DRenderer(SpriteBatch)); |             WorldBuilder.AddOrderedRenderer(new Texture2DRenderer(SpriteBatch)); | ||||||
|             WorldBuilder.AddGeneralRenderer(new CenterLineRenderer(SpriteBatch, WhitePixel), 0); |             WorldBuilder.AddGeneralRenderer(new CenterLineRenderer(SpriteBatch, WhitePixel), 0); | ||||||
|             WorldBuilder.AddGeneralRenderer(new ScoreRenderer(SpriteBatch, ScoreFont), 0); |             WorldBuilder.AddGeneralRenderer(new ScoreRenderer(SpriteBatch, ScoreFont), 0); | ||||||
| 
 |             WorldBuilder.AddGeneralRenderer(new TitleRenderer(SpriteBatch, ScoreFont, InstructionFont), 0); | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new PaddleSpawnMessage( |  | ||||||
|                     new MoonTools.Structs.Position2D(5, 5), |  | ||||||
|                     Enums.PlayerIndex.One, |  | ||||||
|                     PaddleControl.Player, |  | ||||||
|                     20, |  | ||||||
|                     80 |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new PaddleSpawnMessage( |  | ||||||
|                     new MoonTools.Structs.Position2D(PLAY_AREA_WIDTH - 25, 5), |  | ||||||
|                     Enums.PlayerIndex.Two, |  | ||||||
|                     PaddleControl.Computer, |  | ||||||
|                     20, |  | ||||||
|                     80 |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new BallSpawnMessage( |  | ||||||
|                     new MoonTools.Structs.Position2D(PLAY_AREA_WIDTH / 2, PLAY_AREA_HEIGHT / 2), |  | ||||||
|                     500, |  | ||||||
|                     16, |  | ||||||
|                     16 |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             // top boundary |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new BoundarySpawnMessage( |  | ||||||
|                     new MoonTools.Structs.Position2D(0, -6), |  | ||||||
|                     PLAY_AREA_WIDTH, |  | ||||||
|                     6 |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             // bottom boundary |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new BoundarySpawnMessage( |  | ||||||
|                     new MoonTools.Structs.Position2D(0, PLAY_AREA_HEIGHT), |  | ||||||
|                     PLAY_AREA_WIDTH, |  | ||||||
|                     6 |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             // right boundary |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new GoalBoundarySpawnMessage( |  | ||||||
|                     Enums.PlayerIndex.One, |  | ||||||
|                     new MoonTools.Structs.Position2D(PLAY_AREA_WIDTH, 0), |  | ||||||
|                     6, |  | ||||||
|                     PLAY_AREA_HEIGHT |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             // left boundary |  | ||||||
|             WorldBuilder.SendMessage( |  | ||||||
|                 new GoalBoundarySpawnMessage( |  | ||||||
|                     Enums.PlayerIndex.Two, |  | ||||||
|                     new MoonTools.Structs.Position2D(-6, 0), |  | ||||||
|                     6, |  | ||||||
|                     PLAY_AREA_HEIGHT |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
| 
 | 
 | ||||||
|             var playAreaEntity = WorldBuilder.CreateEntity(); |             var playAreaEntity = WorldBuilder.CreateEntity(); | ||||||
|             WorldBuilder.SetComponent(playAreaEntity, new PlayAreaComponent(PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT)); |             WorldBuilder.SetComponent(playAreaEntity, new PlayAreaComponent(PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT)); | ||||||
| 
 | 
 | ||||||
|  |             var gameStateEntity = WorldBuilder.CreateEntity(); | ||||||
|  |             WorldBuilder.SetComponent(gameStateEntity, new GameStateComponent(GameState.Title)); | ||||||
|  | 
 | ||||||
|             World = WorldBuilder.Build(); |             World = WorldBuilder.Build(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ using Encompass; | ||||||
| using Microsoft.Xna.Framework; | using Microsoft.Xna.Framework; | ||||||
| using Microsoft.Xna.Framework.Graphics; | using Microsoft.Xna.Framework.Graphics; | ||||||
| using PongFE.Components; | using PongFE.Components; | ||||||
|  | using PongFE.Enums; | ||||||
| 
 | 
 | ||||||
| namespace PongFE.Renderers | namespace PongFE.Renderers | ||||||
| { | { | ||||||
|  | @ -19,9 +20,14 @@ namespace PongFE.Renderers | ||||||
| 
 | 
 | ||||||
|         public override void Render() |         public override void Render() | ||||||
|         { |         { | ||||||
|             ref readonly var playAreaComponent = ref ReadComponent<PlayAreaComponent>(); |             ref readonly var gameStateComponent = ref ReadComponent<GameStateComponent>(); | ||||||
| 
 | 
 | ||||||
|             DrawDottedLine(playAreaComponent.Width / 2, 0, playAreaComponent.Width / 2, playAreaComponent.Height, 20, 20); |             if (gameStateComponent.GameState == GameState.Game) | ||||||
|  |             { | ||||||
|  |                 ref readonly var playAreaComponent = ref ReadComponent<PlayAreaComponent>(); | ||||||
|  | 
 | ||||||
|  |                 DrawDottedLine(playAreaComponent.Width / 2, 0, playAreaComponent.Width / 2, playAreaComponent.Height, 20, 20); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private void DrawDottedLine(float x1, float y1, float x2, float y2, int dash, int gap) |         private void DrawDottedLine(float x1, float y1, float x2, float y2, int dash, int gap) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,47 @@ | ||||||
|  | using Encompass; | ||||||
|  | using Microsoft.Xna.Framework; | ||||||
|  | using Microsoft.Xna.Framework.Graphics; | ||||||
|  | using PongFE.Components; | ||||||
|  | using PongFE.Enums; | ||||||
|  | using SpriteFontPlus; | ||||||
|  | 
 | ||||||
|  | namespace PongFE.Renderers | ||||||
|  | { | ||||||
|  |     public class TitleRenderer : GeneralRenderer | ||||||
|  |     { | ||||||
|  |         private SpriteBatch SpriteBatch { get; } | ||||||
|  |         private DynamicSpriteFont TitleFont { get; } | ||||||
|  |         private DynamicSpriteFont InstructionFont { get; } | ||||||
|  | 
 | ||||||
|  |         public TitleRenderer(SpriteBatch spriteBatch, DynamicSpriteFont titleFont, DynamicSpriteFont instructionFont) | ||||||
|  |         { | ||||||
|  |             SpriteBatch = spriteBatch; | ||||||
|  |             TitleFont = titleFont; | ||||||
|  |             InstructionFont = instructionFont; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override void Render() | ||||||
|  |         { | ||||||
|  |             ref readonly var gameStateComponent = ref ReadComponent<GameStateComponent>(); | ||||||
|  |             ref readonly var playAreaComponent = ref ReadComponent<PlayAreaComponent>(); | ||||||
|  | 
 | ||||||
|  |             if (gameStateComponent.GameState == GameState.Title) | ||||||
|  |             { | ||||||
|  |                 var titleDimensions = TitleFont.MeasureString("PongFE"); | ||||||
|  |                 var titlePosition = new Vector2( | ||||||
|  |                     (playAreaComponent.Width - titleDimensions.X) / 2, | ||||||
|  |                     (playAreaComponent.Height - titleDimensions.Y) / 4 | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var instructionDimensions = InstructionFont.MeasureString("Press Enter to begin"); | ||||||
|  |                 var instructionPosition = new Vector2( | ||||||
|  |                     (playAreaComponent.Width - instructionDimensions.X) / 2, | ||||||
|  |                     playAreaComponent.Height * 2 / 3 | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 SpriteBatch.DrawString(TitleFont, "PongFE", titlePosition, Color.White); | ||||||
|  |                 SpriteBatch.DrawString(InstructionFont, "Press Enter to begin", instructionPosition, Color.White); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue