X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=Project06%2FCS%203505%20Project%2006%2FCS%203505%20Project%2006%2FLobbyGUI.cs;h=bc73eef1053e6bb51ccd5b3a3c8c717da32cd4cc;hb=5fe6f523ee35dd412ef0dd9102839b666733ed4b;hp=3c157dc944b9042178446e385719cdcfb72451b7;hpb=fc7104b36d66d536d38ba38a4afae588c437f6c6;p=chaz%2Fcarfire diff --git a/Project06/CS 3505 Project 06/CS 3505 Project 06/LobbyGUI.cs b/Project06/CS 3505 Project 06/CS 3505 Project 06/LobbyGUI.cs index 3c157dc..bc73eef 100644 --- a/Project06/CS 3505 Project 06/CS 3505 Project 06/LobbyGUI.cs +++ b/Project06/CS 3505 Project 06/CS 3505 Project 06/LobbyGUI.cs @@ -61,6 +61,10 @@ namespace CS_3505_Project_06 int selectedSessionIndex; + bool chatActive; + String chatMessage; + Queue currentChat; + private enum lobbyState { Welcome, @@ -78,6 +82,9 @@ namespace CS_3505_Project_06 currentState = lobbyState.Welcome; selectedSessionIndex = 0; ready = false; + chatActive = false; + chatMessage = ""; + currentChat = new Queue(); } public void LoadContent(ContentManager contentManager, GraphicsDeviceManager graphics) @@ -148,21 +155,29 @@ namespace CS_3505_Project_06 void FoundSessions(AvailableNetworkSessionCollection sessions, NetworkGame networkGame) { availableSessions = sessions; + } - if (availableSessions != null && availableSessions.Count > 0) - { - networkGame.JoinSession(availableSessions[0], JoinedSession); - currentState = lobbyState.JoiningGame; + // TODO: New method. + void AsyncCallbackFailed(Exception exception, NetworkGame networkGame) + { + currentState = lobbyState.Welcome; + Console.WriteLine("Exception as thrown during async call: " + exception.Message); + } - availableSessions.Dispose(); - availableSessions = null; - } - else + private void UpdateChat(GameTime gameTime, NetworkGame networkGame) + { + List chts = networkGame.ReceiveChats(); + for (int x = 0; x < chts.Count(); x++) + currentChat.Enqueue(chts[x]); + //if number of chat messages has reached max remove older messages as new ones are added + if (currentChat.Count() > 8) { - // TODO: This should do something more than just throw the player back to the welcome screen. - currentState = lobbyState.Welcome; - Console.WriteLine("No sessions to join!"); + for (int x = 0; x < chts.Count(); x++) + { + currentChat.Dequeue(); + } } + } public long Update(GameTime gameTime, NetworkGame networkGame) @@ -210,6 +225,7 @@ namespace CS_3505_Project_06 if (currentKeyboardState.IsKeyDown(Keys.Y) && previousKeyboardState.IsKeyUp(Keys.Y)) { currentState = lobbyState.JoiningGame; + networkGame.ErrorDelegate = AsyncCallbackFailed; networkGame.CreateSession(JoinedSession); } break; @@ -220,51 +236,126 @@ namespace CS_3505_Project_06 currentState = lobbyState.Welcome; ready = false; } + availableSessions = null; + networkGame.ErrorDelegate = AsyncCallbackFailed; networkGame.FindSessions(FoundSessions); currentState = lobbyState.FindingGames; break; - case lobbyState.Connected: + case lobbyState.FindingGames: if (currentKeyboardState.IsKeyDown(Keys.X) && previousKeyboardState.IsKeyUp(Keys.X)) { + currentState = lobbyState.Welcome; ready = false; - if (networkGame.HasActiveSession) + } + if (availableSessions != null && availableSessions.Count == 0) + currentState = lobbyState.FindGame; + else if (availableSessions != null && availableSessions.Count > 0) + { + if (currentKeyboardState.IsKeyDown(Keys.D1) && previousKeyboardState.IsKeyUp(Keys.D1)) { - players = null; - networkGame.LeaveSession(); + networkGame.JoinSession(availableSessions[0], JoinedSession); + currentState = lobbyState.JoiningGame; + + availableSessions.Dispose(); + availableSessions = null; + } + if (currentKeyboardState.IsKeyDown(Keys.D2) && previousKeyboardState.IsKeyUp(Keys.D2)) + { + networkGame.JoinSession(availableSessions[0], JoinedSession); + currentState = lobbyState.JoiningGame; + + availableSessions.Dispose(); + availableSessions = null; } - currentState = lobbyState.Welcome; } - if (currentKeyboardState.IsKeyDown(Keys.R) && previousKeyboardState.IsKeyUp(Keys.R)) - networkGame.LocalGamer.IsReady = true; - if (networkGame.HasActiveSession) + break; + + case lobbyState.Connected: + if (chatActive) //If chat is activated by pressing T all inputs go to chat. Enter finishes chat esc returns { - localPlayer = networkGame.LocalGamer; - players = networkGame.NetworkGamers; - if (players != null) + if (currentKeyboardState.IsKeyDown(Keys.Escape) && previousKeyboardState.IsKeyUp(Keys.Escape)) { - allReady = true; - foreach (NetworkGamer p in players) - if (p.IsReady == false) - { - allReady = false; - break; - } + chatActive = false; + break; + } + if (currentKeyboardState.IsKeyDown(Keys.Enter) && previousKeyboardState.IsKeyUp(Keys.Enter)) + { + networkGame.SendChat(chatMessage); + chatActive = false; + break; } + Keys[] k = currentKeyboardState.GetPressedKeys(); + Keys[] kp = previousKeyboardState.GetPressedKeys(); + List newKeys = new List(); - //allows host to start the game when all players are ready, change count below to different number for testing with less then 4 players - if(allReady && players.Count == 2 && localPlayer == players[0]) + for (int x = 0; x < k.Count(); x++) //copy new keys into array { - if (currentKeyboardState.IsKeyDown(Keys.B) && previousKeyboardState.IsKeyUp(Keys.B)) + if (!kp.Contains(k[x])) { - networkGame.StartGame(); + newKeys.Add(k[x]); } } + + foreach(Keys ky in newKeys) + { + if(ky.Equals(Keys.Space)) + chatMessage = chatMessage + " "; + else + chatMessage = chatMessage + ky.ToString(); + } + } else - currentState = lobbyState.Welcome; + { + UpdateChat(gameTime, networkGame); + chatMessage = ""; + if (currentKeyboardState.IsKeyDown(Keys.T) && previousKeyboardState.IsKeyUp(Keys.T)) + { + chatActive = true; + } + if (currentKeyboardState.IsKeyDown(Keys.X) && previousKeyboardState.IsKeyUp(Keys.X)) + { + ready = false; + if (networkGame.HasActiveSession) + { + players = null; + networkGame.LeaveSession(); + } + currentState = lobbyState.Welcome; + + } + if (currentKeyboardState.IsKeyDown(Keys.R) && previousKeyboardState.IsKeyUp(Keys.R)) + networkGame.LocalGamer.IsReady = true; + + if (networkGame.HasActiveSession) + { + localPlayer = networkGame.LocalGamer; + players = networkGame.NetworkGamers; + if (players != null) + { + allReady = true; + foreach (NetworkGamer p in players) + if (p.IsReady == false) + { + allReady = false; + break; + } + } + //allows host to start the game when all players are ready, change count below to different number for testing with less then 4 players + if (allReady && players.Count == 2 && localPlayer == players[0]) + { + if (currentKeyboardState.IsKeyDown(Keys.B) && previousKeyboardState.IsKeyUp(Keys.B)) + { + networkGame.ForceStartGame(); + } + } + } + else + currentState = lobbyState.Welcome; + } break; } @@ -328,7 +419,7 @@ namespace CS_3505_Project_06 case lobbyState.Connected: DrawPlayerList(spriteBatch); - + DrawChatInfo(spriteBatch); if(allReady && players.Count == 2 && localPlayer == players[0]) spriteBatch.DrawString(menuFont, "Press B to begin game!", new Vector2(MaxX / 2, MaxY / 2), Color.White, 0f, zero, .7f, SpriteEffects.None, 0.5f); else if(allReady) @@ -356,6 +447,20 @@ namespace CS_3505_Project_06 } } + private void DrawChatInfo(SpriteBatch spriteBatch) + { + if (currentChat.Count > 0) + { + for (int y = 0; y < currentChat.Count; y++) + { + spriteBatch.DrawString(menuFont, currentChat.ElementAt(y).Sender + ": " + currentChat.ElementAt(y).Message + , new Vector2(400, 10 + y*15), Color.Blue, 0f, zero, .6f, SpriteEffects.None, 1f); + } + + } + if(chatActive) + spriteBatch.DrawString(menuFont, chatMessage, new Vector2(400, 10 + 15*(currentChat.Count + 1)), Color.Green, 0f, zero, .6f, SpriteEffects.None, 1f); + } private void DrawPlayerList(SpriteBatch spriteBatch) { @@ -368,10 +473,12 @@ namespace CS_3505_Project_06 spriteBatch.DrawString(menuFont, "Command Options: to mark your self as ready", new Vector2(20, 20), Color.Gray, 0f, zero, .6f, SpriteEffects.None, 1f); spriteBatch.DrawString(menuFont, "type players # to toggle chat", new Vector2(175, 40), Color.Gray, 0f, zero, .6f, SpriteEffects.None, 1f); spriteBatch.DrawString(menuFont, "return to main menu", new Vector2(175, 60), Color.Gray, 0f, zero, .6f, SpriteEffects.None, 1f); + spriteBatch.DrawString(menuFont, "enter chat mode", new Vector2(175, 80), Color.Gray, 0f, zero, .6f, SpriteEffects.None, 1f); spriteBatch.DrawString(menuFont, "R", new Vector2(145, 20), Color.DarkGreen, 0f, zero, .6f, SpriteEffects.None, 1f); spriteBatch.DrawString(menuFont, "#", new Vector2(145, 40), Color.DarkGreen, 0f, zero, .6f, SpriteEffects.None, 1f); spriteBatch.DrawString(menuFont, "X", new Vector2(145, 60), Color.DarkGreen, 0f, zero, .6f, SpriteEffects.None, 1f); - + spriteBatch.DrawString(menuFont, "T", new Vector2(145, 80), Color.DarkGreen, 0f, zero, .6f, SpriteEffects.None, 1f); + //Background squares spriteBatch.Draw(menuItem, topOfList, null, Color.White, 0, zero, scale, SpriteEffects.None, 1f); spriteBatch.Draw(menuItem, new Vector2(topOfList.X, topOfList.Y + 65), null, Color.White, 0, zero, scale, SpriteEffects.None, 1f); @@ -451,4 +558,4 @@ namespace CS_3505_Project_06 } } } -} +} \ No newline at end of file