|
From: <sik...@us...> - 2006-05-25 08:33:16
|
Revision: 65 Author: sik0fewl Date: 2006-05-25 01:33:06 -0700 (Thu, 25 May 2006) ViewCVS: http://svn.sourceforge.net/perceptioncrash/?rev=65&view=rev Log Message: ----------- Keyboard mappings are now read from configuration file Modified Paths: -------------- trunk/perceptioncrash/src/Factory.hpp trunk/perceptioncrash/src/GameManager.cpp trunk/perceptioncrash/src/InputManager.cpp trunk/perceptioncrash/src/KeyboardMouseInputController.cpp Added Paths: ----------- trunk/perceptioncrash/data/config.xml Added: trunk/perceptioncrash/data/config.xml =================================================================== --- trunk/perceptioncrash/data/config.xml (rev 0) +++ trunk/perceptioncrash/data/config.xml 2006-05-25 08:33:06 UTC (rev 65) @@ -0,0 +1,10 @@ +<Configuration> + <InputController type="KeyboardMouse" name="default"> + <!-- Note: these will use strings instead of codes in the future --> + <MapKey from="57" to="select" /> + <MapKey from="1" to="pause"/> + <MapKey from="25" to="back"/> + <MapKey from="208" to="move_down"/> + <MapKey from="88" to="toggle_fps"/> + </InputController> +</Configuration> Modified: trunk/perceptioncrash/src/Factory.hpp =================================================================== --- trunk/perceptioncrash/src/Factory.hpp 2006-05-25 06:40:33 UTC (rev 64) +++ trunk/perceptioncrash/src/Factory.hpp 2006-05-25 08:33:06 UTC (rev 65) @@ -49,7 +49,7 @@ typename CreatorXmlMap::iterator i = creatorsXml.find(node->Attribute("type")); if (i != creatorsXml.end()) - return i->second(); + return i->second(node); else { std::stringstream msg; Modified: trunk/perceptioncrash/src/GameManager.cpp =================================================================== --- trunk/perceptioncrash/src/GameManager.cpp 2006-05-25 06:40:33 UTC (rev 64) +++ trunk/perceptioncrash/src/GameManager.cpp 2006-05-25 08:33:06 UTC (rev 65) @@ -5,9 +5,6 @@ #include "InputManager.hpp" #include "GameState.hpp" -// TODO Temporary! See message below -#include "KeyboardMouseInputController.hpp" - template<> GameManager* Ogre::Singleton<GameManager>::ms_Singleton = 0; GameManager::GameManager() @@ -48,18 +45,6 @@ mInputController = mInputManager->createController("default"); mInputController->addEventListener(this); - // TODO Temporary! This will be configured normally with XML configuration file - KeyboardMouseInputController* kbnm = dynamic_cast<KeyboardMouseInputController*>(mInputController); - if ( kbnm ) - { - kbnm->createKeyboardInputButton("select", Ogre::KC_SPACE); - kbnm->createKeyboardInputButton("pause", Ogre::KC_P); - kbnm->createKeyboardInputButton("back", Ogre::KC_ESCAPE); - kbnm->createKeyboardInputButton("move_down", Ogre::KC_DOWN); - kbnm->createKeyboardInputButton("toggle_fps", Ogre::KC_F12); - } - - mDebugPanelOverlay = Ogre::OverlayManager::getSingleton().getByName("Core/DebugOverlay"); changeState(state); @@ -119,6 +104,7 @@ { // This is all temporary stuff Ogre::ResourceGroupManager* rgm = Ogre::ResourceGroupManager::getSingletonPtr(); + rgm->addResourceLocation("data/", "FileSystem", "General"); rgm->addResourceLocation("data/objects", "FileSystem", "General"); rgm->addResourceLocation("data/images", "FileSystem", "General"); rgm->addResourceLocation("data/overlays", "FileSystem", "General"); @@ -127,7 +113,7 @@ rgm->addResourceLocation("data/materials/programs", "FileSystem", "General"); rgm->addResourceLocation("data/packs/OgreCore.zip", "Zip", "General"); rgm->addResourceLocation("data/maps/ogretestmap.zip", "Zip", "PlayStateResources"); - rgm->addResourceLocation("data/gui", "FileSystem", "General"); + rgm->addResourceLocation("data/gui", "FileSystem", "General"); rgm->addResourceLocation("data/fonts", "FileSystem", "General"); #if 0 Modified: trunk/perceptioncrash/src/InputManager.cpp =================================================================== --- trunk/perceptioncrash/src/InputManager.cpp 2006-05-25 06:40:33 UTC (rev 64) +++ trunk/perceptioncrash/src/InputManager.cpp 2006-05-25 08:33:06 UTC (rev 65) @@ -1,10 +1,12 @@ #include <stdexcept> +#include <Ogre.h> #include <OgreEventProcessor.h> #include <OgrePlatformManager.h> #include "InputManager.hpp" #include "KeyboardMouseInputController.hpp" +#include "Factory.hpp" template<> InputManager* Ogre::Singleton<InputManager>::ms_Singleton = 0; @@ -42,7 +44,15 @@ { if ( mControllers.find(name) == mControllers.end() ) { - return mControllers[name] = new KeyboardMouseInputController(); + TiXmlDocument configFile; + TiXmlElement* configNode; + /// @todo This should load the file using the Ogre resource manager + //configFile.Parse(&(Ogre::ResourceGroupManager::getSingleton().openResource("config.xml")->getAsString()[0])); + configFile.LoadFile("data/config.xml"); + configNode = dynamic_cast<TiXmlElement*>(configFile.RootElement()->FirstChild("InputController")); + assert(configNode != 0); + + return mControllers[name] = Factory<InputController>::factory().create(configNode); } throw std::runtime_error("Controller '" + name + "' already exists"); Modified: trunk/perceptioncrash/src/KeyboardMouseInputController.cpp =================================================================== --- trunk/perceptioncrash/src/KeyboardMouseInputController.cpp 2006-05-25 06:40:33 UTC (rev 64) +++ trunk/perceptioncrash/src/KeyboardMouseInputController.cpp 2006-05-25 08:33:06 UTC (rev 65) @@ -1,17 +1,16 @@ #include <Ogre.h> #include <iostream> +#include <map> #include "KeyboardMouseInputController.hpp" namespace { - RegisterFactory<InputController, KeyboardMouseInputController> KeyboardMouseInputControllerFactory("KeyboardMouseInputController"); + RegisterFactory<InputController, KeyboardMouseInputController> KeyboardMouseInputControllerFactory("KeyboardMouse"); } KeyboardMouseInputController::KeyboardMouseInputController() { - /// @todo this can be implemented with events(current) or unbuffered input. - /// which is better? InputManager* inputManager = InputManager::getSingletonPtr(); inputManager->getEventProcessor()->addKeyListener(this); inputManager->getEventProcessor()->addMouseMotionListener(this); @@ -19,9 +18,35 @@ KeyboardMouseInputController::KeyboardMouseInputController(TiXmlElement* node) { - KeyboardMouseInputController(); + InputManager* inputManager = InputManager::getSingletonPtr(); + inputManager->getEventProcessor()->addKeyListener(this); + inputManager->getEventProcessor()->addMouseMotionListener(this); - // create from xml node + // Make sure we were given the right kind of node + if (static_cast<std::string>(node->Value()) != "InputController" + || static_cast<std::string>(node->Attribute("type")) != "KeyboardMouse") + { + throw std::runtime_error("Invalid XML node. Must be element InputController with type KeyboardMouse."); + } + + for (TiXmlNode* child = node->FirstChild(); child; child = child->NextSibling()) + { + TiXmlElement* mapping = dynamic_cast<TiXmlElement*>(child); + + if (mapping == 0) + continue; + + int from = 0; + Button to; + + /// @todo Could use some error checking. + /// @todo Determine whether to create mouse or keyboard mapping + + mapping->Attribute("from", &from); + to = mapping->Attribute("to"); + + createKeyboardInputButton(to, from); + } } KeyboardMouseInputController::~KeyboardMouseInputController() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |