[Balder-cvs] balder2d/src/menu menu.cpp,1.27,1.28
Status: Beta
Brought to you by:
holomorph
From: Reuben <col...@us...> - 2006-06-13 19:55:34
|
Update of /cvsroot/balder/balder2d/src/menu In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv6414/src/menu Modified Files: menu.cpp Log Message: 13-June-2006 - Reuben updated the "config.xml" with some additional settings for multiplayer mode. New settings include: server port, client port and connection time out (in seconds). - Reuben added new functionality to the NetworkManager class to allow it to actually activate a server or connect a client. - Reuben updated the menu to allow the network connection interface to output connection attempts status to the user. This includes connection failure reasons and connection time-out indication. User can cancel connection attempts in mid-process without the program locking up. Index: menu.cpp =================================================================== RCS file: /cvsroot/balder/balder2d/src/menu/menu.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** menu.cpp 3 Jun 2006 00:07:01 -0000 1.27 --- menu.cpp 13 Jun 2006 19:55:30 -0000 1.28 *************** *** 37,45 **** { //screen = SDL_GetVideoSurface(); ! imageLoader = new gcn::SDLImageLoader(); // The ImageLoader in use is static and must be set to be ! // able to load images ! gcn::Image::setImageLoader(imageLoader); graphics = new gcn::SDLGraphics(); // Set the target for the graphics object to be the screen. --- 37,45 ---- { //screen = SDL_GetVideoSurface(); ! imageLoader = new gcn::SDLImageLoader(); // The ImageLoader in use is static and must be set to be ! // able to load images ! gcn::Image::setImageLoader(imageLoader); graphics = new gcn::SDLGraphics(); // Set the target for the graphics object to be the screen. *************** *** 48,57 **** //graphics->setTarget(screen); input = new gcn::SDLInput(); ! /* * Last but not least it's time to initialize and create the gui * with Guichan stuff. */ ! topContainer = new gcn::Container(); // Set the dimension of the top container to match the screen. topContainer->setDimension(gcn::Rectangle(0, 0, 800, 600)); --- 48,57 ---- //graphics->setTarget(screen); input = new gcn::SDLInput(); ! /* * Last but not least it's time to initialize and create the gui * with Guichan stuff. */ ! topContainer = new gcn::Container(); // Set the dimension of the top container to match the screen. topContainer->setDimension(gcn::Rectangle(0, 0, 800, 600)); *************** *** 60,64 **** gui->setGraphics(graphics); // Set gui to use the SDLInput object ! gui->setInput(input); // Set the top container gui->setTop(topContainer); --- 60,64 ---- gui->setGraphics(graphics); // Set gui to use the SDLInput object ! gui->setInput(input); // Set the top container gui->setTop(topContainer); *************** *** 88,92 **** InitSoundVideoMenu(); InitPlayersMenu(); ! mainMenu->setVisible(true); multiplayerMenu->setVisible(false); --- 88,92 ---- InitSoundVideoMenu(); InitPlayersMenu(); ! mainMenu->setVisible(true); multiplayerMenu->setVisible(false); *************** *** 97,100 **** --- 97,102 ---- soundVideoMenu->setVisible(false); playersMenu->setVisible(false); + + connectionTimeOutTimer = 0; } *************** *** 134,137 **** --- 136,179 ---- // update the screen SDL_UpdateRect(screen,0,0,0,0); + + // Test for established network connection. + // If not, then increment timer down by 0.5 seconds. + // Kill timer if specified time passes by. + if (connectionTimeOutTimer > 0) { + if (network->IsHost()) { + if (ServerActivationStatus()) { + // Kill timer. + connectionTimeOutTimer = 0; + + // Display a message to the user. + networkMenuMessage->setCaption("Host started."); + // Draw the gui + gui->draw(); + // update the screen + SDL_UpdateRect(screen,0,0,0,0); + + // Show host lounge. + multiplayerMenu->setVisible(false); + hostLoungeMenu->setVisible(true); + } + } + else { + if (ClientActivationStatus()) { + // Kill timer. + connectionTimeOutTimer = 0; + + // Display a message to the user. + networkMenuMessage->setCaption("Connected to host."); + // Draw the gui + gui->draw(); + // update the screen + SDL_UpdateRect(screen,0,0,0,0); + + // Show host lounge. + multiplayerMenu->setVisible(false); + joinLoungeMenu->setVisible(true); + } + } + } } Menu::action("saveSettings"); *************** *** 153,178 **** } else if (action == "hostGame"){ ! ConfigManager::SetIntValue("Multiplayer", "host", true); ! if (network->startHost()) { ! multiplayerMenu->setVisible(false); ! hostLoungeMenu->setVisible(true); ! } ! else { ! networkMenuMessage->setCaption("Failed to start host."); ! } ! } else if (action == "joinGame"){ ! ConfigManager::SetServer(addressField->getText().c_str()); ConfigManager::SetIntValue("Multiplayer", "host", false); ! if (network->joinHost()) { ! multiplayerMenu->setVisible(false); ! joinLoungeMenu->setVisible(true); ! } ! else { ! networkMenuMessage->setCaption("Failed to join game."); ! } } else if (action == "quitgame"){ --- 195,231 ---- } else if (action == "hostGame"){ ! // Save settings. ! ConfigManager::SetIntValue("Multiplayer", "host", true); ! // Display a message to the user. ! networkMenuMessage->setCaption("Initializing host."); ! // Draw the gui ! gui->draw(); ! // update the screen ! SDL_UpdateRect(screen,0,0,0,0); ! // Create & Start host. ! networkAttemptMessage = network->startHost(); ! ! // Start connection time out timer. ! connectionTimeOutTimer = network->getConnectionTimeOut(); ! } else if (action == "joinGame"){ ! // Save settings. ! ConfigManager::SetServer(addressField->getText().c_str()); ConfigManager::SetIntValue("Multiplayer", "host", false); ! // Display a message to the user. ! networkMenuMessage->setCaption("Initializing client."); ! // Draw the gui ! gui->draw(); ! // update the screen ! SDL_UpdateRect(screen,0,0,0,0); ! ! // Create connection. ! networkAttemptMessage = network->joinHost(); ! ! // Start connection time out timer. ! connectionTimeOutTimer = network->getConnectionTimeOut(); } else if (action == "quitgame"){ *************** *** 221,224 **** --- 274,278 ---- multiplayerMenu->setVisible(false); optionsMenu->setVisible(false); + networkAttemptMessage = 3; } else if (action == "morePlayers"){ *************** *** 320,324 **** else if (action == "toggleLifeLimit") { int life = lifeLimitValue->getValue()*-1; ! if (0 == life) life = -10; lifeLimitSelector->setMarked (life > 0); lifeLimitValue->setValue(life); --- 374,378 ---- else if (action == "toggleLifeLimit") { int life = lifeLimitValue->getValue()*-1; ! if (0 == life) life = -10; lifeLimitSelector->setMarked (life > 0); lifeLimitValue->setValue(life); *************** *** 354,362 **** } if (bindNextKey) { ! ConfigManager::SetPlayerControl(currentPlayer, actionToBind, Input::GetKeyString(event.key.keysym.sym)); bindNextKey = false; RefreshKeys(); ! } } else if(event.type == SDL_QUIT) --- 408,416 ---- } if (bindNextKey) { ! ConfigManager::SetPlayerControl(currentPlayer, actionToBind, Input::GetKeyString(event.key.keysym.sym)); bindNextKey = false; RefreshKeys(); ! } } else if(event.type == SDL_QUIT) *************** *** 370,374 **** * the Gui. */ ! input->pushInput(event); } } --- 424,428 ---- * the Gui. */ ! input->pushInput(event); } } *************** *** 434,443 **** startButton->addActionListener(this); startButton->setWidth(500); ! multiplayerButton = new gcn::Button("Network Game"); multiplayerButton->setEventId("multiplayerMenu"); multiplayerButton->addActionListener(this); multiplayerButton->setWidth(500); ! optionsButton = new gcn::Button("Options"); optionsButton->setEventId("optionsMenu"); --- 488,497 ---- startButton->addActionListener(this); startButton->setWidth(500); ! multiplayerButton = new gcn::Button("Network Game"); multiplayerButton->setEventId("multiplayerMenu"); multiplayerButton->addActionListener(this); multiplayerButton->setWidth(500); ! optionsButton = new gcn::Button("Options"); optionsButton->setEventId("optionsMenu"); *************** *** 449,457 **** quitButton->setEventId("quitgame"); quitButton->addActionListener(this); ! // Add them to the mainMenu container mainMenu->add(startButton, 0, 0); mainMenu->add(multiplayerButton, 0, 60); ! mainMenu->add(optionsButton, 0, 120); mainMenu->add(quitButton, 0, 180); } --- 503,511 ---- quitButton->setEventId("quitgame"); quitButton->addActionListener(this); ! // Add them to the mainMenu container mainMenu->add(startButton, 0, 0); mainMenu->add(multiplayerButton, 0, 60); ! mainMenu->add(optionsButton, 0, 120); mainMenu->add(quitButton, 0, 180); } *************** *** 600,635 **** optionsMenu->setDimension(gcn::Rectangle(0, 0, 500, 400)); optionsMenu->setPosition(150,200); ! backToMainButton = new gcn::Button("Back"); backToMainButton->setEventId("mainMenu"); backToMainButton->addActionListener(this); ! std::stringstream ss; numPlayers = ConfigManager::GetNumPlayers(); ss << "Number of Players: " << numPlayers; numPlayersLabel = new gcn::Label(ss.str()); ! morePlayersButton = new gcn::Button("+"); morePlayersButton->setEventId("morePlayers"); morePlayersButton->addActionListener(this); morePlayersButton->setHeight(numPlayersLabel->getHeight()/2); ! lessPlayersButton = new gcn::Button("-"); lessPlayersButton->setEventId("lessPlayers"); lessPlayersButton->addActionListener(this); lessPlayersButton->setHeight(numPlayersLabel->getHeight()/2); ! gameSetupButton = new gcn::Button("Game Setup"); gameSetupButton->setEventId("gameSetupMenu"); gameSetupButton->addActionListener(this); ! soundVideoButton = new gcn::Button("Sound and Video"); soundVideoButton->setEventId("soundVideoMenu"); soundVideoButton->addActionListener(this); ! playersButton = new gcn::Button("Player Setup"); playersButton->setEventId("playersMenu"); playersButton->addActionListener(this); ! // add these things to the optionsMenu container optionsMenu->add(backToMainButton, 0, 300); --- 654,689 ---- optionsMenu->setDimension(gcn::Rectangle(0, 0, 500, 400)); optionsMenu->setPosition(150,200); ! backToMainButton = new gcn::Button("Back"); backToMainButton->setEventId("mainMenu"); backToMainButton->addActionListener(this); ! std::stringstream ss; numPlayers = ConfigManager::GetNumPlayers(); ss << "Number of Players: " << numPlayers; numPlayersLabel = new gcn::Label(ss.str()); ! morePlayersButton = new gcn::Button("+"); morePlayersButton->setEventId("morePlayers"); morePlayersButton->addActionListener(this); morePlayersButton->setHeight(numPlayersLabel->getHeight()/2); ! lessPlayersButton = new gcn::Button("-"); lessPlayersButton->setEventId("lessPlayers"); lessPlayersButton->addActionListener(this); lessPlayersButton->setHeight(numPlayersLabel->getHeight()/2); ! gameSetupButton = new gcn::Button("Game Setup"); gameSetupButton->setEventId("gameSetupMenu"); gameSetupButton->addActionListener(this); ! soundVideoButton = new gcn::Button("Sound and Video"); soundVideoButton->setEventId("soundVideoMenu"); soundVideoButton->addActionListener(this); ! playersButton = new gcn::Button("Player Setup"); playersButton->setEventId("playersMenu"); playersButton->addActionListener(this); ! // add these things to the optionsMenu container optionsMenu->add(backToMainButton, 0, 300); *************** *** 648,652 **** gameSetupMenu->setDimension(gcn::Rectangle(0,0,500,400)); gameSetupMenu->setPosition(150,200); ! backFromGameSetupButton = new gcn::Button("Back"); backFromGameSetupButton->setEventId("optionsMenu"); --- 702,706 ---- gameSetupMenu->setDimension(gcn::Rectangle(0,0,500,400)); gameSetupMenu->setPosition(150,200); ! backFromGameSetupButton = new gcn::Button("Back"); backFromGameSetupButton->setEventId("optionsMenu"); *************** *** 675,679 **** timeLimitSelector->setEventId("toggleTimeLimit"); timeLimitSelector->addActionListener(this); ! lifeLimitSelector = new gcn::CheckBox("Limited Lives", life > 0); lifeLimitSelector->setEventId("toggleLifeLimit"); lifeLimitSelector->addActionListener(this); --- 729,733 ---- timeLimitSelector->setEventId("toggleTimeLimit"); timeLimitSelector->addActionListener(this); ! lifeLimitSelector = new gcn::CheckBox("Limited Lives", life > 0); lifeLimitSelector->setEventId("toggleLifeLimit"); lifeLimitSelector->addActionListener(this); *************** *** 706,727 **** soundVideoMenu->setDimension(gcn::Rectangle(0, 0, 500, 400)); soundVideoMenu->setPosition(150,200); ! backFromSoundVideoButton = new gcn::Button("Back"); backFromSoundVideoButton->setEventId("optionsMenu"); backFromSoundVideoButton->addActionListener(this); ! fullScreenCheckbox = new gcn::CheckBox("fullscreen", ConfigManager::GetIntValue("Video", "fullscreen")); fullScreenCheckbox->setEventId("toggleFullscreen"); fullScreenCheckbox->addActionListener(this); ! soundCheckbox = new gcn::CheckBox("sound", ConfigManager::GetIntValue("Sound", "sound")); soundCheckbox->setEventId("toggleSound"); soundCheckbox->addActionListener(this); ! musicCheckbox = new gcn::CheckBox("music", ConfigManager::GetIntValue("Sound", "music")); musicCheckbox->setEventId("toggleMusic"); musicCheckbox->addActionListener(this); ! volumeLabel = new gcn::Label("volume "); volumeSlider = new gcn::Slider(); --- 760,781 ---- soundVideoMenu->setDimension(gcn::Rectangle(0, 0, 500, 400)); soundVideoMenu->setPosition(150,200); ! backFromSoundVideoButton = new gcn::Button("Back"); backFromSoundVideoButton->setEventId("optionsMenu"); backFromSoundVideoButton->addActionListener(this); ! fullScreenCheckbox = new gcn::CheckBox("fullscreen", ConfigManager::GetIntValue("Video", "fullscreen")); fullScreenCheckbox->setEventId("toggleFullscreen"); fullScreenCheckbox->addActionListener(this); ! soundCheckbox = new gcn::CheckBox("sound", ConfigManager::GetIntValue("Sound", "sound")); soundCheckbox->setEventId("toggleSound"); soundCheckbox->addActionListener(this); ! musicCheckbox = new gcn::CheckBox("music", ConfigManager::GetIntValue("Sound", "music")); musicCheckbox->setEventId("toggleMusic"); musicCheckbox->addActionListener(this); ! volumeLabel = new gcn::Label("volume "); volumeSlider = new gcn::Slider(); *************** *** 745,771 **** playersMenu->setDimension(gcn::Rectangle(0, 0, 600, 400)); playersMenu->setPosition(100,200); ! backFromPlayersButton = new gcn::Button("Back"); backFromPlayersButton->setEventId("optionsMenu"); backFromPlayersButton->addActionListener(this); ! currentPlayer = 1; std::stringstream ss; ss << "Player " << currentPlayer; currentPlayerLabel = new gcn::Label(ss.str()); ! nextPlayerButton = new gcn::Button(" > "); nextPlayerButton->setEventId("nextPlayer"); nextPlayerButton->addActionListener(this); ! prevPlayerButton = new gcn::Button(" < "); prevPlayerButton->setEventId("prevPlayer"); prevPlayerButton->addActionListener(this); ! setRotateRightButton = new gcn::Button("Rotate Right: "); setRotateRightButton->setEventId("bindRight"); setRotateRightButton->addActionListener(this); rotateRightLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "right")); ! setRotateLeftButton = new gcn::Button("Rotate Left: "); setRotateLeftButton->setEventId("bindLeft"); --- 799,825 ---- playersMenu->setDimension(gcn::Rectangle(0, 0, 600, 400)); playersMenu->setPosition(100,200); ! backFromPlayersButton = new gcn::Button("Back"); backFromPlayersButton->setEventId("optionsMenu"); backFromPlayersButton->addActionListener(this); ! currentPlayer = 1; std::stringstream ss; ss << "Player " << currentPlayer; currentPlayerLabel = new gcn::Label(ss.str()); ! nextPlayerButton = new gcn::Button(" > "); nextPlayerButton->setEventId("nextPlayer"); nextPlayerButton->addActionListener(this); ! prevPlayerButton = new gcn::Button(" < "); prevPlayerButton->setEventId("prevPlayer"); prevPlayerButton->addActionListener(this); ! setRotateRightButton = new gcn::Button("Rotate Right: "); setRotateRightButton->setEventId("bindRight"); setRotateRightButton->addActionListener(this); rotateRightLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "right")); ! setRotateLeftButton = new gcn::Button("Rotate Left: "); setRotateLeftButton->setEventId("bindLeft"); *************** *** 777,786 **** setStickPushButton->addActionListener(this); stickPushLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "stick")); ! setFireButton = new gcn::Button("Fire: "); setFireButton->setEventId("bindFire"); setFireButton->addActionListener(this); fireLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "fire")); ! // Loads colors from config file to init color sliders. probe_color playerColor = ConfigManager::GetPlayerColor(currentPlayer, 255); --- 831,840 ---- setStickPushButton->addActionListener(this); stickPushLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "stick")); ! setFireButton = new gcn::Button("Fire: "); setFireButton->setEventId("bindFire"); setFireButton->addActionListener(this); fireLabel = new gcn::Label(ConfigManager::GetPlayerControl(currentPlayer, "fire")); ! // Loads colors from config file to init color sliders. probe_color playerColor = ConfigManager::GetPlayerColor(currentPlayer, 255); *************** *** 864,865 **** --- 918,1006 ---- } + + bool Menu::ServerActivationStatus() + { + // verify valid connection. + if (networkAttemptMessage <= 0) { + // Display a message to the user. + std::stringstream tempNetworkMessage; + tempNetworkMessage << "Starting host..." << int(connectionTimeOutTimer) << " seconds."; + networkMenuMessage->setCaption(tempNetworkMessage.str()); + // Draw the gui + gui->draw(); + // update the screen + SDL_UpdateRect(screen,0,0,0,0); + + if (network->IsServerActivated()) { + return true; + } + + // Implement delay. + SDL_Delay(500); + connectionTimeOutTimer -= 0.5; + if (connectionTimeOutTimer > 0) return false; + if (connectionTimeOutTimer <= 0) networkAttemptMessage = 2; + } + + // Display a message to the user. + if (networkAttemptMessage == 1) { + networkMenuMessage->setCaption("Failed to start host."); + } + else if (networkAttemptMessage == 2) { + networkMenuMessage->setCaption("Host timed out. Could not start host."); + } + else if (networkAttemptMessage == 3) { + networkMenuMessage->setCaption("Host activation cancelled."); + } + else if (networkAttemptMessage >= 4) { + networkMenuMessage->setCaption("Failed to activate host."); + } + + connectionTimeOutTimer = 0; + network->Disconnect(); + return false; + } + + bool Menu::ClientActivationStatus() + { + // verify valid connection. + if (networkAttemptMessage <= 0) { + // Display a message to the user. + std::stringstream tempNetworkMessage; + tempNetworkMessage << "Connecting to host..." << int(connectionTimeOutTimer) << " seconds."; + networkMenuMessage->setCaption(tempNetworkMessage.str()); + // Draw the gui + gui->draw(); + // update the screen + SDL_UpdateRect(screen,0,0,0,0); + + // If client is connected then kill timer and show lounge. + if (network->IsClientConnected()) { + return true; + } + + // Implement delay. + SDL_Delay(500); + connectionTimeOutTimer -= 0.5; + if (connectionTimeOutTimer > 0) return false; + if (connectionTimeOutTimer <= 0) networkAttemptMessage = 2; + } + + // Display a message to the user. + if (networkAttemptMessage == 1) { + networkMenuMessage->setCaption("Failed to start client."); + } + else if (networkAttemptMessage == 2) { + networkMenuMessage->setCaption("Connection timed out."); + } + else if (networkAttemptMessage == 3) { + networkMenuMessage->setCaption("Connection attempt cancelled."); + } + else if (networkAttemptMessage >= 4) { + networkMenuMessage->setCaption("Failed to connect to host."); + } + + connectionTimeOutTimer = 0; + network->Disconnect(); + return false; + } |