Changeset 7802 for code/trunk
- Timestamp:
- Dec 25, 2010, 8:51:17 PM (14 years ago)
- Location:
- code/trunk/src/orxonox
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/orxonox/LevelInfo.h
r7652 r7802 40 40 #include <set> 41 41 #include <string> 42 #include "util/StringUtils.h" 42 43 43 44 #include "core/BaseObject.h" … … 73 74 @return Returns the name of the Level. 74 75 */ 75 inline const std::string& getName(void) { return this->name_; } // tolua_export76 inline const std::string& getName(void) const { return this->name_; } // tolua_export 76 77 77 78 /** … … 150 151 @code 151 152 <LevelInfo 152 name = "Levelname" 153 name = "Levelname"lhs->compare(rhs) < 0 153 154 description = "This is just some awesome level." 154 155 tags = "test, awesome" … … 197 198 198 199 }; 200 201 /** 202 @brief 203 Struct that overloads the compare operation between two @ref orxonox::LevelInfoItem "LevelInfoItem" pointers. 204 */ 205 struct LevelInfoCompare 206 { 207 bool operator() (const LevelInfoItem* lhs, const LevelInfoItem* rhs) const 208 { return getLowercase(lhs->getName()).compare(getLowercase(rhs->getName())) < 0; } 209 }; 210 199 211 } // tolua_export 200 212 -
code/trunk/src/orxonox/LevelManager.cc
r7801 r7802 23 23 * Fabian 'x3n' Landau 24 24 * Co-authors: 25 * ...25 * Damian 'Mozork' Frick 26 26 * 27 27 */ … … 39 39 #include "core/Resource.h" 40 40 #include "core/XMLFile.h" 41 #include "Level.h" 41 42 #include "PlayerManager.h" 42 #include "Level.h"43 #include "LevelInfo.h"44 43 45 44 namespace orxonox … … 49 48 ManageScopedSingleton(LevelManager, ScopeID::Root, false); 50 49 50 /** 51 @brief 52 Constructor. Registers the object, sets config values and initializes variables. 53 */ 51 54 LevelManager::LevelManager() 52 55 { … … 61 64 62 65 this->compileAvailableLevelList(); 66 this->nextIndex_ = 0; 67 this->nextLevel_ = this->availableLevels_.begin(); 63 68 } 64 69 … … 67 72 } 68 73 74 /** 75 @brief 76 Set the config values for this object. 77 */ 69 78 void LevelManager::setConfigValues() 70 79 { … … 73 82 } 74 83 84 /** 85 @brief 86 Request activity for the input Level. 87 The Level will be added to the list of Levels whose activity is requested. The list is accessed in a FIFO manner. 88 If the Level is the only Level in the list it will be immediately activated. If not it will be activated as soon as it reaches the front of the list. 89 @param level 90 A pointer to the Level whose activity is requested. 91 */ 75 92 void LevelManager::requestActivity(Level* level) 76 93 { 77 assert( std::find(this->levels_s.begin(), this->levels_s.end(), level)==this->levels_s.end() ); 78 if( std::find(this->levels_s.begin(), this->levels_s.end(), level)!=this->levels_s.end() ) 79 return; // level is already in list 80 this->levels_s.push_back(level); 81 if (this->levels_s.size() == 1) 94 assert( std::find(this->levels_.begin(), this->levels_.end(), level)==this->levels_.end() ); 95 // If the level is already in list. 96 if( std::find(this->levels_.begin(), this->levels_.end(), level)!=this->levels_.end() ) 97 return; 98 // If it isn't insert it at the back. 99 this->levels_.push_back(level); 100 // If it is the only level in the list activate it. 101 if (this->levels_.size() == 1) 82 102 this->activateNextLevel(); 83 103 } 84 104 105 /** 106 @brief 107 Release activity for the input Level. 108 Removes the Level from the list. If the Level was the one currently active, it is deactivated and the next Level in line is activated. 109 @param level 110 A pointer to the Level whose activity is to be released. 111 */ 85 112 void LevelManager::releaseActivity(Level* level) 86 113 { 87 if (this->levels_s.size() > 0) 88 { 89 if (this->levels_s.front() == level) 90 { 114 if (this->levels_.size() > 0) 115 { 116 // If the level is the active level in the front of the list. 117 if (this->levels_.front() == level) 118 { 119 // Deactivate it, remove it from the list and activate the next level in line. 91 120 level->setActive(false); 92 this->levels_ s.pop_front();121 this->levels_.pop_front(); 93 122 this->activateNextLevel(); 94 123 } 95 else 96 { 97 for (std::list<Level*>::iterator it = this->levels_s.begin(); it != this->levels_s.end(); ++it) 98 if ((*it) == level) 99 this->levels_s.erase(it); 100 } 101 } 102 } 103 124 else // Else just remove it from the list. 125 this->levels_.erase(std::find(this->levels_.begin(), this->levels_.end(), level)); 126 } 127 } 128 129 /** 130 @brief 131 Get the currently active Level. 132 @return 133 Returns a pointer to the currently active level or NULL if there currently are no active Levels. 134 */ 104 135 Level* LevelManager::getActiveLevel() 105 136 { 106 if (this->levels_ s.size() > 0)107 return this->levels_ s.front();137 if (this->levels_.size() > 0) 138 return this->levels_.front(); 108 139 else 109 140 return 0; 110 141 } 111 142 143 /** 144 @brief 145 Activate the next Level. 146 */ 112 147 void LevelManager::activateNextLevel() 113 148 { 114 if (this->levels_s.size() > 0) 115 { 116 this->levels_s.front()->setActive(true); 149 if (this->levels_.size() > 0) 150 { 151 // Activate the level that is the first in the list of levels whose activity has been requested. 152 this->levels_.front()->setActive(true); 153 // Make every player enter the newly activated level. 117 154 for (std::map<unsigned int, PlayerInfo*>::const_iterator it = PlayerManager::getInstance().getClients().begin(); it != PlayerManager::getInstance().getClients().end(); ++it) 118 this->levels_s.front()->playerEntered(it->second); 119 } 120 } 121 155 this->levels_.front()->playerEntered(it->second); 156 } 157 } 158 159 /** 160 @brief 161 Set the default Level. 162 @param levelName 163 The filename of the default Level. 164 */ 122 165 void LevelManager::setDefaultLevel(const std::string& levelName) 123 166 { … … 125 168 } 126 169 127 const std::string& LevelManager::getDefaultLevel() const 128 { 129 return defaultLevelName_; 130 } 131 170 /** 171 @brief 172 Get the number of available Levels. 173 Also updates the list of available Levels. 174 @return 175 Returns the number of available Levels. 176 */ 132 177 unsigned int LevelManager::getNumberOfLevels() 133 178 { … … 137 182 } 138 183 139 LevelInfoItem* LevelManager::getAvailableLevelListItem(unsigned int index) const 184 /** 185 @brief 186 Get the LevelInfoItem at the given index in the list of available Levels. 187 The LevelInfoItems are sorted in alphabetical order accoridng to the name of the Level. 188 This method is most efficiently called with consecutive indices (or at least ascending indices). 189 @return 190 Returns a pointer to the LevelInfoItem at the given index. 191 */ 192 LevelInfoItem* LevelManager::getAvailableLevelListItem(unsigned int index) 140 193 { 141 194 if (index >= this->availableLevels_.size()) 142 195 return NULL; 196 197 // If this index directly follows the last we can optimize a lot. 198 if(index == this->nextIndex_) 199 { 200 this->nextIndex_++; 201 std::set<LevelInfoItem*, LevelInfoCompare>::iterator it = this->nextLevel_; 202 this->nextLevel_++; 203 return *it; 204 } 143 205 else 144 206 { 145 std::map<std::string, LevelInfoItem*>::const_iterator it = this->infos_.find(this->availableLevels_[index]); 146 return it->second; 147 } 148 } 149 207 // If this index is bigger than the last, we can optimize a little. 208 if(index > this->nextIndex_) 209 { 210 this->nextIndex_ = 0; 211 this->nextLevel_ = this->availableLevels_.begin(); 212 } 213 while(this->nextIndex_ != index) 214 { 215 this->nextIndex_++; 216 this->nextLevel_++; 217 } 218 this->nextIndex_++; 219 std::set<LevelInfoItem*, LevelInfoCompare>::iterator it = this->nextLevel_; 220 this->nextLevel_++; 221 return *it; 222 } 223 } 224 225 /** 226 @brief 227 Compile the list of available Levels. 228 Iterates over all *.oxw files, loads the LevelInfo objects in them and from that it creates the LevelInfoItems which are inserted in a list. 229 */ 150 230 void LevelManager::compileAvailableLevelList() 151 231 { … … 155 235 for (Ogre::StringVector::const_iterator it = levels->begin(); it != levels->end(); ++it) 156 236 { 157 //TODO: Replace with tag ,237 //TODO: Replace with tag? 158 238 if (it->find("old/") != 0) 159 239 { 160 240 size_t pos = it->find(".oxw"); 161 241 242 // Load the LevelInfo object from the level file. 162 243 bool infoExists = false; 163 // Load the LevelInfo object from the level file.164 244 XMLFile file = XMLFile(*it); 165 245 ClassTreeMask mask = ClassTreeMask(); … … 167 247 mask.include(ClassIdentifier<LevelInfo>::getIdentifier()); 168 248 Loader::load(&file, mask, false); 249 // Iterate over all LevelInfos. 169 250 for(ObjectList<LevelInfo>::iterator item = ObjectList<LevelInfo>::begin(); item != ObjectList<LevelInfo>::end(); ++item) 170 251 { 171 252 LevelInfoItem* info = item->copy(); 172 if(info->getXMLFilename() == *it) 253 if(info->getXMLFilename() == *it) // If the LevelInfo for this level exists we insert it into the list of available levels. 173 254 { 174 this-> infos_.insert(std::pair<std::string, LevelInfoItem*>(it->substr(0, pos),info));255 this->availableLevels_.insert(info); 175 256 infoExists = true; 176 257 } 177 258 } 178 259 Loader::unload(&file, mask); 179 if(!infoExists) 180 {181 this->infos_.insert(std::pair<std::string, LevelInfoItem*>(it->substr(0, pos), new LevelInfoItem(it->substr(0, pos), *it)));182 183 184 this->availableLevels_.push_back(it->substr(0, pos)); 185 }186 }187 }188 260 if(!infoExists) // If the LevelInfo for this level doesn't exist, we create a new one and insert it into the list of available levels. 261 this->availableLevels_.insert(new LevelInfoItem(it->substr(0, pos), *it)); 262 } 263 } 264 } 265 266 /** 267 @brief 268 Update the list of available Levels. 269 */ 189 270 void LevelManager::updateAvailableLevelList(void) 190 271 { -
code/trunk/src/orxonox/LevelManager.h
r7648 r7802 23 23 * Fabian 'x3n' Landau 24 24 * Co-authors: 25 * ...25 * Damian 'Mozork' Frick 26 26 * 27 27 */ … … 37 37 #include <string> 38 38 39 #include "LevelInfo.h" 40 39 41 #include "util/Singleton.h" 40 42 #include "core/OrxonoxClass.h" … … 43 45 namespace orxonox 44 46 { 47 48 /** 49 @brief 50 The LevelManager keeps track of @ref orxonox::Level "Levels" whose activity has been requested and serves as an access point to get a list of all available @ref orxonox::Level "Levels" (or rather their respective @ref orxonox::LevelInfoItem "LevelInfoItems"). 51 52 @author 53 Fabian 'x3n' Landau 54 55 @author 56 Damian 'Mozork' Frick 57 */ 45 58 class _OrxonoxExport LevelManager 46 59 // tolua_end … … 52 65 virtual ~LevelManager(); 53 66 54 void setConfigValues(); 67 void setConfigValues(); //!< Set the config values for this object. 55 68 56 void requestActivity(Level* level); 57 void releaseActivity(Level* level); 58 Level* getActiveLevel(); 69 void requestActivity(Level* level); //!< Request activity for the input Level. 70 void releaseActivity(Level* level); //!< Release activity for the input Level. 71 Level* getActiveLevel(); //!< Get the currently active Level. 59 72 60 void setDefaultLevel(const std::string& levelName); //tolua_export 61 const std::string& getDefaultLevel() const; //tolua_export 62 unsigned int getNumberOfLevels(void); //tolua_export 63 LevelInfoItem* getAvailableLevelListItem(unsigned int index) const; //tolua_export 73 // tolua_begin 74 void setDefaultLevel(const std::string& levelName); //!< Set the default Level. 75 /** 76 @brief Get the default level. 77 @return Returns the filename of the default level. 78 */ 79 const std::string& getDefaultLevel() const 80 { return defaultLevelName_; } 81 unsigned int getNumberOfLevels(void); 82 LevelInfoItem* getAvailableLevelListItem(unsigned int index); //!< Get the LevelInfoItem at the given index in the list of available Levels. 64 83 65 static LevelManager& getInstance() { return Singleton<LevelManager>::getInstance(); } // tolua_export 84 /** 85 @brief Get the instance of the LevelManager. 86 @return Returns the instance of the LevelManager. 87 */ 88 static LevelManager& getInstance() 89 { return Singleton<LevelManager>::getInstance(); } 90 // tolua_end 66 91 67 92 private: 68 93 LevelManager(const LevelManager&); 69 94 70 void activateNextLevel(); 95 void activateNextLevel(); //!< Activate the next level. 71 96 72 void compileAvailableLevelList(void); 73 void updateAvailableLevelList(void); 97 void compileAvailableLevelList(void); //!< Compile the list of available Levels. 98 void updateAvailableLevelList(void); //!< Update the list of available Levels. 74 99 75 std::list<Level*> levels_s; 76 std::vector<std::string> availableLevels_; 77 std::map<std::string, LevelInfoItem*> infos_; 100 std::list<Level*> levels_; //!< A list of all the Levels whose activity has been requested, in the order in which they will become active. 101 std::set<LevelInfoItem*, LevelInfoCompare> availableLevels_; //!< The set of available Levels sorted alphabetically according to the name of the Level. 102 103 // Helpers to allow fast access to the availableLevels list. 104 unsigned int nextIndex_; //! The next expected index to be accessed. 105 std::set<LevelInfoItem*, LevelInfoCompare>::iterator nextLevel_; //! The nex expected Level to be accessed. 78 106 79 107 // config values
Note: See TracChangeset
for help on using the changeset viewer.