diff --git a/Galactic Colors Control Console/Program.cs b/Galactic Colors Control Console/Program.cs index 9b1a550..dbc657a 100644 --- a/Galactic Colors Control Console/Program.cs +++ b/Galactic Colors Control Console/Program.cs @@ -3,7 +3,6 @@ using Galactic_Colors_Control_Common; using Galactic_Colors_Control_Common.Protocol; using System; using System.Reflection; -using System.Threading; namespace Galactic_Colors_Control_Console { @@ -23,7 +22,7 @@ namespace Galactic_Colors_Control_Console Console.Title = "Galactic Colors Control Client"; //Start display Console.Write(">"); Common.ConsoleWrite("Galactic Colors Control Client", ConsoleColor.Red); - Common.ConsoleWrite("Console " + Assembly.GetEntryAssembly().GetName().Version.ToString(), ConsoleColor.DarkYellow); + Common.ConsoleWrite("Console " + Assembly.GetEntryAssembly().GetName().Version.ToString(), ConsoleColor.Yellow); bool hostSet = false; while (!hostSet) //Request hostname { @@ -79,7 +78,7 @@ namespace Galactic_Colors_Control_Console return; string[] req; - if(input[0] == commandChar) + if (input[0] == commandChar) { input = input.Substring(1); req = Common.SplitArgs(input); diff --git a/Galactic Colors Control GUI/Background.cs b/Galactic Colors Control GUI/Background.cs new file mode 100644 index 0000000..b04284c --- /dev/null +++ b/Galactic Colors Control GUI/Background.cs @@ -0,0 +1,74 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace Galactic_Colors_Control_GUI +{ + /// + /// Multilayer Background + /// + public class Background + { + private double[] backgroundX; + private double[] backgroundY; + private Texture2D[] backSprites; + private double[] ratio; + + public double speedX = 0; + public double speedY = 0; + + internal void Draw(object spriteBatch) + { + throw new NotImplementedException(); + } + + /// + /// Background.lenght == Ratio.Lenght + /// + public Background(Texture2D[] BackSprites, double[] Ratio) + { + backSprites = BackSprites; + ratio = Ratio; + backgroundX = new double[backSprites.Length]; + backgroundY = new double[backSprites.Length]; + } + + /// + /// Manual Move + /// + public void Move(double x, double y) + { + for (int index = 0; index < backSprites.Length; index++) + { + backgroundX[index] += (x * ratio[index]); + backgroundY[index] += (y * ratio[index]); + if (backgroundX[index] > backSprites[index].Width) { backgroundX[index] = 0; } + if (backgroundY[index] > backSprites[index].Height) { backgroundY[index] = 0; } + if (backgroundX[index] < 0) { backgroundX[index] = backSprites[index].Width; } + if (backgroundY[index] < 0) { backgroundY[index] = backSprites[index].Height; } + } + } + + /// + /// AutoMove for speedX and speedY + /// + public void Update() + { + Move(speedX, speedY); + } + + public void Draw(SpriteBatch spriteBatch) + { + for (int index = 0; index < backSprites.Length; index++) + { + for (int X = -1; X < Game.singleton.ScreenWidth / backSprites[index].Width + 1; X++) + { + for (int Y = -1; Y < Game.singleton.ScreenHeight / backSprites[index].Height + 1; Y++) + { + spriteBatch.Draw(backSprites[index], new Rectangle(X * backSprites[index].Width + (int)backgroundX[index], Y * backSprites[index].Height + (int)backgroundY[index], backSprites[index].Width, backSprites[index].Height), Color.White); + } + } + } + } + } +} diff --git a/Galactic Colors Control GUI/Galactic Colors Control GUI.csproj b/Galactic Colors Control GUI/Galactic Colors Control GUI.csproj index fb69eef..eb60deb 100644 --- a/Galactic Colors Control GUI/Galactic Colors Control GUI.csproj +++ b/Galactic Colors Control GUI/Galactic Colors Control GUI.csproj @@ -44,9 +44,17 @@ Properties\AssemblyInfoCommon.cs - + + + + + + + + + @@ -114,6 +122,10 @@ + + {022a69ce-22b5-4934-be9f-a9c6df9557ed} + Galactic Colors Control Common + {93582ce8-c8c8-4e19-908b-d671ecbade25} Galactic Colors Control diff --git a/Galactic Colors Control GUI/Game.cs b/Galactic Colors Control GUI/Game.cs new file mode 100644 index 0000000..788f013 --- /dev/null +++ b/Galactic Colors Control GUI/Game.cs @@ -0,0 +1,214 @@ +using Galactic_Colors_Control; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using MyMonoGame.GUI; +using System; +using System.IO; +using System.Reflection; +using System.Threading; + +namespace Galactic_Colors_Control_GUI +{ + /// + /// This is the main type for your game. + /// + public class Game : Microsoft.Xna.Framework.Game + { + public static Game singleton; + + private GraphicsDeviceManager graphics; + private SpriteBatch spriteBatch; + private ContentManager content; + + private SoundEffect[] effects = new SoundEffect[4]; //click, hover, explosion,... + + public Fonts fonts; + + internal static Texture2D nullSprite; + + private Texture2D[] pointerSprites = new Texture2D[1]; + public boxSprites[] buttonsSprites = new boxSprites[1]; + public Background background; + + public Client client; //Client Core + public Manager GUI = new Manager(); //MyMonogameGUI + + private string skinName; + private bool isFullScreen = false; + + public States.State gameState = new States.TitleState(new States.MainMenuState(), new TimeSpan(0,0,5)); + + private int _ScreenWidth = 1280; + private int _ScreenHeight = 720; + + public int ScreenWidth { get { return _ScreenWidth; } private set { _ScreenWidth = value; } } + public int ScreenHeight { get { return _ScreenHeight; } private set { _ScreenHeight = value; } } + + public Game() + { + singleton = this; + if (isFullScreen) //Fullscreen resolution + { + ScreenWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; + ScreenHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; + } + graphics = new GraphicsDeviceManager(this); + graphics.PreferredBackBufferWidth = ScreenWidth; + graphics.PreferredBackBufferHeight = ScreenHeight; + graphics.IsFullScreen = isFullScreen; + graphics.ApplyChanges(); + Content.RootDirectory = "Content"; + content = Content; + } + + /// + /// Allows the game to perform any initialization it needs to before starting to run. + /// This is where it can query for any required services and load any non-graphic + /// related content. Calling base.Initialize will enumerate through any components + /// and initialize them as well. + /// + protected override void Initialize() + { + nullSprite = new Texture2D(GraphicsDevice, 1, 1); + nullSprite.SetData(new Color[1 * 1] { Color.White }); + + GUI.Initialise(); + base.Initialize(); + } + + /// + /// LoadContent will be called once per game and is the place to load + /// all of your content. + /// + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + + //Need OpenAL Update for Windows 10 at least + effects[0] = content.Load("Sounds/alert"); + effects[1] = content.Load("Sounds/bip"); + effects[2] = content.Load("Sounds/change"); + effects[3] = content.Load("Sounds/valid"); + + fonts.small = content.Load("Fonts/small"); + fonts.basic = content.Load("Fonts/basic"); + fonts.title = content.Load("Fonts/title"); + + for (int i = 0; i < pointerSprites.Length; i++) + { + pointerSprites[i] = content.Load("Textures/Hub/pointer" + i); + } + + Texture2D[] backSprites = new Texture2D[2]; + backSprites[0] = content.Load("Textures/background0"); + backSprites[1] = content.Load("Textures/background1"); + + States.MainMenuState.logoSprite = content.Load("Textures/LogoSmall"); + + for (int i = 0; i < buttonsSprites.Length; i++) + { + buttonsSprites[i].topLeft = content.Load("Textures/Hub/Buttons/" + i + "/topLeft"); + buttonsSprites[i].topCenter = content.Load("Textures/Hub/Buttons/" + i + "/topCenter"); + buttonsSprites[i].topRight = content.Load("Textures/Hub/Buttons/" + i + "/topRight"); + buttonsSprites[i].centerLeft = content.Load("Textures/Hub/Buttons/" + i + "/centerLeft"); + buttonsSprites[i].centerCenter = content.Load("Textures/Hub/Buttons/" + i + "/centerCenter"); + buttonsSprites[i].centerRight = content.Load("Textures/Hub/Buttons/" + i + "/centerRight"); + buttonsSprites[i].bottomLeft = content.Load("Textures/Hub/Buttons/" + i + "/bottomLeft"); + buttonsSprites[i].bottomCenter = content.Load("Textures/Hub/Buttons/" + i + "/bottomCenter"); + buttonsSprites[i].bottomRight = content.Load("Textures/Hub/Buttons/" + i + "/bottomRight"); + } + + //Load from files + if (Directory.Exists("Skin/" + skinName)) + { + if (Directory.Exists("Skin/" + skinName + "/Sounds")) + { + Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/alert.mp3", ref effects[0]); + Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/bip.mp3", ref effects[1]); + Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/change.mp3", ref effects[2]); + Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/valid.mp3", ref effects[3]); + } + + if (Directory.Exists("Skin/" + skinName + "/Textures")) + { + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/background0.png", ref backSprites[0], GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/background1.png", ref backSprites[1], GraphicsDevice); + if (Directory.Exists("Skin/" + skinName + "/Textures/Hub/")) + { + if (Directory.Exists("Skin/" + skinName + "/Textures/Hub/Buttons")) + { + for (int i = 0; i < buttonsSprites.Length; i++) + { + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topLeft.png", ref buttonsSprites[i].topLeft, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topCenter.png", ref buttonsSprites[i].topCenter, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topRight.png", ref buttonsSprites[i].topRight, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerLeft.png", ref buttonsSprites[i].centerLeft, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerCenter.png", ref buttonsSprites[i].centerCenter, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerRight.png", ref buttonsSprites[i].centerRight, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomLeft.png", ref buttonsSprites[i].bottomLeft, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomCenter.png", ref buttonsSprites[i].bottomCenter, GraphicsDevice); + Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomRight.png", ref buttonsSprites[i].bottomRight, GraphicsDevice); + } + } + + for (int i = 0; i < pointerSprites.Length; i++) + { + Utilities.SpriteFromPng("Skin/" + skinName + "/Textures/Hub/pointer" + i + ".png", ref pointerSprites[i], GraphicsDevice); + } + } + } + } + + background = new Background(backSprites, new double[2] { 1, 2 }); //Background initialisation + background.speedX = 1; + } + + /// + /// UnloadContent will be called once per game and is the place to unload + /// game-specific content. + /// + protected override void UnloadContent() + { + // Unload any non ContentManager content here + } + + /// + /// Allows the game to run logic such as updating the world, + /// checking for collisions, gathering input, and playing audio. + /// + /// Provides a snapshot of timing values. + protected override void Update(GameTime gameTime) + { + gameState.Update(); + GUI.Update(); + + base.Update(gameTime); + } + + /// + /// This is called when the game should draw itself. + /// + /// Provides a snapshot of timing values. + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.DarkGray); + + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied); + + GUI.Draw(spriteBatch); + gameState.Draw(spriteBatch); + + Color ActiveColor = IsActive ? Color.Green : Color.Red; + GUI.Label(new MyMonoGame.Vector(10, ScreenHeight - 20), (1 / (float)gameTime.ElapsedGameTime.TotalSeconds).ToString(), fonts.small, new MyMonoGame.Colors(ActiveColor)); + spriteBatch.Draw(pointerSprites[0], new Rectangle(Mouse.GetState().X - 10, Mouse.GetState().Y - 10, 20, 20), Color.Red); + + spriteBatch.End(); + + base.Draw(gameTime); + } + } +} \ No newline at end of file diff --git a/Galactic Colors Control GUI/Game1.cs b/Galactic Colors Control GUI/Game1.cs deleted file mode 100644 index 57e86c2..0000000 --- a/Galactic Colors Control GUI/Game1.cs +++ /dev/null @@ -1,614 +0,0 @@ -//TODO comment and update for new clientcore -using Galactic_Colors_Control; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Audio; -using Microsoft.Xna.Framework.Content; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; -using MyMonoGame.GUI; -using System; -using System.IO; -using System.Reflection; -using System.Threading; - -namespace Galactic_Colors_Control_GUI -{ - /// - /// This is the main type for your game. - /// - public class Game1 : Game - { - private GraphicsDeviceManager graphics; - private SpriteBatch spriteBatch; - private ContentManager content; - - private SoundEffect[] effects = new SoundEffect[4]; - - private SpriteFont smallFont; - private SpriteFont basicFont; - private SpriteFont titleFont; - - internal static Texture2D nullSprite; - private Texture2D logoSprite; - private Texture2D[] backSprites = new Texture2D[2]; - private double[] backgroundX = new double[2]; - private double[] backgroundY = new double[2]; - private double acceleratorX = 1; - - private Texture2D[] pointerSprites = new Texture2D[1]; - private boxSprites[] buttonsSprites = new boxSprites[1]; - - private Client client; - private Manager GUI = new Manager(); - - private string skinName; - private bool isFullScren = false; - - private enum GameStatus - { - Home, Connect, Options, Game, Pause, End, Thanks, - Title, - Indentification, - Kick - } - - private GameStatus gameStatus = GameStatus.Home; - - private int ScreenWidth = 1280; - private int ScreenHeight = 720; - - private string username = null; - - private bool showOKMessage = false; - private string messageTitle; - private string messageText = string.Empty; - private bool showYNMessage = false; - private bool showLoading = false; - private bool showChat = false; - private string chatText = string.Empty; - private string chatInput = string.Empty; - private bool showParty = false; - private bool showOutput = true; - - public Game1() - { - if (isFullScren) - { - ScreenWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; - ScreenHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; - } - graphics = new GraphicsDeviceManager(this); - graphics.PreferredBackBufferWidth = ScreenWidth; - graphics.PreferredBackBufferHeight = ScreenHeight; - graphics.IsFullScreen = isFullScren; - graphics.ApplyChanges(); - Content.RootDirectory = "Content"; - content = Content; - } - - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// - protected override void Initialize() - { - nullSprite = new Texture2D(GraphicsDevice, 1, 1); - nullSprite.SetData(new Color[1 * 1] { Color.White }); - - GUI.Initialise(); - base.Initialize(); - } - - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// - protected override void LoadContent() - { - // Create a new SpriteBatch, which can be used to draw textures. - spriteBatch = new SpriteBatch(GraphicsDevice); - - //Need OpenAL Update for Windows 10 at least - effects[0] = content.Load("Sounds/alert"); - effects[1] = content.Load("Sounds/bip"); - effects[2] = content.Load("Sounds/change"); - effects[3] = content.Load("Sounds/valid"); - - smallFont = content.Load("Fonts/small"); - basicFont = content.Load("Fonts/basic"); - titleFont = content.Load("Fonts/title"); - - for (int i = 0; i < pointerSprites.Length; i++) - { - pointerSprites[i] = content.Load("Textures/Hub/pointer" + i); - } - - backSprites[0] = content.Load("Textures/background0"); - backSprites[1] = content.Load("Textures/background1"); - - logoSprite = content.Load("Textures/LogoSmall"); - - for (int i = 0; i < buttonsSprites.Length; i++) - { - buttonsSprites[i].topLeft = content.Load("Textures/Hub/Buttons/" + i + "/topLeft"); - buttonsSprites[i].topCenter = content.Load("Textures/Hub/Buttons/" + i + "/topCenter"); - buttonsSprites[i].topRight = content.Load("Textures/Hub/Buttons/" + i + "/topRight"); - buttonsSprites[i].centerLeft = content.Load("Textures/Hub/Buttons/" + i + "/centerLeft"); - buttonsSprites[i].centerCenter = content.Load("Textures/Hub/Buttons/" + i + "/centerCenter"); - buttonsSprites[i].centerRight = content.Load("Textures/Hub/Buttons/" + i + "/centerRight"); - buttonsSprites[i].bottomLeft = content.Load("Textures/Hub/Buttons/" + i + "/bottomLeft"); - buttonsSprites[i].bottomCenter = content.Load("Textures/Hub/Buttons/" + i + "/bottomCenter"); - buttonsSprites[i].bottomRight = content.Load("Textures/Hub/Buttons/" + i + "/bottomRight"); - } - - if (Directory.Exists("Skin/" + skinName)) - { - if (Directory.Exists("Skin/" + skinName + "/Sounds")) - { - Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/alert.mp3", ref effects[0]); - Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/bip.mp3", ref effects[1]); - Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/change.mp3", ref effects[2]); - Utilities.SoundFromMp3("Skin/" + skinName + "/Sounds/valid.mp3", ref effects[3]); - } - - if (Directory.Exists("Skin/" + skinName + "/Textures")) - { - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/background0.png", ref backSprites[0], GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/background1.png", ref backSprites[1], GraphicsDevice); - if (Directory.Exists("Skin/" + skinName + "/Textures/Hub/")) - { - if (Directory.Exists("Skin/" + skinName + "/Textures/Hub/Buttons")) - { - for (int i = 0; i < buttonsSprites.Length; i++) - { - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topLeft.png", ref buttonsSprites[i].topLeft, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topCenter.png", ref buttonsSprites[i].topCenter, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/topRight.png", ref buttonsSprites[i].topRight, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerLeft.png", ref buttonsSprites[i].centerLeft, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerCenter.png", ref buttonsSprites[i].centerCenter, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/centerRight.png", ref buttonsSprites[i].centerRight, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomLeft.png", ref buttonsSprites[i].bottomLeft, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomCenter.png", ref buttonsSprites[i].bottomCenter, GraphicsDevice); - Utilities.SpriteFromPng("Skin/" + skinName + "Textures/Hub/Buttons/" + i + "/bottomRight.png", ref buttonsSprites[i].bottomRight, GraphicsDevice); - } - } - - for (int i = 0; i < pointerSprites.Length; i++) - { - Utilities.SpriteFromPng("Skin/" + skinName + "/Textures/Hub/pointer" + i + ".png", ref pointerSprites[i], GraphicsDevice); - } - } - } - } - } - - /// - /// UnloadContent will be called once per game and is the place to unload - /// game-specific content. - /// - protected override void UnloadContent() - { - // Unload any non ContentManager content here - } - - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. - protected override void Update(GameTime gameTime) - { - switch (gameStatus) - { - case GameStatus.Home: - case GameStatus.Title: - case GameStatus.Connect: - case GameStatus.Indentification: - backgroundX[0] -= 1 * acceleratorX; - backgroundX[1] -= 2 * acceleratorX; - break; - - case GameStatus.Game: - if (showOutput) - //TODO - /*if (client.Output.Count > 0) - { - string text = client.Output[0]; - switch (text) - { - case "/clear": - chatText = string.Empty; - break; - - default: - ChatAdd(text); - break; - } - client.Output.Remove(text); - }*/ - if (!client.isRunning) { gameStatus = GameStatus.Kick; } - break; - } - - GUI.Update(); - - base.Update(gameTime); - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - GraphicsDevice.Clear(Color.DarkGray); - - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied); - - GUI.Draw(spriteBatch); - - switch (gameStatus) - { - case GameStatus.Title: - DrawBackground(0); - DrawBackground(1); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 2), "Galactic Colors Control", titleFont, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); - break; - - case GameStatus.Home: - DrawBackground(0); - DrawBackground(1); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4), "Galactic Colors Control", titleFont, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 40), "GUI " + Assembly.GetEntryAssembly().GetName().Version.ToString(), basicFont, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); - if (GUI.Button(new Rectangle(ScreenWidth - 64, ScreenHeight - 74, 64, 64), logoSprite)) { System.Diagnostics.Process.Start("https://sheychen.shost.ca/"); } - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 - 30, 150, 40), buttonsSprites[0], "Play", basicFont, new MyMonoGame.Colors(Color.White, Color.Green))) - { - GUI.ResetFocus(); - client = new Client(); - new Thread(() => - { - while (acceleratorX < 5) - { - Thread.Sleep(20); - acceleratorX += 0.1d; - } - gameStatus = GameStatus.Connect; - }).Start(); - } - //if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 20, 150, 40), buttonsSprites[0], "Options", basicFont, new MyMonoGame.Colors(Color.White, Color.Blue))) { - // GUI.ResetFocus(); - // gameStatus = GameStatus.Options; - //} - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 70, 150, 40), buttonsSprites[0], "Exit", basicFont, new MyMonoGame.Colors(Color.White, Color.Red))) - { - GUI.ResetFocus(); - gameStatus = GameStatus.Title; - new Thread(() => - { - while (acceleratorX > 0) - { - Thread.Sleep(10); - acceleratorX -= 0.01d; - } - Exit(); - }).Start(); - } - break; - - case GameStatus.Connect: - DrawBackground(0); - DrawBackground(1); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4), "Galactic Colors Control", titleFont, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); - if (showLoading) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), buttonsSprites[0]); - GUI.Label(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), "Loading", basicFont); - } - else - { - if (showOKMessage) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 150), buttonsSprites[0]); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 60), messageTitle, basicFont, null, Manager.textAlign.bottomCenter); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 100), messageText, smallFont, null, Manager.textAlign.bottomCenter); - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 140, ScreenHeight / 4 + 150, 280, 40), buttonsSprites[0], "Ok", basicFont)) { GUI.ResetFocus(); showOKMessage = false; } - } - else - { - if (showYNMessage) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 100), buttonsSprites[0]); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 60), messageTitle, basicFont, null, Manager.textAlign.bottomCenter); - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 140, ScreenHeight / 4 + 100, 135, 40), buttonsSprites[0], "Yes", basicFont)) - { - GUI.ResetFocus(); - new Thread(ConnectHost).Start(); - showYNMessage = false; - } - if (GUI.Button(new Rectangle(ScreenWidth / 2 + 5, ScreenHeight / 4 + 100, 135, 40), buttonsSprites[0], "No", basicFont)) - { - //TODO client.Output.Clear(); - client.ResetHost(); - GUI.ResetFocus(); - showYNMessage = false; - } - } - else - { - if (GUI.TextField(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 - 30, 150, 40), ref username, basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White), Manager.textAlign.centerCenter, "Server address")) { new Thread(ValidateHost).Start(); } - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 20, 150, 40), buttonsSprites[0], "Connect", basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White))) { new Thread(ValidateHost).Start(); } - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 70, 150, 40), buttonsSprites[0], "Back", basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White))) - { - GUI.ResetFocus(); - new Thread(() => - { - while (acceleratorX > 1) - { - Thread.Sleep(20); - acceleratorX -= 0.1d; - } - gameStatus = GameStatus.Home; - username = null; - }).Start(); - } - } - } - } - break; - - case GameStatus.Indentification: - DrawBackground(0); - DrawBackground(1); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4), "Galactic Colors Control", titleFont, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); - if (showLoading) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), buttonsSprites[0]); - GUI.Label(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), "Loading", basicFont); - } - else - { - if (showOKMessage) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 150), buttonsSprites[0]); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 60), messageTitle, basicFont, null, Manager.textAlign.bottomCenter); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 100), messageText, smallFont, null, Manager.textAlign.bottomCenter); - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 140, ScreenHeight / 4 + 150, 280, 40), buttonsSprites[0], "Ok", basicFont)) { GUI.ResetFocus(); showOKMessage = false; } - } - else - { - if (GUI.TextField(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 - 30, 150, 40), ref username, basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White), Manager.textAlign.centerCenter, "Username")) { new Thread(IdentifiacateHost).Start(); } - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 20, 150, 40), buttonsSprites[0], "Validate", basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White))) { new Thread(IdentifiacateHost).Start(); } - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 75, ScreenHeight / 2 + 70, 150, 40), buttonsSprites[0], "Back", basicFont, new MyMonoGame.Colors(Color.LightGray, Color.White))) - { - GUI.ResetFocus(); - new Thread(() => - { - while (acceleratorX > 1) - { - Thread.Sleep(20); - acceleratorX -= 0.1d; - } - gameStatus = GameStatus.Home; - username = null; - }).Start(); - } - } - } - break; - - case GameStatus.Game: - DrawBackground(0); - DrawBackground(1); - GUI.Texture(new Rectangle(0, 0, ScreenWidth, 30), nullSprite, new MyMonoGame.Colors(new Color(0.1f, 0.1f, 0.1f))); - if (GUI.Button(new Rectangle(5, 5, 50, 20), (showChat ? "Hide" : "Show") + " chat", smallFont, new MyMonoGame.Colors(Color.White, Color.LightGray, Color.Gray))) { GUI.ResetFocus(); showChat = !showChat; } - if (GUI.Button(new Rectangle(65, 5, 50, 20), (showParty ? "Leave" : "Join") + " party", smallFont, new MyMonoGame.Colors(Color.White, Color.LightGray, Color.Gray))) { new Thread(PartyClick).Start(); } - - if (showChat) - { - GUI.Box(new Rectangle(0, 30, 310, 310), buttonsSprites[0]); - //TODO if (GUI.TextField(new Rectangle(5, 35, 305, 20), ref chatInput, basicFont, null, Manager.textAlign.centerLeft, "Enter message")) { if (chatInput != null) { ChatAdd(chatInput); client.SendRequest(chatInput); chatInput = null; } } - GUI.Label(new Rectangle(5, 60, 305, 245), chatText, smallFont, null, Manager.textAlign.topLeft, true); - } - - if (showLoading) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), buttonsSprites[0]); - GUI.Label(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 50), "Loading", basicFont); - } - else - { - if (showOKMessage) - { - GUI.Box(new Rectangle(ScreenWidth / 2 - 150, ScreenHeight / 4 + 50, 300, 150), buttonsSprites[0]); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 60), messageTitle, basicFont, null, Manager.textAlign.bottomCenter); - GUI.Label(new MyMonoGame.Vector(ScreenWidth / 2, ScreenHeight / 4 + 100), messageText, smallFont, null, Manager.textAlign.bottomCenter); - if (GUI.Button(new Rectangle(ScreenWidth / 2 - 140, ScreenHeight / 4 + 150, 280, 40), buttonsSprites[0], "Ok", basicFont)) { GUI.ResetFocus(); showOKMessage = false; } - } - } - break; - } - - Color ActiveColor = IsActive ? Color.Green : Color.Red; - GUI.Label(new MyMonoGame.Vector(10, ScreenHeight - 20), (1 / (float)gameTime.ElapsedGameTime.TotalSeconds).ToString(), smallFont, new MyMonoGame.Colors(ActiveColor)); - spriteBatch.Draw(pointerSprites[0], new Rectangle(Mouse.GetState().X - 10, Mouse.GetState().Y - 10, 20, 20), Color.Red); - - spriteBatch.End(); - - base.Draw(gameTime); - } - - private void ValidateHost() - { - showLoading = true; - if (username == null) { username = ""; } - string Host = client.ValidateHost(username); - if (Host == null) - { - messageTitle = "Error"; - messageText = string.Empty; - //TODO foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } - showOKMessage = true; - //TODO client.Output.Clear(); - client.ResetHost(); ; - } - else - { - messageTitle = "Use " + Host + "?"; - showYNMessage = true; - } - showLoading = false; - } - - private void ConnectHost() - { - showLoading = true; - if (client.ConnectHost()) - { - gameStatus = GameStatus.Indentification; - } - else - { - messageTitle = "Error"; - messageText = string.Empty; - //TODO foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } - showOKMessage = true; - //TODO client.Output.Clear(); - client.ResetHost(); - } - showLoading = false; - } - - private void IdentifiacateHost() - { - showLoading = true; - if (username != null) - { - if (username.Length > 3) - { - //TODO client.Output.Clear(); - //TODO client.SendRequest("/connect " + username); - /*int wait = 0; - while (wait < 20) - { - if (client.Output.Count > 0) - { - wait = 20; - } - else - { - wait++; - Thread.Sleep(200); - } - } - if (client.Output.Count > 0) - { - if (client.Output.Contains("Identifiaction succes")) - { - gameStatus = GameStatus.Game; - } - else - { - messageTitle = "Error"; - messageText = string.Empty; - foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } - showOKMessage = true; - showLoading = false; - client.Output.Clear(); - } - } - else - { - messageTitle = "Timeout"; - messageText = ""; - showOKMessage = true; - showLoading = false; - client.Output.Clear(); - }*/ - } - } - showLoading = false; - } - - private void PartyClick() - { - showLoading = true; - GUI.ResetFocus(); - //TODO - /* - if (showParty) - { - client.SendRequest("/party leave"); - showParty = false; - showLoading = false; - } - else - { - client.Output.Clear(); - client.SendRequest("/party list"); - int wait = 0; - while (wait < 20) - { - if (client.Output.Count > 0) - { - wait = 20; - } - else - { - wait++; - Thread.Sleep(200); - } - } - if (client.Output.Count > 0) - { - Thread.Sleep(500); - if (client.Output.Count > 1) - { - messageTitle = "Party"; - messageText = string.Empty; - foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } - showOKMessage = true; - client.Output.Clear(); - } - else - { - messageTitle = "Any party"; - messageText = string.Empty; - foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } - showOKMessage = true; - client.Output.Clear(); - } - } - else - { - messageTitle = "Timeout"; - messageText = ""; - showOKMessage = true; - showLoading = false; - client.Output.Clear(); - } - }*/ - } - - private void ChatAdd(string text) - { - chatText += ((chatText != string.Empty ? Environment.NewLine : "") + text); - } - - private void DrawBackground(int index) - { - if (backgroundX[index] > backSprites[index].Width) { backgroundX[index] = 0; } - if (backgroundY[index] > backSprites[index].Height) { backgroundY[index] = 0; } - if (backgroundX[index] < 0) { backgroundX[index] = backSprites[index].Width; } - if (backgroundY[index] < 0) { backgroundY[index] = backSprites[index].Height; } - for (int X = -1; X < ScreenWidth / backSprites[index].Width + 1; X++) - { - for (int Y = -1; Y < ScreenHeight / backSprites[index].Height + 1; Y++) - { - GUI.Texture(new Rectangle(X * backSprites[index].Width + (int)backgroundX[index], Y * backSprites[index].Height + (int)backgroundY[index], backSprites[index].Width, backSprites[index].Height), backSprites[index], new MyMonoGame.Colors(Color.White)); - } - } - } - } -} \ No newline at end of file diff --git a/Galactic Colors Control GUI/Program.cs b/Galactic Colors Control GUI/Program.cs index 2a68843..6078cfc 100644 --- a/Galactic Colors Control GUI/Program.cs +++ b/Galactic Colors Control GUI/Program.cs @@ -13,7 +13,8 @@ namespace Galactic_Colors_Control_GUI [STAThread] private static void Main() { - using (var game = new Game1()) + //TODO add debug and more + using (var game = new Game()) game.Run(); } } diff --git a/Galactic Colors Control GUI/States/ConnectState.cs b/Galactic Colors Control GUI/States/ConnectState.cs new file mode 100644 index 0000000..06f5478 --- /dev/null +++ b/Galactic Colors Control GUI/States/ConnectState.cs @@ -0,0 +1,150 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MyMonoGame.GUI; +using System.Threading; +using System; + +namespace Galactic_Colors_Control_GUI.States +{ + public struct Message + { + public string title; + public string text; + public Message(string Title, string Text = "") + { + title = Title; + text = Text; + } + } + + public class ConnectState : State + { + private bool locked = false; + private bool showLoading = false; + private bool showOKMessage = false; + private bool showYNMessage = false; + + private Message message; + private string adress; + + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4), "Galactic Colors Control", Game.singleton.fonts.title, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); + if (showLoading) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), "Loading", Game.singleton.fonts.basic); + } + else + { + if (showOKMessage) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 150), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 60), message.title, Game.singleton.fonts.basic , null, Manager.textAlign.bottomCenter); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 100), message.text, Game.singleton.fonts.small, null, Manager.textAlign.bottomCenter); + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 140, Game.singleton.ScreenHeight / 4 + 150, 280, 40), Game.singleton.buttonsSprites[0], "Ok", Game.singleton.fonts.basic)) { locked = false; Game.singleton.GUI.ResetFocus(); showOKMessage = false; } + } + else + { + if (showYNMessage) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 100), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 60), message.title, Game.singleton.fonts.basic, null, Manager.textAlign.bottomCenter); + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 140, Game.singleton.ScreenHeight / 4 + 100, 135, 40), Game.singleton.buttonsSprites[0], "Yes", Game.singleton.fonts.basic)) + { + if (!locked) + { + locked = true; + showYNMessage = false; + Game.singleton.GUI.ResetFocus(); + new Thread(ConnectHost).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 + 5, Game.singleton.ScreenHeight / 4 + 100, 135, 40), Game.singleton.buttonsSprites[0], "No", Game.singleton.fonts.basic)) + { + showYNMessage = false; + Game.singleton.client.ResetHost(); + Game.singleton.GUI.ResetFocus(); + } + } + else + { + if (Game.singleton.GUI.TextField(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 - 30, 150, 40), ref adress, Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White), Manager.textAlign.centerCenter, "Server address")) { + if (!locked) + { + locked = true; + new Thread(ValidateHost).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 20, 150, 40), Game.singleton.buttonsSprites[0], "Connect", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White))) + { + if (!locked) + { + locked = true; + new Thread(ValidateHost).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 70, 150, 40), Game.singleton.buttonsSprites[0], "Back", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White))) + { + if (!locked) + { + locked = true; + Game.singleton.GUI.ResetFocus(); + new Thread(() => + { + while (!Utilities.DoubleTo(ref Game.singleton.background.speedX, 1, 0.1)) { Thread.Sleep(20); } + Game.singleton.gameState = new MainMenuState(); + }).Start(); + } + } + } + } + } + } + + public override void Update() + { + Game.singleton.background.Update(); + } + + private void ValidateHost() + { + showLoading = true; + if (adress == null) { adress = ""; } + string Host = Game.singleton.client.ValidateHost(adress); + if (Host[0] == '*') + { + Host = Host.Substring(1); + message.title = "Error"; + message.text = Host; + showOKMessage = true; + Game.singleton.client.ResetHost(); ; + } + else + { + message.title = "Use " + Host + "?"; + showYNMessage = true; + } + showLoading = false; + locked = false; + } + + private void ConnectHost() + { + showLoading = true; + if (Game.singleton.client.ConnectHost()) + { + Game.singleton.gameState = new IndentificationState(); + } + else + { + message.title = "Error"; + message.text = string.Empty; + showOKMessage = true; + Game.singleton.client.ResetHost(); + } + showLoading = false; + } + } +} \ No newline at end of file diff --git a/Galactic Colors Control GUI/States/GameState.cs b/Galactic Colors Control GUI/States/GameState.cs new file mode 100644 index 0000000..e0aab0c --- /dev/null +++ b/Galactic Colors Control GUI/States/GameState.cs @@ -0,0 +1,169 @@ +//TODO add party support +using Galactic_Colors_Control_Common; +using Galactic_Colors_Control_Common.Protocol; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MyMonoGame.GUI; +using System.Threading; +using System; +using Microsoft.Xna.Framework.Input; + +namespace Galactic_Colors_Control_GUI.States +{ + public class GameState : State + { + private string username; + private bool showChat = false; + private string chatText; + private string chatInput; + + private bool showLoading = false; + private bool showOKMessage = false; + private Message message; + + public GameState(string Username) + { + Game.singleton.client.OnEvent += new EventHandler(OnEvent); //Set OnEvent function + username = Username; + } + + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + Game.singleton.GUI.Texture(new Rectangle(0, 0, Game.singleton.ScreenWidth, 30), Game.nullSprite, new MyMonoGame.Colors(new Color(0.1f, 0.1f, 0.1f))); + if (Game.singleton.GUI.Button(new Rectangle(5, 5, 50, 20), (showChat ? "Hide" : "Show") + " chat", Game.singleton.fonts.small, new MyMonoGame.Colors(Color.White, Color.LightGray, Color.Gray))) { Game.singleton.GUI.ResetFocus(); showChat = !showChat; } + //if (Game.singleton.GUI.Button(new Rectangle(65, 5, 50, 20), (showParty ? "Leave" : "Join") + " party", smallFont, new MyMonoGame.Colors(Color.White, Color.LightGray, Color.Gray))) { new Thread(PartyClick).Start(); } + + if (showChat) + { + Game.singleton.GUI.Box(new Rectangle(0, 30, 310, 310), Game.singleton.buttonsSprites[0]); + if (Game.singleton.GUI.TextField(new Rectangle(5, 35, 305, 20), ref chatInput, Game.singleton.fonts.basic, null, Manager.textAlign.centerLeft, "Enter message")) { if (chatInput != null) { new Thread(ChatEnter).Start(); } } + Game.singleton.GUI.Label(new Rectangle(5, 60, 305, 245), chatText, Game.singleton.fonts.small, null, Manager.textAlign.topLeft, true); + } + + if (showLoading) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), "Loading", Game.singleton.fonts.basic); + } + else + { + if (showOKMessage) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 150), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 60), message.title, Game.singleton.fonts.basic, null, Manager.textAlign.bottomCenter); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 100), message.text, Game.singleton.fonts.small, null, Manager.textAlign.bottomCenter); + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 140, Game.singleton.ScreenHeight / 4 + 150, 280, 40), Game.singleton.buttonsSprites[0], "Ok", Game.singleton.fonts.basic)) { Game.singleton.GUI.ResetFocus(); showOKMessage = false; Game.singleton.client.ExitHost(); Game.singleton.gameState = new MainMenuState(); } + } + } + } + + public override void Update() + { + if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { Game.singleton.GUI.ResetFocus(); Game.singleton.client.ExitHost(); Game.singleton.gameState = new MainMenuState(); } + } + + private void ChatEnter() + { + string request = chatInput; + chatInput = null; + ResultData res = Game.singleton.client.Request(new string[2] { "say", request }); + if(res.type != ResultTypes.OK) + { + //TODO Mutlilang + ChatText("Error :" + Common.ArrayToString(res.result)); + } + } + + private void OnEvent(object sender, EventArgs e) + { + EventData eve = ((EventDataArgs)e).Data; + switch (eve.type) + { + case EventTypes.ChatMessage: + ChatText(Common.ArrayToString(eve.data)); + break; + + case EventTypes.ServerJoin: + ChatText(Common.ArrayToString(eve.data) + "join the server"); + break; + + case EventTypes.ServerLeave: + ChatText(Common.ArrayToString(eve.data) + "leave the server"); + break; + + case EventTypes.ServerKick: + message.title = "Kick from server"; + message.text = Common.ArrayToString(eve.data); + showOKMessage = true; + break; + } + } + + public void ChatText(string text) + { + chatText += (text + Environment.NewLine); + } + + /* + private void PartyClick() + { + showLoading = true; + GUI.ResetFocus(); + //TODO + /* + if (showParty) + { + client.SendRequest("/party leave"); + showParty = false; + showLoading = false; + } + else + { + client.Output.Clear(); + client.SendRequest("/party list"); + int wait = 0; + while (wait < 20) + { + if (client.Output.Count > 0) + { + wait = 20; + } + else + { + wait++; + Thread.Sleep(200); + } + } + if (client.Output.Count > 0) + { + Thread.Sleep(500); + if (client.Output.Count > 1) + { + messageTitle = "Party"; + messageText = string.Empty; + foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } + showOKMessage = true; + client.Output.Clear(); + } + else + { + messageTitle = "Any party"; + messageText = string.Empty; + foreach (string line in client.Output.ToArray()) { messageText += (line + Environment.NewLine); } + showOKMessage = true; + client.Output.Clear(); + } + } + else + { + messageTitle = "Timeout"; + messageText = ""; + showOKMessage = true; + showLoading = false; + client.Output.Clear(); + } + } + }*/ + } +} \ No newline at end of file diff --git a/Galactic Colors Control GUI/States/IndentificationState.cs b/Galactic Colors Control GUI/States/IndentificationState.cs new file mode 100644 index 0000000..324b80c --- /dev/null +++ b/Galactic Colors Control GUI/States/IndentificationState.cs @@ -0,0 +1,101 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MyMonoGame.GUI; +using System.Threading; +using System; +using Galactic_Colors_Control_Common.Protocol; +using Galactic_Colors_Control_Common; + +namespace Galactic_Colors_Control_GUI.States +{ + public class IndentificationState : State + { + private string username; + private Message message; + + private bool locked = false; + private bool showLoading = false; + private bool showOKMessage = false; + + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4), "Galactic Colors Control", Game.singleton.fonts.title , new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); + if (showLoading) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 50), "Loading", Game.singleton.fonts.basic); + } + else + { + if (showOKMessage) + { + Game.singleton.GUI.Box(new Rectangle(Game.singleton.ScreenWidth / 2 - 150, Game.singleton.ScreenHeight / 4 + 50, 300, 150), Game.singleton.buttonsSprites[0]); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 60), message.title, Game.singleton.fonts.basic, null, Manager.textAlign.bottomCenter); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 100), message.text, Game.singleton.fonts.small, null, Manager.textAlign.bottomCenter); + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 140, Game.singleton.ScreenHeight / 4 + 150, 280, 40), Game.singleton.buttonsSprites[0], "Ok", Game.singleton.fonts.basic)){ Game.singleton.GUI.ResetFocus(); showOKMessage = false; } + } + else + { + if (Game.singleton.GUI.TextField(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 - 30, 150, 40), ref username, Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White), Manager.textAlign.centerCenter, "Username")) { + if (!locked) + { + locked = true; + new Thread(IdentifiacateHost).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 20, 150, 40), Game.singleton.buttonsSprites[0], "Validate", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White))) { + if (!locked) + { + locked = true; + new Thread(IdentifiacateHost).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 70, 150, 40), Game.singleton.buttonsSprites[0], "Back", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.LightGray, Color.White))) + { + if (!locked) + { + locked = true; + Game.singleton.GUI.ResetFocus(); + new Thread(() => + { + while (!Utilities.DoubleTo(ref Game.singleton.background.speedX, 1, 0.1)) { Thread.Sleep(20); } + Game.singleton.gameState = new MainMenuState(); + }).Start(); + } + } + } + } + } + + private void IdentifiacateHost() + { + showLoading = true; + if (username != null) + { + if (username.Length > 3) + { + ResultData res = Game.singleton.client.Request(new string[2] { "connect", username }); + if (res.type == ResultTypes.OK) + { + Game.singleton.gameState = new GameState(username); + } + else + { + message.title = "Error"; + message.text = Common.ArrayToString(res.result); + showOKMessage = true; + } + } + } + showLoading = false; + locked = false; + } + + + public override void Update() + { + Game.singleton.background.Update(); + } + } +} \ No newline at end of file diff --git a/Galactic Colors Control GUI/States/MainMenuState.cs b/Galactic Colors Control GUI/States/MainMenuState.cs new file mode 100644 index 0000000..4c190fc --- /dev/null +++ b/Galactic Colors Control GUI/States/MainMenuState.cs @@ -0,0 +1,61 @@ +using System; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using MyMonoGame.GUI; +using System.Reflection; +using Galactic_Colors_Control; +using System.Threading; + +namespace Galactic_Colors_Control_GUI.States +{ + public class MainMenuState : State + { + public static Texture2D logoSprite; + private bool locked = false; + + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4), "Galactic Colors Control", Game.singleton.fonts.title, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 4 + 40), "GUI " + Assembly.GetEntryAssembly().GetName().Version.ToString(), Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth - 64, Game.singleton.ScreenHeight - 74, 64, 64), logoSprite)) { System.Diagnostics.Process.Start("https://sheychen.shost.ca/"); } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 - 30, 150, 40), Game.singleton.buttonsSprites[0], "Play", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.White, Color.Green))) + { + if (!locked) + { + locked = true; + Game.singleton.GUI.ResetFocus(); + Game.singleton.client = new Client(); + new Thread(() => + { + while (!Utilities.DoubleTo(ref Game.singleton.background.speedX, 5, 0.1)) { Thread.Sleep(20); } + Game.singleton.gameState = new ConnectState(); + }).Start(); + } + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 20, 150, 40), Game.singleton.buttonsSprites[0], "Options", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.White, Color.Blue))) { + Game.singleton.GUI.ResetFocus(); + Game.singleton.gameState = new OptionsState(); + } + if (Game.singleton.GUI.Button(new Rectangle(Game.singleton.ScreenWidth / 2 - 75, Game.singleton.ScreenHeight / 2 + 70, 150, 40), Game.singleton.buttonsSprites[0], "Exit", Game.singleton.fonts.basic, new MyMonoGame.Colors(Color.White, Color.Red))) + { + if (!locked) + { + locked = true; + Game.singleton.GUI.ResetFocus(); + Game.singleton.gameState = new TitleState(); + new Thread(() => + { + while (!Utilities.DoubleTo(ref Game.singleton.background.speedX, 0, 0.1)) { Thread.Sleep(50); } + Game.singleton.Exit(); + }).Start(); + } + } + } + + public override void Update() + { + Game.singleton.background.Update(); + } + } +} diff --git a/Galactic Colors Control GUI/States/OptionsState.cs b/Galactic Colors Control GUI/States/OptionsState.cs new file mode 100644 index 0000000..e0b90b5 --- /dev/null +++ b/Galactic Colors Control GUI/States/OptionsState.cs @@ -0,0 +1,17 @@ +using Microsoft.Xna.Framework.Graphics; + +namespace Galactic_Colors_Control_GUI.States +{ + public class OptionsState : State + { + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + } + + public override void Update() + { + Game.singleton.background.Update(); + } + } +} \ No newline at end of file diff --git a/Galactic Colors Control GUI/States/State.cs b/Galactic Colors Control GUI/States/State.cs new file mode 100644 index 0000000..294cd2f --- /dev/null +++ b/Galactic Colors Control GUI/States/State.cs @@ -0,0 +1,20 @@ +using Microsoft.Xna.Framework.Graphics; + +namespace Galactic_Colors_Control_GUI.States +{ + /// + /// Game Menu Main Class + /// + public class State + { + public virtual void Draw(SpriteBatch spritebatch) + { + + } + + public virtual void Update() + { + + } + } +} diff --git a/Galactic Colors Control GUI/States/TitleState.cs b/Galactic Colors Control GUI/States/TitleState.cs new file mode 100644 index 0000000..67b8e40 --- /dev/null +++ b/Galactic Colors Control GUI/States/TitleState.cs @@ -0,0 +1,41 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MyMonoGame.GUI; +using System; + +namespace Galactic_Colors_Control_GUI.States +{ + /// + /// Only title in screen (and state change) + /// + public class TitleState : State + { + private DateTime _changeDate; + private State _target; + + public TitleState() + { + _target = null; + } + + public TitleState(State target, TimeSpan time) + { + _target = target; + _changeDate = DateTime.Now.Add(time); + } + + public override void Draw(SpriteBatch spritebatch) + { + Game.singleton.background.Draw(spritebatch); + Game.singleton.GUI.Label(new MyMonoGame.Vector(Game.singleton.ScreenWidth / 2, Game.singleton.ScreenHeight / 2), "Galactic Colors Control", Game.singleton.fonts.title, new MyMonoGame.Colors(Color.White), Manager.textAlign.centerCenter); + } + + public override void Update() + { + if (_target != null) + { + if (DateTime.Now > _changeDate) { Game.singleton.gameState = _target; } + } + } + } +} diff --git a/Galactic Colors Control GUI/Utilities.cs b/Galactic Colors Control GUI/Utilities.cs index 40ae3b0..9dca3de 100644 --- a/Galactic Colors Control GUI/Utilities.cs +++ b/Galactic Colors Control GUI/Utilities.cs @@ -1,9 +1,17 @@ using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Graphics; +using System; using System.IO; namespace Galactic_Colors_Control_GUI { + public struct Fonts + { + public SpriteFont small; //Text fonts + public SpriteFont basic; + public SpriteFont title; + } + internal static class Utilities { /// @@ -37,5 +45,18 @@ namespace Galactic_Colors_Control_GUI } } } + + public static bool DoubleTo(ref double value, double target, double speed) + { + speed = Math.Abs(speed); + bool up = value < target; + value += (up ? 1 : -1) * speed; + if ((up && value >= target) || (!up && value <= target)) + { + value = target; + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Galactic Colors Control.sln b/Galactic Colors Control.sln index 89b466b..65d7181 100644 --- a/Galactic Colors Control.sln +++ b/Galactic Colors Control.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Galactic Colors Control Server", "Galactic Colors Control Server\Galactic Colors Control Server.csproj", "{9E3AF4E1-88C6-4139-A15C-B4F633E80612}" ProjectSection(ProjectDependencies) = postProject @@ -15,6 +15,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Galactic Colors Control", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Galactic Colors Control GUI", "Galactic Colors Control GUI\Galactic Colors Control GUI.csproj", "{F6CDDF1B-5A57-4A84-B57C-749FFF9AE031}" ProjectSection(ProjectDependencies) = postProject + {022A69CE-22B5-4934-BE9F-A9C6DF9557ED} = {022A69CE-22B5-4934-BE9F-A9C6DF9557ED} {93582CE8-C8C8-4E19-908B-D671ECBADE25} = {93582CE8-C8C8-4E19-908B-D671ECBADE25} EndProjectSection EndProject diff --git a/Galactic Colors Control/Program.cs b/Galactic Colors Control/Program.cs index 099e81a..5d0aed5 100644 --- a/Galactic Colors Control/Program.cs +++ b/Galactic Colors Control/Program.cs @@ -208,16 +208,16 @@ namespace Galactic_Colors_Control /// Send success private bool Send(Data packet) { - try - { + //try + //{ ClientSocket.Send(packet.ToBytes()); return true; - } + /*} catch //Can't contact server { _errorCount++; } - return false; + return false;*/ } ///