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,
|
||||
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; }
|
||||
|
||||
DynamicSpriteFont ScoreFont { get; set; }
|
||||
DynamicSpriteFont InstructionFont { get; set; }
|
||||
|
||||
const int PLAY_AREA_WIDTH = 1280;
|
||||
const int PLAY_AREA_HEIGHT = 720;
|
||||
|
@ -63,6 +64,12 @@ namespace PongFE
|
|||
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 PaddleMovementEngine());
|
||||
WorldBuilder.AddEngine(new VelocityEngine());
|
||||
|
@ -84,77 +91,14 @@ namespace PongFE
|
|||
WorldBuilder.AddOrderedRenderer(new Texture2DRenderer(SpriteBatch));
|
||||
WorldBuilder.AddGeneralRenderer(new CenterLineRenderer(SpriteBatch, WhitePixel), 0);
|
||||
WorldBuilder.AddGeneralRenderer(new ScoreRenderer(SpriteBatch, ScoreFont), 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
|
||||
)
|
||||
);
|
||||
WorldBuilder.AddGeneralRenderer(new TitleRenderer(SpriteBatch, ScoreFont, InstructionFont), 0);
|
||||
|
||||
var playAreaEntity = WorldBuilder.CreateEntity();
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ using Encompass;
|
|||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using PongFE.Components;
|
||||
using PongFE.Enums;
|
||||
|
||||
namespace PongFE.Renderers
|
||||
{
|
||||
|
@ -19,9 +20,14 @@ namespace PongFE.Renderers
|
|||
|
||||
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)
|
||||
|
|
|
@ -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