+ Game UI
This commit is contained in:
+30
-30
@@ -13,7 +13,7 @@ namespace client
|
|||||||
internal class Ball
|
internal class Ball
|
||||||
{
|
{
|
||||||
public Vector2 Position = new Vector2(0, 0);
|
public Vector2 Position = new Vector2(0, 0);
|
||||||
public Vector2 DefaultPosition = new Vector2(0,0);
|
public Vector2 DefaultPosition = new Vector2(0, 0);
|
||||||
public int Radius = 5;
|
public int Radius = 5;
|
||||||
public bool CanMove = false;
|
public bool CanMove = false;
|
||||||
|
|
||||||
@@ -31,16 +31,16 @@ namespace client
|
|||||||
|
|
||||||
public Ball(Vector2 position, int radius, float speed)
|
public Ball(Vector2 position, int radius, float speed)
|
||||||
{
|
{
|
||||||
this.Position = position;
|
Position = position;
|
||||||
this.DefaultPosition = position;
|
DefaultPosition = position;
|
||||||
this.Radius = radius;
|
Radius = radius;
|
||||||
this.Speed = speed;
|
Speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default Position
|
// Default Position
|
||||||
public Ball GetBackToDefaultPos()
|
public Ball GetBackToDefaultPos()
|
||||||
{
|
{
|
||||||
this.Position = this.DefaultPosition;
|
Position = DefaultPosition;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,66 +49,66 @@ namespace client
|
|||||||
{
|
{
|
||||||
|
|
||||||
spriteBatch.DrawCircle(
|
spriteBatch.DrawCircle(
|
||||||
this.Position,
|
Position,
|
||||||
this.Radius,
|
Radius,
|
||||||
360,
|
360,
|
||||||
Color.White,
|
Color.White,
|
||||||
this.Radius
|
Radius
|
||||||
) ;
|
);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start | Stop ball moving
|
// Start | Stop ball moving
|
||||||
public Ball StartMoving()
|
public Ball StartMoving()
|
||||||
{
|
{
|
||||||
this.MoveX = random.Next((int)-this.Speed, (int)this.Speed);
|
MoveX = random.Next((int)-Speed, (int)Speed);
|
||||||
this.MoveY = random.Next((int)-this.Speed, (int)this.Speed);
|
MoveY = random.Next((int)-Speed, (int)Speed);
|
||||||
this.CanMove = true;
|
CanMove = true;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Ball Move(GameTime gameTime, float screenHeight, float screenWidth, Player p1, Player p2)
|
public Ball Move(GameTime gameTime, float screenHeight, float screenWidth, Player p1, Player p2)
|
||||||
{
|
{
|
||||||
if (this.CanMove)
|
if (CanMove)
|
||||||
{
|
{
|
||||||
// X
|
// X
|
||||||
if (this.Position.X < 0)
|
if (Position.X < 0)
|
||||||
{
|
{
|
||||||
this.MoveX -= this.Speed;
|
MoveX -= Speed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.MoveX += this.Speed;
|
MoveX += Speed;
|
||||||
}
|
}
|
||||||
// Y
|
// Y
|
||||||
if (this.Position.Y < 0)
|
if (Position.Y < 0)
|
||||||
{
|
{
|
||||||
this.MoveY -= this.Speed;
|
MoveY -= Speed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.MoveY += this.Speed;
|
MoveY += Speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Position.X += this.MoveX;
|
Position.X += MoveX;
|
||||||
this.Position.Y += this.MoveY;
|
Position.Y += MoveY;
|
||||||
|
|
||||||
// Collisions
|
// Collisions
|
||||||
if (this.Position.Y < this.Radius*2 && this.MoveY < 0)
|
if (Position.Y < Radius * 2 && MoveY < 0)
|
||||||
{
|
{
|
||||||
this.MoveY = Math.Abs(this.MoveY);
|
MoveY = Math.Abs(MoveY);
|
||||||
}
|
}
|
||||||
if (this.Position.Y > screenHeight - this.Radius*2 && this.MoveY > 0)
|
if (Position.Y > screenHeight - Radius * 2 && MoveY > 0)
|
||||||
{
|
{
|
||||||
this.MoveY = -this.MoveY;
|
MoveY = -MoveY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(this.Position.X < p1.Position.X + p1.width && this.Position.X > p1.Position.X && this.Position.Y > p1.Position.Y && this.Position.Y < p1.Position.Y + p1.height) ||
|
Position.X < p1.Position.X + p1.width && Position.X > p1.Position.X && Position.Y > p1.Position.Y && Position.Y < p1.Position.Y + p1.height ||
|
||||||
(this.Position.X+ this.Radius*2 > p2.Position.X && this.Position.X + this.Radius*2 < p2.Position.X + p2.width && this.Position.Y > p2.Position.Y && this.Position.Y < p2.Position.Y + p2.height)
|
Position.X + Radius * 2 > p2.Position.X && Position.X + Radius * 2 < p2.Position.X + p2.width && Position.Y > p2.Position.Y && Position.Y < p2.Position.Y + p2.height
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.MoveX = -this.MoveX;
|
MoveX = -MoveX;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ namespace client
|
|||||||
|
|
||||||
public Ball StopMoving()
|
public Ball StopMoving()
|
||||||
{
|
{
|
||||||
this.CanMove = false;
|
CanMove = false;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,3 +25,10 @@
|
|||||||
/processorParam:TextureFormat=Color
|
/processorParam:TextureFormat=Color
|
||||||
/build:ball.png
|
/build:ball.png
|
||||||
|
|
||||||
|
#begin defaultFont.spritefont
|
||||||
|
/importer:FontDescriptionImporter
|
||||||
|
/processor:FontDescriptionProcessor
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:TextureFormat=Compressed
|
||||||
|
/build:defaultFont.spritefont;scoreFont.spritefont
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
This file contains an xml description of a font, and will be read by the XNA
|
||||||
|
Framework Content Pipeline. Follow the comments to customize the appearance
|
||||||
|
of the font in your game, and to change the characters which are available to draw
|
||||||
|
with.
|
||||||
|
-->
|
||||||
|
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
|
||||||
|
<Asset Type="Graphics:FontDescription">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Modify this string to change the font that will be imported.
|
||||||
|
-->
|
||||||
|
<FontName>Arial</FontName>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Size is a float value, measured in points. Modify this value to change
|
||||||
|
the size of the font.
|
||||||
|
-->
|
||||||
|
<Size>38</Size>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Spacing is a float value, measured in pixels. Modify this value to change
|
||||||
|
the amount of spacing in between characters.
|
||||||
|
-->
|
||||||
|
<Spacing>0</Spacing>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
UseKerning controls the layout of the font. If this value is true, kerning information
|
||||||
|
will be used when placing characters.
|
||||||
|
-->
|
||||||
|
<UseKerning>true</UseKerning>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
|
||||||
|
and "Bold, Italic", and are case sensitive.
|
||||||
|
-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If you uncomment this line, the default character will be substituted if you draw
|
||||||
|
or measure text that contains characters which were not included in the font.
|
||||||
|
-->
|
||||||
|
<!-- <DefaultCharacter>*</DefaultCharacter> -->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
CharacterRegions control what letters are available in the font. Every
|
||||||
|
character from Start to End will be built and made available for drawing. The
|
||||||
|
default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
|
||||||
|
character set. The characters are ordered according to the Unicode standard.
|
||||||
|
See the documentation for more information.
|
||||||
|
-->
|
||||||
|
<CharacterRegions>
|
||||||
|
<CharacterRegion>
|
||||||
|
<Start> </Start>
|
||||||
|
<End>~</End>
|
||||||
|
</CharacterRegion>
|
||||||
|
</CharacterRegions>
|
||||||
|
</Asset>
|
||||||
|
</XnaContent>
|
||||||
+13
-1
@@ -12,6 +12,9 @@ namespace client
|
|||||||
private KillZone killZone1;
|
private KillZone killZone1;
|
||||||
private KillZone killZone2;
|
private KillZone killZone2;
|
||||||
|
|
||||||
|
private UI UI;
|
||||||
|
private SpriteFont spriteFont;
|
||||||
|
|
||||||
private GraphicsDeviceManager _graphics;
|
private GraphicsDeviceManager _graphics;
|
||||||
private SpriteBatch _spriteBatch;
|
private SpriteBatch _spriteBatch;
|
||||||
|
|
||||||
@@ -24,6 +27,12 @@ namespace client
|
|||||||
|
|
||||||
protected override void Initialize()
|
protected override void Initialize()
|
||||||
{
|
{
|
||||||
|
// Window
|
||||||
|
Window.Title = "Pong";
|
||||||
|
|
||||||
|
// UI
|
||||||
|
UI = new UI();
|
||||||
|
|
||||||
// PLAYERS
|
// PLAYERS
|
||||||
pl1 = new Player(
|
pl1 = new Player(
|
||||||
new Vector2(15, _graphics.PreferredBackBufferHeight / 2 - 50),
|
new Vector2(15, _graphics.PreferredBackBufferHeight / 2 - 50),
|
||||||
@@ -31,7 +40,7 @@ namespace client
|
|||||||
100,
|
100,
|
||||||
100f
|
100f
|
||||||
).SetControllable(true);
|
).SetControllable(true);
|
||||||
|
|
||||||
pl2 = new Player(
|
pl2 = new Player(
|
||||||
new Vector2(_graphics.PreferredBackBufferWidth - 30, _graphics.PreferredBackBufferHeight / 2 - 50),
|
new Vector2(_graphics.PreferredBackBufferWidth - 30, _graphics.PreferredBackBufferHeight / 2 - 50),
|
||||||
15,
|
15,
|
||||||
@@ -70,6 +79,7 @@ namespace client
|
|||||||
protected override void LoadContent()
|
protected override void LoadContent()
|
||||||
{
|
{
|
||||||
_spriteBatch = new SpriteBatch(GraphicsDevice);
|
_spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||||
|
spriteFont = Content.Load<SpriteFont>("scoreFont");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Update(GameTime gameTime)
|
protected override void Update(GameTime gameTime)
|
||||||
@@ -89,6 +99,8 @@ namespace client
|
|||||||
GraphicsDevice.Clear(Color.Black);
|
GraphicsDevice.Clear(Color.Black);
|
||||||
_spriteBatch.Begin();
|
_spriteBatch.Begin();
|
||||||
|
|
||||||
|
UI.Draw(_spriteBatch, _graphics.PreferredBackBufferWidth, _graphics.PreferredBackBufferHeight, spriteFont, 0, 0);
|
||||||
|
|
||||||
pl1.DrawPlayer(_spriteBatch, GraphicsDevice);
|
pl1.DrawPlayer(_spriteBatch, GraphicsDevice);
|
||||||
pl2.DrawPlayer(_spriteBatch, GraphicsDevice);
|
pl2.DrawPlayer(_spriteBatch, GraphicsDevice);
|
||||||
|
|
||||||
|
|||||||
+8
-7
@@ -27,34 +27,35 @@ namespace client
|
|||||||
|
|
||||||
public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphicsDevice)
|
public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphicsDevice)
|
||||||
{
|
{
|
||||||
Texture2D texture = new Texture2D(graphicsDevice, this.Width, this.Height);
|
Texture2D texture = new Texture2D(graphicsDevice, Width, Height);
|
||||||
Color[] data = new Color[this.Width * this.Height];
|
Color[] data = new Color[Width * Height];
|
||||||
for (int i = 0; i < data.Length; ++i)
|
for (int i = 0; i < data.Length; ++i)
|
||||||
{
|
{
|
||||||
if (Debug)
|
if (Debug)
|
||||||
{
|
{
|
||||||
data[i] = Color.Red;
|
data[i] = Color.Red;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
data[i] = Color.Transparent;
|
data[i] = Color.Transparent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
texture.SetData(data);
|
texture.SetData(data);
|
||||||
spriteBatch.Draw(texture, this.Position, Color.White);
|
spriteBatch.Draw(texture, Position, Color.White);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Collisions(Ball ball)
|
public void Collisions(Ball ball)
|
||||||
{
|
{
|
||||||
if (this.isLeft)
|
if (isLeft)
|
||||||
{
|
{
|
||||||
if (ball.Position.X < this.Position.X + this.Width && ball.CanMove)
|
if (ball.Position.X < Position.X + Width && ball.CanMove)
|
||||||
{
|
{
|
||||||
ball.StopMoving();
|
ball.StopMoving();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ball.Position.X > this.Position.X && ball.CanMove)
|
if (ball.Position.X > Position.X && ball.CanMove)
|
||||||
{
|
{
|
||||||
ball.StopMoving();
|
ball.StopMoving();
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-22
@@ -22,17 +22,17 @@ namespace client
|
|||||||
// Constructors
|
// Constructors
|
||||||
public Player()
|
public Player()
|
||||||
{
|
{
|
||||||
this.Position = new Vector2(0, 0);
|
Position = new Vector2(0, 0);
|
||||||
this.DefaultPosition = new Vector2(0, 0);
|
DefaultPosition = new Vector2(0, 0);
|
||||||
this.width = 20;
|
width = 20;
|
||||||
this.height = 100;
|
height = 100;
|
||||||
this.speed = 100f;
|
speed = 100f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player(Vector2 position, int width, int height, float speed)
|
public Player(Vector2 position, int width, int height, float speed)
|
||||||
{
|
{
|
||||||
this.Position = position;
|
Position = position;
|
||||||
this.DefaultPosition = position;
|
DefaultPosition = position;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
this.height = height;
|
this.height = height;
|
||||||
this.speed = speed;
|
this.speed = speed;
|
||||||
@@ -41,73 +41,73 @@ namespace client
|
|||||||
// Update the player's position
|
// Update the player's position
|
||||||
public Player setPos(Vector2 pos)
|
public Player setPos(Vector2 pos)
|
||||||
{
|
{
|
||||||
this.Position = pos;
|
Position = pos;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set | Get default player position
|
// Set | Get default player position
|
||||||
public Player setDefaultPos(Vector2 pos)
|
public Player setDefaultPos(Vector2 pos)
|
||||||
{
|
{
|
||||||
this.DefaultPosition = pos;
|
DefaultPosition = pos;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2 getDefaultPos()
|
public Vector2 getDefaultPos()
|
||||||
{
|
{
|
||||||
return this.DefaultPosition;
|
return DefaultPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player BackToDefaultPos()
|
public Player BackToDefaultPos()
|
||||||
{
|
{
|
||||||
this.Position = this.DefaultPosition;
|
Position = DefaultPosition;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set controllable by input
|
// Set controllable by input
|
||||||
public Player SetControllable(bool state)
|
public Player SetControllable(bool state)
|
||||||
{
|
{
|
||||||
this.canMove = state;
|
canMove = state;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw player on screen
|
// Draw player on screen
|
||||||
public Player DrawPlayer(SpriteBatch spriteBatch, GraphicsDevice _graphicsDevice)
|
public Player DrawPlayer(SpriteBatch spriteBatch, GraphicsDevice _graphicsDevice)
|
||||||
{
|
{
|
||||||
Texture2D texture = new Texture2D(_graphicsDevice, this.width, this.height);
|
Texture2D texture = new Texture2D(_graphicsDevice, width, height);
|
||||||
Color[] data = new Color[this.width * this.height];
|
Color[] data = new Color[width * height];
|
||||||
for (int i = 0; i < data.Length; ++i)
|
for (int i = 0; i < data.Length; ++i)
|
||||||
{
|
{
|
||||||
data[i] = Color.White;
|
data[i] = Color.White;
|
||||||
}
|
}
|
||||||
texture.SetData(data);
|
texture.SetData(data);
|
||||||
|
|
||||||
spriteBatch.Draw(texture, this.Position, Color.White);
|
spriteBatch.Draw(texture, Position, Color.White);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inputs controls
|
// Inputs controls
|
||||||
public Player InputsControls(GameTime gameTime, float screenHeight)
|
public Player InputsControls(GameTime gameTime, float screenHeight)
|
||||||
{
|
{
|
||||||
if (this.canMove)
|
if (canMove)
|
||||||
{
|
{
|
||||||
if (Keyboard.GetState().IsKeyDown(Keys.Up))
|
if (Keyboard.GetState().IsKeyDown(Keys.Up))
|
||||||
{
|
{
|
||||||
Vector2 asked = new Vector2(this.Position.X, this.Position.Y - this.speed * (float)gameTime.ElapsedGameTime.TotalSeconds);
|
Vector2 asked = new Vector2(Position.X, Position.Y - speed * (float)gameTime.ElapsedGameTime.TotalSeconds);
|
||||||
if (asked.Y <= 0)
|
if (asked.Y <= 0)
|
||||||
{
|
{
|
||||||
asked.Y = 0f;
|
asked.Y = 0f;
|
||||||
}
|
}
|
||||||
this.Position = asked;
|
Position = asked;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Keyboard.GetState().IsKeyDown(Keys.Down))
|
if (Keyboard.GetState().IsKeyDown(Keys.Down))
|
||||||
{
|
{
|
||||||
Vector2 asked = new Vector2(this.Position.X, this.Position.Y + this.speed * (float)gameTime.ElapsedGameTime.TotalSeconds);
|
Vector2 asked = new Vector2(Position.X, Position.Y + speed * (float)gameTime.ElapsedGameTime.TotalSeconds);
|
||||||
if (asked.Y >= screenHeight - this.height)
|
if (asked.Y >= screenHeight - height)
|
||||||
{
|
{
|
||||||
asked.Y = screenHeight - this.height;
|
asked.Y = screenHeight - height;
|
||||||
}
|
}
|
||||||
this.Position = asked;
|
Position = asked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using MonoGame.Extended;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace client
|
||||||
|
{
|
||||||
|
internal class UI
|
||||||
|
{
|
||||||
|
public UI()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(SpriteBatch spriteBatch, float screenWidth, float screenHeight, SpriteFont spriteFont, int score1, int score2)
|
||||||
|
{
|
||||||
|
// Lines
|
||||||
|
int divider = 21;
|
||||||
|
for(int i = 0; i < screenHeight / divider; i++)
|
||||||
|
{
|
||||||
|
if (i % 2 == 0)
|
||||||
|
{
|
||||||
|
spriteBatch.DrawLine(
|
||||||
|
new Vector2(screenWidth / 2, screenHeight / divider * i),
|
||||||
|
new Vector2(screenWidth / 2, screenHeight / divider * (i+1)),
|
||||||
|
Color.White
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scores
|
||||||
|
int spacing = 25;
|
||||||
|
spriteBatch.DrawString(spriteFont, $"{score1}", new Vector2(screenWidth / 2 - spriteFont.MeasureString($"{score1}").X - spacing, 5), Color.LightGray);
|
||||||
|
spriteBatch.DrawString(spriteFont, $"{score2}", new Vector2(screenWidth / 2 + spacing, 5), Color.LightGray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,8 @@
|
|||||||
<PackageReference Include="MonoGame.Extended" Version="3.8.0" />
|
<PackageReference Include="MonoGame.Extended" Version="3.8.0" />
|
||||||
<PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.1.303" />
|
<PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.1.303" />
|
||||||
<PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.303" />
|
<PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.303" />
|
||||||
|
<PackageReference Include="MonoGame.UI.Forms" Version="1.0.1" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Target Name="RestoreDotnetTools" BeforeTargets="Restore">
|
<Target Name="RestoreDotnetTools" BeforeTargets="Restore">
|
||||||
<Message Text="Restoring dotnet tools" Importance="High" />
|
<Message Text="Restoring dotnet tools" Importance="High" />
|
||||||
|
|||||||
Reference in New Issue
Block a user