Changeset 9348 for code/trunk/src/modules
- Timestamp:
- Aug 30, 2012, 11:08:17 PM (12 years ago)
- Location:
- code/trunk
- Files:
-
- 6 deleted
- 61 edited
- 7 copied
Legend:
- Unmodified
- Added
- Removed
-
code/trunk
- Property svn:ignore
-
old new 1 .project 1 2 build 2 3 codeblocks 4 dependencies 3 5 vs 4 dependencies
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
code/trunk/src/modules/CMakeLists.txt
r8706 r9348 38 38 ADD_SUBDIRECTORY(weapons) 39 39 ADD_SUBDIRECTORY(docking) 40 ADD_SUBDIRECTORY(towerdefense) -
code/trunk/src/modules/docking/DockingController.cc
r8858 r9348 60 60 61 61 float distance = (this->dock_->getWorldPosition() - entity->getPosition()).length(); 62 Vector2 coord = get2DView direction( // I don't understand this too62 Vector2 coord = get2DViewcoordinates( // I don't understand this too 63 63 entity->getPosition(), 64 64 entity->getOrientation() * WorldEntity::FRONT, … … 70 70 if (distance > 10) 71 71 { 72 entity->rotateYaw(-1.0f * 0.8f * sgn(coord.x) * coord.x*coord.x);73 entity->rotatePitch(0.8f * sgn(coord.y) * coord.y*coord.y);72 entity->rotateYaw(-1.0f * 0.8f * clamp(coord.x * 10, -1.0f, 1.0f)); 73 entity->rotatePitch(0.8f * clamp(coord.y * 10, -1.0f, 1.0f)); 74 74 } 75 75 -
code/trunk/src/modules/gametypes/OldRaceCheckPoint.cc
- Property svn:eol-style set to native
r9016 r9348 112 112 const std::string& message = "You have " + multi_cast<std::string>(this->bTimeLimit_) 113 113 + " seconds to reach the check point " + multi_cast<std::string>(this->bCheckpointIndex_+1); 114 const_cast<GametypeInfo*>(gametype->getGametypeInfo())->sendAnnounceMessage(message);114 gametype->getGametypeInfo()->sendAnnounceMessage(message); 115 115 ChatManager::message(message); 116 116 } -
code/trunk/src/modules/gametypes/OldRaceCheckPoint.h
- Property svn:eol-style set to native
-
code/trunk/src/modules/gametypes/OldSpaceRace.cc
- Property svn:eol-style set to native
r9016 r9348 58 58 + "You didn't reach the check point " + multi_cast<std::string>(this->checkpointsReached_+1) 59 59 + " before the time limit. You lose!"; 60 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);60 this->getGametypeInfo()->sendAnnounceMessage(message); 61 61 ChatManager::message(message); 62 62 } … … 68 68 const std::string& message = "You win!! You have reached the last check point after "+ multi_cast<std::string>(s) 69 69 + "." + multi_cast<std::string>(ms) + " seconds."; 70 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);70 this->getGametypeInfo()->sendAnnounceMessage(message); 71 71 ChatManager::message(message); 72 72 /* … … 85 85 86 86 std::string message("The match has started! Reach the check points as quickly as possible!"); 87 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);87 this->getGametypeInfo()->sendAnnounceMessage(message); 88 88 ChatManager::message(message); 89 89 } … … 98 98 + " reached after " + multi_cast<std::string>(s) + "." + multi_cast<std::string>(ms) 99 99 + " seconds."; 100 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);100 this->getGametypeInfo()->sendAnnounceMessage(message); 101 101 ChatManager::message(message); 102 102 } -
code/trunk/src/modules/gametypes/OldSpaceRace.h
- Property svn:eol-style set to native
r9016 r9348 59 59 60 60 virtual void newCheckpointReached(); 61 virtual void addBots(unsigned int amount){} //<! overwrite function in order to bypass the addbots command. 62 //<! This is only a temporary solution. Better: create racingBots. 61 63 62 64 inline void setCheckpointsReached(int n) -
code/trunk/src/modules/gametypes/RaceCheckPoint.cc
r9263 r9348 97 97 std::string message = "You have " + multi_cast<std::string>(this->timeLimit_) 98 98 + " seconds to reach the check point " + multi_cast<std::string>(this->checkpointIndex_ + 1); 99 const_cast<GametypeInfo*>(this->getGametype()->getGametypeInfo())->sendAnnounceMessage(message);99 this->getGametype()->getGametypeInfo()->sendAnnounceMessage(message); 100 100 ChatManager::message(message); 101 101 } -
code/trunk/src/modules/gametypes/SpaceRace.cc
r9263 r9348 23 23 * Mauro Salomon 24 24 * Co-authors: 25 * ...25 * Celine Egger 26 26 * 27 27 */ … … 48 48 this->cantMove_ = false; 49 49 this->bTimeIsUp_ = false; 50 this->numberOfBots_ = 0; // quick fix: don't allow default-bots to enter the race 51 // remove this line, if a raceBot has been created. 50 52 } 51 53 … … 70 72 } 71 73 72 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);74 this->getGametypeInfo()->sendAnnounceMessage(message); 73 75 ChatManager::message(message); 74 76 } … … 97 99 98 100 std::string message = "The match has started! Reach the check points as quickly as possible!"; 99 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);101 this->getGametypeInfo()->sendAnnounceMessage(message); 100 102 ChatManager::message(message); 101 103 } … … 112 114 const std::string& message = "Checkpoint " + multi_cast<std::string>(checkpoint->getCheckpointIndex() + 1) 113 115 + " reached after " + multi_cast<std::string>(s) + "." + multi_cast<std::string>(ms) + " seconds."; 114 const_cast<GametypeInfo*>(this->getGametypeInfo())->sendAnnounceMessage(message);116 this->getGametypeInfo()->sendAnnounceMessage(message); 115 117 ChatManager::message(message); 116 118 } -
code/trunk/src/modules/gametypes/SpaceRaceManager.cc
- Property svn:eol-style set to native
r9263 r9348 149 149 } 150 150 else 151 151 { 152 152 // adjust the radarvisibility 153 153 gametype->newCheckpointReached(newCheckpoint, player); -
code/trunk/src/modules/gametypes/SpaceRaceManager.h
- Property svn:eol-style set to native
-
code/trunk/src/modules/objects/triggers/CheckPoint.cc
r7601 r9348 109 109 if (bIsDestination_) 110 110 { 111 const_cast<GametypeInfo*>(gametype->getGametypeInfo())->sendAnnounceMessage("Congratulations - you have won the match!");111 gametype->getGametypeInfo()->sendAnnounceMessage("Congratulations - you have won the match!"); 112 112 gametype->end(); 113 113 } … … 115 115 if (!bIsFirst_ && !bIsDestination_) 116 116 { 117 const_cast<GametypeInfo*>(gametype->getGametypeInfo())->sendAnnounceMessage("Checkpoint reached");117 gametype->getGametypeInfo()->sendAnnounceMessage("Checkpoint reached"); 118 118 } 119 119 } -
code/trunk/src/modules/overlays/OverlaysPrereqs.h
r8706 r9348 95 95 class PauseNotice; 96 96 class TeamBaseMatchScore; 97 class UnderAttackHealthBar;98 97 99 98 // stats -
code/trunk/src/modules/overlays/hud/CMakeLists.txt
r9016 r9348 12 12 KillMessage.cc 13 13 DeathMessage.cc 14 UnderAttackHealthBar.cc15 14 TeamBaseMatchScore.cc 16 15 GametypeStaticMessage.cc -
code/trunk/src/modules/overlays/hud/HUDBoostBar.cc
- Property svn:eol-style set to native
-
code/trunk/src/modules/overlays/hud/HUDBoostBar.h
- Property svn:eol-style set to native
-
code/trunk/src/modules/overlays/hud/HUDEnemyHealthBar.cc
- Property svn:eol-style set to native
-
code/trunk/src/modules/overlays/hud/HUDEnemyHealthBar.h
- Property svn:eol-style set to native
-
code/trunk/src/modules/overlays/hud/HUDNavigation.cc
r9257 r9348 55 55 namespace orxonox 56 56 { 57 bool compareDistance ( std::pair<RadarViewable*, unsigned int > a, std::pair<RadarViewable*, unsigned int > b ) 58 { 59 return a.second<b.second; 60 61 } 62 63 void HUDNavigation::setConfigValues() 64 { 65 SetConfigValue(markerLimit_, 3); 66 SetConfigValue(showDistance, false); 67 } 68 69 CreateFactory ( HUDNavigation ); 70 71 HUDNavigation::HUDNavigation ( BaseObject* creator ) 72 : OrxonoxOverlay ( creator ) 73 { 74 RegisterObject ( HUDNavigation ); 75 this->setConfigValues(); 76 77 // Set default values 78 this->setFont ( "Monofur" ); 79 this->setTextSize ( 0.05f ); 80 this->setNavMarkerSize ( 0.05f ); 81 this->setDetectionLimit( 10000.0f ); 82 } 83 84 HUDNavigation::~HUDNavigation() 85 { 86 if ( this->isInitialized() ) 87 { 88 for ( ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ) 89 removeObject ( ( it++ )->first ); 90 91 } 92 93 sortedObjectList_.clear(); 94 } 95 96 void HUDNavigation::XMLPort ( Element& xmlelement, XMLPort::Mode mode ) 97 { 98 SUPER ( HUDNavigation, XMLPort, xmlelement, mode ); 99 100 XMLPortParam ( HUDNavigation, "font", setFont, getFont, xmlelement, mode ); 101 XMLPortParam ( HUDNavigation, "textSize", setTextSize, getTextSize, xmlelement, mode ); 102 XMLPortParam ( HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlelement, mode ); 103 XMLPortParam ( HUDNavigation, "detectionLimit", setDetectionLimit, getDetectionLimit, xmlelement, mode ); 104 } 105 106 void HUDNavigation::setFont ( const std::string& font ) 107 { 108 const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName ( font ); 109 if ( fontPtr.isNull() ) 110 { 111 orxout(internal_warning) << "HUDNavigation: Font '" << font << "' not found" << endl; 112 return; 113 } 114 fontName_ = font; 115 for ( ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it ) 116 { 117 if ( it->second.text_ != NULL ) 118 it->second.text_->setFontName ( fontName_ ); 119 } 120 } 121 122 const std::string& HUDNavigation::getFont() const 123 { 124 return fontName_; 125 } 126 127 void HUDNavigation::setTextSize ( float size ) 128 { 129 if ( size <= 0.0f ) 130 { 131 orxout(internal_warning) << "HUDNavigation: Negative font size not allowed" << endl; 132 return; 133 } 134 textSize_ = size; 135 for ( ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it ) 136 { 137 if ( it->second.text_ ) 138 it->second.text_->setCharHeight ( size ); 139 } 140 } 141 142 float HUDNavigation::getTextSize() const 143 { 144 return textSize_; 145 } 146 147 float HUDNavigation::getArrowSizeX(int dist) 148 { 149 if (dist < 600) 150 dist = 600; 151 return this->getActualSize().x * 900 * navMarkerSize_ / dist; 152 } 153 154 float HUDNavigation::getArrowSizeY(int dist) 155 { 156 if (dist < 600) 157 dist = 600; 158 return this->getActualSize().y * 900 * navMarkerSize_ / dist; 159 } 160 161 void HUDNavigation::tick ( float dt ) 162 { 163 SUPER ( HUDNavigation, tick, dt ); 164 165 Camera* cam = CameraManager::getInstance().getActiveCamera(); 166 if ( cam == NULL ) 167 return; 168 const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix(); 169 170 171 for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++listIt ) 172 { 173 listIt->second = ( int ) ( ( listIt->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition() ).length() + 0.5f ); 174 } 175 176 sortedObjectList_.sort ( compareDistance ); 177 178 unsigned int markerCount_ = 0; 179 bool closeEnough_ = false; //only display objects that are close enough to be relevant for the player 180 181 // for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it) 182 for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++markerCount_, ++listIt ) 183 { 184 ObjectMap::iterator it = activeObjectList_.find ( listIt->first ); 185 closeEnough_ = listIt->second < detectionLimit_ ; 186 // display radarviewables on HUD if the marker limit and max-distance is not exceeded 187 if ( markerCount_ < markerLimit_ && (closeEnough_ || detectionLimit_ < 0) ) 188 { 189 190 191 // Get Distance to HumanController and save it in the TextAreaOverlayElement. 192 int dist = listIt->second; 193 float textLength = 0.0f; 194 195 //display distance next to cursor 196 if (showDistance){ 197 it->second.text_->setCaption ( multi_cast<std::string> ( dist ) ); 198 textLength = multi_cast<std::string> ( dist ).size() * it->second.text_->getCharHeight() * 0.3f; 199 } 200 201 //display name next to cursor 202 else{ 203 it->second.text_->setCaption(it->first->getRadarName()); 204 textLength = it->first->getRadarName().size() * it->second.text_->getCharHeight() * 0.3f; 205 } 206 207 // Transform to screen coordinates 208 Vector3 pos = camTransform * it->first->getRVWorldPosition(); 209 210 bool outOfView = true; 211 if ( pos.z > 1.0 ) 57 bool compareDistance(std::pair<RadarViewable*, unsigned int> a, std::pair<RadarViewable*, unsigned int> b) 58 { 59 return a.second < b.second; 60 } 61 62 CreateFactory ( HUDNavigation ); 63 64 HUDNavigation::HUDNavigation(BaseObject* creator) : OrxonoxOverlay(creator) 65 { 66 RegisterObject(HUDNavigation); 67 this->setConfigValues(); 68 69 // Set default values 70 this->setFont("Monofur"); 71 this->setTextSize(0.05f); 72 this->setNavMarkerSize(0.05f); 73 this->setDetectionLimit(10000.0f); 74 } 75 76 HUDNavigation::~HUDNavigation() 77 { 78 if (this->isInitialized()) 79 { 80 for (std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.begin(); it != this->activeObjectList_.end();) 81 removeObject((it++)->first); 82 } 83 this->sortedObjectList_.clear(); 84 } 85 86 void HUDNavigation::setConfigValues() 87 { 88 SetConfigValue(markerLimit_, 3); 89 SetConfigValue(showDistance_, false); 90 } 91 92 void HUDNavigation::XMLPort(Element& xmlelement, XMLPort::Mode mode) 93 { 94 SUPER(HUDNavigation, XMLPort, xmlelement, mode); 95 96 XMLPortParam(HUDNavigation, "font", setFont, getFont, xmlelement, mode); 97 XMLPortParam(HUDNavigation, "textSize", setTextSize, getTextSize, xmlelement, mode); 98 XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlelement, mode); 99 XMLPortParam(HUDNavigation, "detectionLimit", setDetectionLimit, getDetectionLimit, xmlelement, mode); 100 } 101 102 void HUDNavigation::setFont(const std::string& font) 103 { 104 const Ogre::ResourcePtr& fontPtr = Ogre::FontManager::getSingleton().getByName(font); 105 if (fontPtr.isNull()) 106 { 107 orxout(internal_warning) << "HUDNavigation: Font '" << font << "' not found" << endl; 108 return; 109 } 110 this->fontName_ = font; 111 for (std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.begin(); it != this->activeObjectList_.end(); ++it) 112 { 113 if (it->second.text_ != NULL) 114 it->second.text_->setFontName(this->fontName_); 115 } 116 } 117 118 const std::string& HUDNavigation::getFont() const 119 { 120 return this->fontName_; 121 } 122 123 void HUDNavigation::setTextSize(float size) 124 { 125 if (size <= 0.0f) 126 { 127 orxout(internal_warning) << "HUDNavigation: Negative font size not allowed" << endl; 128 return; 129 } 130 this->textSize_ = size; 131 for (std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.begin(); it!=this->activeObjectList_.end(); ++it) 132 { 133 if (it->second.text_) 134 it->second.text_->setCharHeight(size); 135 } 136 } 137 138 float HUDNavigation::getTextSize() const 139 { 140 return this->textSize_; 141 } 142 143 float HUDNavigation::getArrowSizeX(int dist) const 144 { 145 if (dist < 600) 146 dist = 600; 147 return this->getActualSize().x * 900 * this->navMarkerSize_ / dist; 148 } 149 150 float HUDNavigation::getArrowSizeY(int dist) const 151 { 152 if (dist < 600) 153 dist = 600; 154 return this->getActualSize().y * 900 * this->navMarkerSize_ / dist; 155 } 156 157 void HUDNavigation::tick(float dt) 158 { 159 SUPER(HUDNavigation, tick, dt); 160 161 Camera* cam = CameraManager::getInstance().getActiveCamera(); 162 if (cam == NULL) 163 return; 164 const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix(); 165 166 167 for (std::list<std::pair<RadarViewable*, unsigned int> >::iterator listIt = this->sortedObjectList_.begin(); listIt != this->sortedObjectList_.end(); ++listIt) 168 listIt->second = (int)((listIt->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition()).length() + 0.5f); 169 170 this->sortedObjectList_.sort(compareDistance); 171 172 unsigned int markerCount = 0; 173 bool closeEnough = false; // only display objects that are close enough to be relevant for the player 174 175 for (std::list<std::pair<RadarViewable*, unsigned int> >::iterator listIt = this->sortedObjectList_.begin(); listIt != this->sortedObjectList_.end(); ++markerCount, ++listIt) 176 { 177 std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.find(listIt->first); 178 closeEnough = listIt->second < this->detectionLimit_; 179 // display radarviewables on HUD if the marker limit and max-distance is not exceeded 180 if (markerCount < this->markerLimit_ && (closeEnough || this->detectionLimit_ < 0)) 212 181 { 213 // z > 1.0 means that the object is behind the camera 214 outOfView = true; 215 // we have to switch all coordinates (if you don't know why, 216 // try linear algebra lectures, because I can't explain..) 217 pos.x = -pos.x; 218 pos.y = -pos.y; 219 } 220 else 221 outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0; 222 223 if ( outOfView ) 224 { 225 // Object is not in view 226 227 // Change material only if outOfView changed 228 if ( !it->second.wasOutOfView_ ) 182 // Get Distance to HumanController and save it in the TextAreaOverlayElement. 183 int dist = listIt->second; 184 float textLength = 0.0f; 185 186 if (this->showDistance_) 229 187 { 230 it->second.panel_->setMaterialName( TextureGenerator::getMaterialName( "arrows.png", it->first->getRadarObjectColour()) ); 231 it->second.wasOutOfView_ = true; 188 //display distance next to cursor 189 it->second.text_->setCaption(multi_cast<std::string>(dist)); 190 textLength = multi_cast<std::string>(dist).size() * it->second.text_->getCharHeight() * 0.3f; 232 191 } 233 234 //float xDistScale = this->getActualSize().x * 1000.0f * navMarkerSize_ / dist; 235 //float yDistScale = this->getActualSize().y * 1000.0f * navMarkerSize_ / dist; 236 237 // Adjust Arrowsize according to distance 238 it->second.panel_->setDimensions(getArrowSizeX(dist),getArrowSizeY(dist)); 239 240 // Switch between top, bottom, left and right position of the arrow at the screen border 241 if ( pos.x < pos.y ) 192 else 242 193 { 243 if ( pos.y > -pos.x ) 194 //display name next to cursor 195 it->second.text_->setCaption(it->first->getRadarName()); 196 textLength = it->first->getRadarName().size() * it->second.text_->getCharHeight() * 0.3f; 197 } 198 199 // Transform to screen coordinates 200 Vector3 pos = camTransform * it->first->getRVWorldPosition(); 201 202 bool outOfView = true; 203 if (pos.z > 1.0) 204 { 205 // z > 1.0 means that the object is behind the camera 206 outOfView = true; 207 // we have to switch all coordinates (if you don't know why, 208 // try linear algebra lectures, because I can't explain..) 209 pos.x = -pos.x; 210 pos.y = -pos.y; 211 } 212 else 213 outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0; 214 215 if (outOfView) 216 { 217 // Object is not in view 218 219 // Change material only if outOfView changed 220 if (!it->second.wasOutOfView_) 244 221 { 245 // Top 246 float position = pos.x / pos.y + 1.0f; 247 it->second.panel_->setPosition ( ( position - it->second.panel_->getWidth() ) * 0.5f, 0.0f ); 248 it->second.panel_->setUV ( 0.5f, 0.0f, 1.0f, 0.5f ); 249 it->second.text_->setLeft ( ( position - textLength ) * 0.5f ); 250 it->second.text_->setTop ( it->second.panel_->getHeight() ); 222 it->second.panel_->setMaterialName(TextureGenerator::getMaterialName("arrows.png", it->first->getRadarObjectColour())); 223 it->second.wasOutOfView_ = true; 224 } 225 226 //float xDistScale = this->getActualSize().x * 1000.0f * this->navMarkerSize_ / dist; 227 //float yDistScale = this->getActualSize().y * 1000.0f * this->navMarkerSize_ / dist; 228 229 // Adjust Arrowsize according to distance 230 it->second.panel_->setDimensions(getArrowSizeX(dist), getArrowSizeY(dist)); 231 232 // Switch between top, bottom, left and right position of the arrow at the screen border 233 if (pos.x < pos.y) 234 { 235 if (pos.y > -pos.x) 236 { 237 // Top 238 float position = pos.x / pos.y + 1.0f; 239 it->second.panel_->setPosition((position - it->second.panel_->getWidth()) * 0.5f, 0.0f); 240 it->second.panel_->setUV(0.5f, 0.0f, 1.0f, 0.5f); 241 it->second.text_->setLeft((position - textLength) * 0.5f); 242 it->second.text_->setTop(it->second.panel_->getHeight()); 243 } 244 else 245 { 246 // Left 247 float position = pos.y / pos.x + 1.0f; 248 it->second.panel_->setPosition(0.0f, (position - it->second.panel_->getWidth()) * 0.5f); 249 it->second.panel_->setUV(0.0f, 0.0f, 0.5f, 0.5f); 250 it->second.text_->setLeft(it->second.panel_->getWidth() + 0.01f); 251 it->second.text_->setTop((position - it->second.text_->getCharHeight()) * 0.5f); 252 } 251 253 } 252 254 else 253 255 { 254 // Left 255 float position = pos.y / pos.x + 1.0f; 256 it->second.panel_->setPosition ( 0.0f, ( position - it->second.panel_->getWidth() ) * 0.5f ); 257 it->second.panel_->setUV ( 0.0f, 0.0f, 0.5f, 0.5f ); 258 it->second.text_->setLeft ( it->second.panel_->getWidth() + 0.01f ); 259 it->second.text_->setTop ( ( position - it->second.text_->getCharHeight() ) * 0.5f ); 256 if (pos.y < -pos.x) 257 { 258 // Bottom 259 float position = -pos.x / pos.y + 1.0f; 260 it->second.panel_->setPosition((position - it->second.panel_->getWidth()) * 0.5f, 1.0f - it->second.panel_->getHeight()); 261 it->second.panel_->setUV(0.0f, 0.5f, 0.5f, 1.0f ); 262 it->second.text_->setLeft((position - textLength) * 0.5f); 263 it->second.text_->setTop(1.0f - it->second.panel_->getHeight() - it->second.text_->getCharHeight()); 264 } 265 else 266 { 267 // Right 268 float position = -pos.y / pos.x + 1.0f; 269 it->second.panel_->setPosition(1.0f - it->second.panel_->getWidth(), (position - it->second.panel_->getHeight()) * 0.5f); 270 it->second.panel_->setUV(0.5f, 0.5f, 1.0f, 1.0f); 271 it->second.text_->setLeft(1.0f - it->second.panel_->getWidth() - textLength - 0.01f); 272 it->second.text_->setTop((position - it->second.text_->getCharHeight()) * 0.5f); 273 } 260 274 } 261 275 } 262 263 276 else 264 277 { 265 266 if ( pos.y < -pos.x ) 278 // Object is in view 279 280 // Change material only if outOfView changed 281 if (it->second.wasOutOfView_) 267 282 { 268 // Bottom 269 float position = -pos.x / pos.y + 1.0f; 270 it->second.panel_->setPosition ( ( position - it->second.panel_->getWidth() ) * 0.5f, 1.0f - it->second.panel_->getHeight() ); 271 it->second.panel_->setUV ( 0.0f, 0.5f, 0.5f, 1.0f ); 272 it->second.text_->setLeft ( ( position - textLength ) * 0.5f ); 273 it->second.text_->setTop ( 1.0f - it->second.panel_->getHeight() - it->second.text_->getCharHeight() ); 283 //it->second.panel_->setMaterialName("Orxonox/NavTDC"); 284 it->second.panel_->setMaterialName(TextureGenerator::getMaterialName("tdc.png", it->first->getRadarObjectColour())); 285 it->second.panel_->setDimensions(this->navMarkerSize_ * this->getActualSize().x, this->navMarkerSize_ * this->getActualSize().y); 286 it->second.wasOutOfView_ = false; 274 287 } 275 else 276 {277 // Right278 float position = -pos.y / pos.x + 1.0f;279 it->second.panel_->setPosition ( 1.0f - it->second.panel_->getWidth(), ( position - it->second.panel_->getHeight() ) * 0.5f);280 it->second.panel_->setUV ( 0.5f, 0.5f, 1.0f, 1.0f ); 281 it->second.text_->setLeft ( 1.0f - it->second.panel_->getWidth() - textLength - 0.01f );282 it->second.text_->setTop ( ( position - it->second.text_->getCharHeight() ) * 0.5f);283 }288 289 // Position marker 290 it->second.panel_->setUV(0.0f, 0.0f, 1.0f, 1.0f); 291 it->second.panel_->setLeft((pos.x + 1.0f - it->second.panel_->getWidth()) * 0.5f); 292 it->second.panel_->setTop((-pos.y + 1.0f - it->second.panel_->getHeight()) * 0.5f); 293 294 // Position text 295 it->second.text_->setLeft((pos.x + 1.0f + it->second.panel_->getWidth()) * 0.5f); 296 it->second.text_->setTop((-pos.y + 1.0f + it->second.panel_->getHeight()) * 0.5f); 284 297 } 298 299 // Make sure the overlays are shown 300 it->second.panel_->show(); 301 it->second.text_->show(); 285 302 } 286 else 303 else // do not display on HUD 287 304 { 288 // Object is in view 289 290 // Change material only if outOfView changed 291 if ( it->second.wasOutOfView_ ) 292 { 293 //it->second.panel_->setMaterialName ( "Orxonox/NavTDC" ); 294 it->second.panel_->setMaterialName( TextureGenerator::getMaterialName( "tdc.png", it->first->getRadarObjectColour()) ); 295 it->second.panel_->setDimensions ( navMarkerSize_ * this->getActualSize().x, navMarkerSize_ * this->getActualSize().y ); 296 it->second.wasOutOfView_ = false; 297 } 298 299 // Position marker 300 it->second.panel_->setUV ( 0.0f, 0.0f, 1.0f, 1.0f ); 301 it->second.panel_->setLeft ( ( pos.x + 1.0f - it->second.panel_->getWidth() ) * 0.5f ); 302 it->second.panel_->setTop ( ( -pos.y + 1.0f - it->second.panel_->getHeight() ) * 0.5f ); 303 304 // Position text 305 it->second.text_->setLeft ( ( pos.x + 1.0f + it->second.panel_->getWidth() ) * 0.5f ); 306 it->second.text_->setTop ( ( -pos.y + 1.0f + it->second.panel_->getHeight() ) * 0.5f ); 305 it->second.panel_->hide(); 306 it->second.text_->hide(); 307 307 } 308 309 // Make sure the overlays are shown 310 it->second.panel_->show(); 311 it->second.text_->show(); 312 } 313 else // do not display on HUD 314 { 315 it->second.panel_->hide(); 316 it->second.text_->hide(); 317 } 318 308 } 309 } 310 311 /** Overridden method of OrxonoxOverlay. 312 @details 313 Usually the entire overlay scales with scale(). 314 Here we obviously have to adjust this. 315 */ 316 void HUDNavigation::sizeChanged() 317 { 318 // Use size to compensate for aspect ratio if enabled. 319 float xScale = this->getActualSize().x; 320 float yScale = this->getActualSize().y; 321 322 for (std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.begin(); it != this->activeObjectList_.end(); ++it) 323 { 324 if (it->second.panel_ != NULL) 325 it->second.panel_->setDimensions(this->navMarkerSize_ * xScale, this->navMarkerSize_ * yScale); 326 if (it->second.text_ != NULL) 327 it->second.text_->setCharHeight(it->second.text_->getCharHeight() * yScale); 328 } 329 } 330 331 void HUDNavigation::addObject(RadarViewable* object) 332 { 333 if (showObject(object) == false) 334 return; 335 336 if (this->activeObjectList_.size() >= this->markerLimit_) 337 if (object == NULL) 338 return; 339 340 // Object hasn't been added yet (we know that) 341 assert(this->activeObjectList_.find(object) == this->activeObjectList_.end()); 342 343 // Scales used for dimensions and text size 344 float xScale = this->getActualSize().x; 345 float yScale = this->getActualSize().y; 346 347 // Create everything needed to display the object on the radar and add it to the map 348 349 // Create arrow/marker 350 Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>( Ogre::OverlayManager::getSingleton() 351 .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString())); 352 //panel->setMaterialName("Orxonox/NavTDC"); 353 panel->setMaterialName(TextureGenerator::getMaterialName("tdc.png", object->getRadarObjectColour())); 354 panel->setDimensions(this->navMarkerSize_ * xScale, this->navMarkerSize_ * yScale); 355 //panel->setColour(object->getRadarObjectColour()); 356 357 Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>( Ogre::OverlayManager::getSingleton() 358 .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString())); 359 text->setFontName(this->fontName_); 360 text->setCharHeight(text->getCharHeight() * yScale); 361 text->setColour(object->getRadarObjectColour()); 362 363 panel->hide(); 364 text->hide(); 365 366 ObjectInfo tempStruct = {panel, text, false /*, TODO: initialize wasOutOfView_ */}; 367 this->activeObjectList_[object] = tempStruct; 368 369 this->background_->addChild(panel); 370 this->background_->addChild(text); 371 372 this->sortedObjectList_.push_front(std::make_pair(object, (unsigned int)0)); 373 } 374 375 void HUDNavigation::removeObject(RadarViewable* viewable) 376 { 377 std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.find(viewable); 378 379 if (this->activeObjectList_.find(viewable) != this->activeObjectList_.end()) 380 { 381 // Detach overlays 382 this->background_->removeChild(it->second.panel_->getName()); 383 this->background_->removeChild(it->second.text_->getName()); 384 // Properly destroy the overlay elements (do not use delete!) 385 Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.panel_); 386 Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.text_); 387 // Remove from the list 388 this->activeObjectList_.erase(viewable); 389 } 390 391 for (std::list<std::pair<RadarViewable*, unsigned int> >::iterator listIt = this->sortedObjectList_.begin(); listIt != this->sortedObjectList_.end(); ++listIt) 392 { 393 if ((listIt->first) == viewable) 394 { 395 this->sortedObjectList_.erase(listIt); 396 break; 397 } 398 } 399 } 400 401 void HUDNavigation::objectChanged(RadarViewable* viewable) 402 { 403 // TODO: niceification neccessary ;) 404 removeObject(viewable); 405 addObject(viewable); 406 } 407 408 bool HUDNavigation::showObject(RadarViewable* rv) 409 { 410 if (rv == orxonox_cast<RadarViewable*>(this->getOwner())) 411 return false; 412 assert(rv->getWorldEntity()); 413 if (rv->getWorldEntity()->isVisible() == false || rv->getRadarVisibility() == false) 414 return false; 415 return true; 416 } 417 418 void HUDNavigation::changedOwner() 419 { 420 const std::set<RadarViewable*>& respawnObjects = this->getOwner()->getScene()->getRadar()->getRadarObjects(); 421 for (std::set<RadarViewable*>::const_iterator it = respawnObjects.begin(); it != respawnObjects.end(); ++it) 422 { 423 if (!(*it)->isHumanShip_) 424 this->addObject(*it); 425 } 319 426 } 320 427 } 321 322 323 /** Overridden method of OrxonoxOverlay.324 @details325 Usually the entire overlay scales with scale().326 Here we obviously have to adjust this.327 */328 void HUDNavigation::sizeChanged()329 {330 // Use size to compensate for aspect ratio if enabled.331 float xScale = this->getActualSize().x;332 float yScale = this->getActualSize().y;333 334 for ( ObjectMap::iterator it = activeObjectList_.begin(); it!=activeObjectList_.end(); ++it )335 {336 if ( it->second.panel_ != NULL )337 it->second.panel_->setDimensions ( navMarkerSize_ * xScale, navMarkerSize_ * yScale );338 if ( it->second.text_ != NULL )339 it->second.text_->setCharHeight ( it->second.text_->getCharHeight() * yScale );340 }341 }342 343 void HUDNavigation::addObject ( RadarViewable* object )344 {345 if( showObject(object)==false )346 return;347 348 if ( activeObjectList_.size() >= markerLimit_ )349 if ( object == NULL )350 return;351 352 // Object hasn't been added yet (we know that)353 assert ( this->activeObjectList_.find ( object ) == this->activeObjectList_.end() );354 355 // Scales used for dimensions and text size356 float xScale = this->getActualSize().x;357 float yScale = this->getActualSize().y;358 359 // Create everything needed to display the object on the radar and add it to the map360 361 // Create arrow/marker362 Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*> ( Ogre::OverlayManager::getSingleton()363 .createOverlayElement ( "Panel", "HUDNavigation_navMarker_" + getUniqueNumberString() ) );364 // panel->setMaterialName ( "Orxonox/NavTDC" );365 panel->setMaterialName( TextureGenerator::getMaterialName( "tdc.png", object->getRadarObjectColour()) );366 panel->setDimensions ( navMarkerSize_ * xScale, navMarkerSize_ * yScale );367 // panel->setColour( object->getRadarObjectColour() );368 369 Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*> ( Ogre::OverlayManager::getSingleton()370 .createOverlayElement ( "TextArea", "HUDNavigation_navText_" + getUniqueNumberString() ) );371 text->setFontName ( this->fontName_ );372 text->setCharHeight ( text->getCharHeight() * yScale );373 text->setColour( object->getRadarObjectColour() );374 375 panel->hide();376 text->hide();377 378 ObjectInfo tempStruct = {panel, text, false /*, TODO: initialize wasOutOfView_ */};379 activeObjectList_[object] = tempStruct;380 381 this->background_->addChild ( panel );382 this->background_->addChild ( text );383 384 sortedObjectList_.push_front ( std::make_pair ( object, ( unsigned int ) 0 ) );385 386 387 }388 389 void HUDNavigation::removeObject ( RadarViewable* viewable )390 {391 ObjectMap::iterator it = activeObjectList_.find ( viewable );392 393 if ( activeObjectList_.find ( viewable ) != activeObjectList_.end() )394 {395 // Detach overlays396 this->background_->removeChild ( it->second.panel_->getName() );397 this->background_->removeChild ( it->second.text_->getName() );398 // Properly destroy the overlay elements (do not use delete!)399 Ogre::OverlayManager::getSingleton().destroyOverlayElement ( it->second.panel_ );400 Ogre::OverlayManager::getSingleton().destroyOverlayElement ( it->second.text_ );401 // Remove from the list402 activeObjectList_.erase ( viewable );403 404 405 }406 407 for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++listIt )408 {409 if ( (listIt->first) == viewable )410 {411 sortedObjectList_.erase ( listIt );412 break;413 }414 415 }416 417 }418 419 void HUDNavigation::objectChanged(RadarViewable* viewable)420 {421 // TODO: niceification neccessary ;)422 removeObject(viewable);423 addObject(viewable);424 }425 426 427 bool HUDNavigation::showObject(RadarViewable* rv)428 {429 if ( rv == dynamic_cast<RadarViewable*> ( this->getOwner() ) )430 return false;431 assert( rv->getWorldEntity() );432 if ( rv->getWorldEntity()->isVisible()==false || rv->getRadarVisibility()==false )433 return false;434 return true;435 }436 437 void HUDNavigation::changedOwner()438 {439 440 const std::set<RadarViewable*>& respawnObjects = this->getOwner()->getScene()->getRadar()->getRadarObjects();441 for ( std::set<RadarViewable*>::const_iterator it = respawnObjects.begin(); it != respawnObjects.end(); ++it )442 {443 if ( ! ( *it )->isHumanShip_ )444 this->addObject ( *it );445 }446 }447 448 } -
code/trunk/src/modules/overlays/hud/HUDNavigation.h
r9016 r9348 36 36 #include <string> 37 37 38 39 38 #include "util/OgreForwardRefs.h" 40 39 #include "tools/interfaces/Tickable.h" … … 44 43 namespace orxonox 45 44 { 46 class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener47 {48 public:49 HUDNavigation ( BaseObject* creator);50 virtual ~HUDNavigation();45 class _OverlaysExport HUDNavigation : public OrxonoxOverlay, public Tickable, public RadarListener 46 { 47 public: 48 HUDNavigation(BaseObject* creator); 49 virtual ~HUDNavigation(); 51 50 52 void setConfigValues();51 void setConfigValues(); 53 52 54 virtual void XMLPort ( Element& xmlelement, XMLPort::Mode mode);55 virtual void tick ( float dt);53 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); 54 virtual void tick(float dt); 56 55 57 // RadarListener interface58 virtual void addObject ( RadarViewable* object);59 virtual void removeObject ( RadarViewable* viewable);60 virtual void objectChanged ( RadarViewable* viewable);56 // RadarListener interface 57 virtual void addObject(RadarViewable* object); 58 virtual void removeObject(RadarViewable* viewable); 59 virtual void objectChanged(RadarViewable* viewable); 61 60 62 virtual void changedOwner();63 virtual void sizeChanged();64 virtual void angleChanged() { }65 virtual void positionChanged() { }66 virtual void radarTick ( float dt) {}61 virtual void changedOwner(); 62 virtual void sizeChanged(); 63 virtual void angleChanged() { } 64 virtual void positionChanged() { } 65 virtual void radarTick(float dt) {} 67 66 68 inline float getRadarSensitivity() const69 { return 1.0f; }67 inline float getRadarSensitivity() const 68 { return 1.0f; } 70 69 71 unsigned int getMarkerLimit() { return this->markerLimit_; } 70 inline unsigned int getMarkerLimit() const 71 { return this->markerLimit_; } 72 72 73 private: 74 struct ObjectInfo 75 { 76 Ogre::PanelOverlayElement* panel_; 77 Ogre::TextAreaOverlayElement* text_; 78 bool outOfView_; 79 bool wasOutOfView_; 73 private: 74 struct ObjectInfo 75 { 76 Ogre::PanelOverlayElement* panel_; 77 Ogre::TextAreaOverlayElement* text_; 78 bool outOfView_; 79 bool wasOutOfView_; 80 }; 80 81 82 bool showObject(RadarViewable* rv); 83 84 // XMLPort accessors 85 inline void setNavMarkerSize(float size) 86 { 87 navMarkerSize_ = size; 88 this->sizeChanged(); 89 } 90 inline float getNavMarkerSize() const 91 { return navMarkerSize_; } 92 inline void setDetectionLimit(float limit) 93 { this->detectionLimit_ = limit; } 94 inline float getDetectionLimit() const 95 { return this->detectionLimit_; } 96 97 void setTextSize(float size); 98 float getTextSize() const; 99 100 void setFont(const std::string& font); 101 const std::string& getFont() const; 102 103 float getArrowSizeX(int dist) const; 104 float getArrowSizeY(int dist) const; 105 106 std::map<RadarViewable*, ObjectInfo> activeObjectList_; 107 std::list<std::pair<RadarViewable*, unsigned int> > sortedObjectList_; 108 109 float navMarkerSize_; 110 std::string fontName_; 111 float textSize_; 112 bool showDistance_; 113 114 unsigned int markerLimit_; 115 float detectionLimit_; //!< Objects that are more far away than detectionLimit_ are not displayed on the HUD. 10000.0f is the default value. 81 116 }; 82 83 bool showObject( RadarViewable* rv );84 85 // XMLPort accessors86 void setNavMarkerSize ( float size )87 { navMarkerSize_ = size; this->sizeChanged(); }88 float getNavMarkerSize() const89 { return navMarkerSize_; }90 void setDetectionLimit( float limit )91 { this->detectionLimit_ = limit; }92 float getDetectionLimit() const93 { return this->detectionLimit_; }94 95 void setTextSize ( float size );96 float getTextSize() const;97 98 void setFont ( const std::string& font );99 const std::string& getFont() const;100 101 typedef std::map<RadarViewable*, ObjectInfo > ObjectMap;102 ObjectMap activeObjectList_;103 104 typedef std::list < std::pair<RadarViewable*, unsigned int > > sortedList;105 sortedList sortedObjectList_;106 107 float getArrowSizeX(int dist);108 float getArrowSizeY(int dist);109 110 float navMarkerSize_;111 std::string fontName_;112 float textSize_;113 bool showDistance;114 115 unsigned int markerLimit_;116 float detectionLimit_; //!< Objects that are more far away than detectionLimit_ are not displayed on the HUD. 10000.0f is the default value.117 118 };119 117 } 120 118 -
code/trunk/src/modules/overlays/hud/HUDRadar.cc
r8891 r9348 92 92 void HUDRadar::addObject(RadarViewable* object) 93 93 { 94 if (object == dynamic_cast<RadarViewable*>(this->owner_))94 if (object == orxonox_cast<RadarViewable*>(this->owner_)) 95 95 return; 96 96 if( showObject(object) == false ) //do not show objects that are "invisible" or "radar invisible" … … 189 189 bool HUDRadar::showObject(RadarViewable* rv) 190 190 { 191 if ( rv == dynamic_cast<RadarViewable*> ( this->getOwner() ) )191 if ( rv == orxonox_cast<RadarViewable*> ( this->getOwner() ) ) 192 192 return false; 193 193 assert( rv->getWorldEntity() ); -
code/trunk/src/modules/pickup/CMakeLists.txt
r7163 r9348 1 1 SET_SOURCE_FILES(PICKUP_SRC_FILES 2 2 CollectiblePickup.cc 3 DroppedPickup.cc4 3 Pickup.cc 5 4 PickupCollection.cc 6 PickupCollectionIdentifier.cc7 5 PickupManager.cc 8 6 PickupRepresentation.cc -
code/trunk/src/modules/pickup/CollectiblePickup.cc
r7494 r9348 45 45 Registers the object and initializes variables. 46 46 */ 47 CollectiblePickup::CollectiblePickup() : isInCollection_(false)47 CollectiblePickup::CollectiblePickup() : collection_(NULL) 48 48 { 49 49 RegisterObject(CollectiblePickup); 50 51 this->collection_ = NULL;52 50 } 53 51 … … 58 56 CollectiblePickup::~CollectiblePickup() 59 57 { 60 61 } 62 63 /** 64 @brief 65 Is called by OrxonoxClass::destroy() before the object is actually destroyed. 66 */ 67 void CollectiblePickup::preDestroy(void) 68 { 69 this->Pickupable::preDestroy(); 70 71 // The PickupCollection has to be destroyed as well. 72 if(this->isInCollection()) 73 this->collection_->Pickupable::destroy(); 74 } 75 76 /** 77 @brief 78 Destroys a Pickupable. 79 */ 80 void CollectiblePickup::destroyPickup(void) 81 { 82 if(!this->isInCollection()) // If the CollectiblePickup is not in a PickupCollection the destroyPickup method of Pickupable is called. 83 this->Pickupable::destroyPickup(); 84 else // Else the ColectiblePickup is dropped and disabled, 85 { 86 this->drop(false); 87 if(this->isInCollection() && this->isEnabled()) // It is only disabled if it is enabled and still ina PickupCollection after having been dropped. 88 { 89 this->setDisabled(); 90 this->collection_->pickupDisabled(); 91 } 92 } 93 } 94 95 /** 96 @brief 97 Is called by the PickupCarrier when it is being destroyed. 98 */ 99 void CollectiblePickup::carrierDestroyed(void) 100 { 101 if(!this->isInCollection()) 102 this->Pickupable::destroy(); 103 else // If the CollectiblePickup is part of a PickupCollection it is just dropped instead of destroyed. 104 this->drop(false); 58 if (this->isInCollection()) 59 this->collection_->removePickupable(this); 105 60 } 106 61 … … 131 86 /** 132 87 @brief 133 Adds this CollectiblePickup to the inputPickupCollection.88 Notifies this CollectiblePickup that it was added to a PickupCollection. 134 89 @param collection 135 90 A pointer to the PickupCollection to which the CollectiblePickup should be added. 136 @return137 Returns true if the CollectiblePickup was successfully added to the PickupCollection.138 91 */ 139 bool CollectiblePickup::addToCollection(PickupCollection* collection)92 void CollectiblePickup::wasAddedToCollection(PickupCollection* collection) 140 93 { 141 if(this->isInCollection() || collection == NULL) //If the CollectiblePickup already is in a PickupCollection or if the input pointer is NULL.142 return false;143 144 this->isInCollection_ = true;145 94 this->collection_ = collection; 146 return true;147 95 } 148 96 149 97 /** 150 98 @brief 151 Removes this CollectiblePickup from its PickupCollection. 152 @return 153 Returns true if the CollectiblePickup was succcessfully removed. 99 Notifies this CollectiblePickup that it was removed from its PickupCollection. 154 100 */ 155 bool CollectiblePickup::removeFromCollection(void)101 void CollectiblePickup::wasRemovedFromCollection(void) 156 102 { 157 if(!this->isInCollection()) //If the CollectiblePickup is not in a PickupCollection.158 return false;159 160 this->isInCollection_ = false;161 103 this->collection_ = NULL; 162 return true;163 104 } 164 165 105 } -
code/trunk/src/modules/pickup/CollectiblePickup.h
r7547 r9348 55 55 class _PickupExport CollectiblePickup : public Pickupable 56 56 { 57 friend class PickupCollection; 57 58 58 59 public: … … 68 69 */ 69 70 bool isInCollection(void) const 70 { return this->isInCollection_; } 71 72 bool addToCollection(PickupCollection* collection); //!< Adds this CollectiblePickup to the input PickupCollection. 73 bool removeFromCollection(void); //!< Removes this CollectiblePickup from its PickupCollection. 74 75 void carrierDestroyed(void); //!< Is called by the PickupCarrier when it is being destroyed. 76 77 protected: 78 virtual void preDestroy(void); //!< Is called by OrxonoxClass::destroy() before the object is actually destroyed. 79 virtual void destroyPickup(void); //!< Destroys a Pickupable. 71 { return this->collection_ != NULL; } 80 72 81 73 private: 82 bool isInCollection_; //!< True if the CollectiblePickup is in a PickupCollection. 74 void wasAddedToCollection(PickupCollection* collection); 75 void wasRemovedFromCollection(void); 76 83 77 PickupCollection* collection_; //!< A pointer to the PickupCollection this CollectiblePickup is in. 84 85 78 }; 86 79 } -
code/trunk/src/modules/pickup/Pickup.cc
r8864 r9348 37 37 #include "util/StringUtils.h" 38 38 39 #include "pickup/PickupIdentifier.h" 40 41 #include "DroppedPickup.h" 39 #include "PickupSpawner.h" 42 40 43 41 namespace orxonox … … 86 84 /** 87 85 @brief 88 Initializes the PickupIdentififer of this Pickup.89 */90 void Pickup::initializeIdentifier(void)91 {92 std::string val1 = this->getActivationType();93 std::string type1 = "activationType";94 this->pickupIdentifier_->addParameter(type1, val1);95 96 std::string val2 = this->getDurationType();97 std::string type2 = "durationType";98 this->pickupIdentifier_->addParameter(type2, val2);99 }100 101 /**102 @brief103 86 Method for creating a Pickup object through XML. 104 87 */ … … 107 90 SUPER(Pickup, XMLPort, xmlelement, mode); 108 91 109 XMLPortParam(Pickup, "activationType", setActivationType, getActivationType, xmlelement, mode); 110 XMLPortParam(Pickup, "durationType", setDurationType, getDurationType, xmlelement, mode); 111 112 this->initializeIdentifier(); 92 XMLPortParam(Pickup, "representation", setRepresentationName, getRepresentationName, xmlelement, mode); 93 XMLPortParam(Pickup, "activationType", setActivationTypeAsString, getActivationTypeAsString, xmlelement, mode); 94 XMLPortParam(Pickup, "durationType", setDurationTypeAsString, getDurationTypeAsString, xmlelement, mode); 113 95 } 114 96 … … 119 101 Returns a string containing the activation type. 120 102 */ 121 const std::string& Pickup::getActivationType (void) const103 const std::string& Pickup::getActivationTypeAsString(void) const 122 104 { 123 switch(this-> activationType_)105 switch(this->getActivationType()) 124 106 { 125 107 case pickupActivationType::immediate: … … 138 120 Returns a string containing the duration type. 139 121 */ 140 const std::string& Pickup::getDurationType (void) const122 const std::string& Pickup::getDurationTypeAsString(void) const 141 123 { 142 switch(this-> durationType_)124 switch(this->getDurationType()) 143 125 { 144 126 case pickupDurationType::once: … … 157 139 The activation type of the Pickup as a string. 158 140 */ 159 void Pickup::setActivationType (const std::string& type)141 void Pickup::setActivationTypeAsString(const std::string& type) 160 142 { 161 143 if(type == Pickup::activationTypeImmediate_s) 162 this-> activationType_ = pickupActivationType::immediate;144 this->setActivationType(pickupActivationType::immediate); 163 145 else if(type == Pickup::activationTypeOnUse_s) 164 this-> activationType_ = pickupActivationType::onUse;146 this->setActivationType(pickupActivationType::onUse); 165 147 else 166 148 orxout(internal_error, context::pickups) << "Invalid activationType '" << type << "' in " << this->getIdentifier()->getName() << "." << endl; … … 173 155 The duration type of the Pickup as a string. 174 156 */ 175 void Pickup::setDurationType (const std::string& type)157 void Pickup::setDurationTypeAsString(const std::string& type) 176 158 { 177 159 if(type == Pickup::durationTypeOnce_s) 178 this-> durationType_ = pickupDurationType::once;160 this->setDurationType(pickupDurationType::once); 179 161 else if(type == Pickup::durationTypeContinuous_s) 180 this-> durationType_ = pickupDurationType::continuous;162 this->setDurationType(pickupDurationType::continuous); 181 163 else 182 164 orxout(internal_error, context::pickups) << "Invalid durationType '" << type << "' in " << this->getIdentifier()->getName() << "." << endl; … … 199 181 /** 200 182 @brief 201 Creates a duplicate of the OrxonoxClass.202 @param item203 A reference to the pointer of the item that we're duplicating.204 */205 void Pickup::clone(OrxonoxClass*& item)206 {207 if(item == NULL)208 item = new Pickup(this);209 210 SUPER(Pickup, clone, item);211 212 Pickup* pickup = dynamic_cast<Pickup*>(item);213 pickup->setActivationTypeDirect(this->getActivationTypeDirect());214 pickup->setDurationTypeDirect(this->getDurationTypeDirect());215 216 pickup->initializeIdentifier();217 }218 219 /**220 @brief221 183 Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 222 This method must be implemented by any class directly inheriting from Pickupable. It is most easily done by just creating a new DroppedPickup, e.g.:223 DroppedPickup(BaseObject* creator, Pickupable* pickup, const Vector3& position);224 184 @return 225 185 Returns true if a spawner was created, false if not. … … 227 187 bool Pickup::createSpawner(void) 228 188 { 229 newDroppedPickup(this, this, this->getCarrier());189 PickupSpawner::createDroppedPickup(this, this, this->getCarrier()); 230 190 return true; 231 191 } -
code/trunk/src/modules/pickup/Pickup.h
r8108 r9348 105 105 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); 106 106 107 virtual const std::string& getRepresentationName() const 108 { return this->representationName_; } 109 107 110 /** 108 111 @brief Get the activation type of the Pickup. 109 112 @return Returns the activation type of the Pickup. 110 113 */ 111 inline pickupActivationType::Value getActivationType Direct(void) const114 inline pickupActivationType::Value getActivationType(void) const 112 115 { return this->activationType_; } 113 116 /** … … 115 118 @return Returns the duration type of the Pickup. 116 119 */ 117 inline pickupDurationType::Value getDurationType Direct(void) const120 inline pickupDurationType::Value getDurationType(void) const 118 121 { return this->durationType_; } 119 122 120 const std::string& getActivationType (void) const; //!< Get the activation type of the Pickup.121 const std::string& getDurationType (void) const; //!< Get the duration type of the Pickup.123 const std::string& getActivationTypeAsString(void) const; //!< Get the activation type of the Pickup. 124 const std::string& getDurationTypeAsString(void) const; //!< Get the duration type of the Pickup. 122 125 123 126 /** … … 126 129 */ 127 130 inline bool isImmediate(void) const 128 { return this->getActivationType Direct() == pickupActivationType::immediate; }131 { return this->getActivationType() == pickupActivationType::immediate; } 129 132 /** 130 133 @brief Get whether the activation type is 'onUse'. … … 132 135 */ 133 136 inline bool isOnUse(void) const 134 { return this->getActivationType Direct() == pickupActivationType::onUse; }137 { return this->getActivationType() == pickupActivationType::onUse; } 135 138 /** 136 139 @brief Get whether the duration type is 'once'. … … 138 141 */ 139 142 inline bool isOnce(void) const 140 { return this->getDurationType Direct() == pickupDurationType::once; }143 { return this->getDurationType() == pickupDurationType::once; } 141 144 /** 142 145 @brief Get whether the duration type is 'continuous'. … … 144 147 */ 145 148 inline bool isContinuous(void) const 146 { return this->getDurationType Direct() == pickupDurationType::continuous; }149 { return this->getDurationType() == pickupDurationType::continuous; } 147 150 148 151 virtual void changedPickedUp(void); //!< Should be called when the pickup has transited from picked up to dropped or the other way around. 149 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the OrxonoxClass.150 152 151 153 protected: 152 v oid initializeIdentifier(void);154 virtual bool createSpawner(void); //!< Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 153 155 154 virtual bool createSpawner(void); //!< Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 156 /** 157 @brief Sets the representation name which refers to the name of the PickupRepresentation that is used to represent this pickup. 158 */ 159 inline void setRepresentationName(const std::string& name) 160 { this->representationName_ = name; } 155 161 156 162 /** … … 158 164 @param type The activation type of the Pickup. 159 165 */ 160 inline void setActivationType Direct(pickupActivationType::Value type)166 inline void setActivationType(pickupActivationType::Value type) 161 167 { this->activationType_ = type; } 162 168 /** … … 164 170 @param type The duration type of the Pickup. 165 171 */ 166 inline void setDurationType Direct(pickupDurationType::Value type)172 inline void setDurationType(pickupDurationType::Value type) 167 173 { this->durationType_ = type; } 168 174 169 void setActivationType (const std::string& type); //!< Set the activation type of the Pickup.170 void setDurationType (const std::string& type); //!< Set the duration type of the Pickup.175 void setActivationTypeAsString(const std::string& type); //!< Set the activation type of the Pickup. 176 void setDurationTypeAsString(const std::string& type); //!< Set the duration type of the Pickup. 171 177 172 178 private: 173 179 void initialize(void); //!< Initializes the member variables. 174 180 181 std::string representationName_; //!< The name of the associated PickupRepresentation. 175 182 pickupActivationType::Value activationType_; //!< The activation type of the Pickup. 176 183 pickupDurationType::Value durationType_; //!< The duration type of the Pickup. -
code/trunk/src/modules/pickup/PickupCollection.cc
r8305 r9348 38 38 39 39 #include "CollectiblePickup.h" 40 #include "DroppedPickup.h" 41 #include "PickupCollectionIdentifier.h" 40 #include "PickupSpawner.h" 42 41 43 42 #include "PickupCollection.h" … … 54 53 The creator of the object. 55 54 */ 56 PickupCollection::PickupCollection(BaseObject* creator) : BaseObject(creator) , pickupCollectionIdentifier_(NULL)55 PickupCollection::PickupCollection(BaseObject* creator) : BaseObject(creator) 57 56 { 58 57 RegisterObject(PickupCollection); 59 58 60 this->pickupCollectionIdentifier_ = new PickupCollectionIdentifier(this);61 this->usedCounter_ = 0;62 this->pickedUpCounter_ = 0;63 this->disabledCounter_ = 0;64 59 this->processingUsed_ = false; 65 60 this->processingPickedUp_ = false; … … 70 65 Destructor. Iterates through all Pickupables this PickupCollection consists of and destroys them if they haven't been already. 71 66 */ 72 PickupCollection::~ 67 PickupCollection::~PickupCollection() 73 68 { 74 69 // Destroy all Pickupables constructing this PickupCollection. 75 for(std:: vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)76 { 77 (*it)-> removeFromCollection();70 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 71 { 72 (*it)->wasRemovedFromCollection(); 78 73 (*it)->destroy(); 79 74 } 80 75 this->pickups_.clear(); 81 82 if(this->pickupCollectionIdentifier_ != NULL)83 delete this->pickupCollectionIdentifier_;84 76 } 85 77 … … 92 84 SUPER(PickupCollection, XMLPort, xmlelement, mode); 93 85 86 XMLPortParam(PickupCollection, "representation", setRepresentationName, getRepresentationName, xmlelement, mode); 94 87 XMLPortObject(PickupCollection, CollectiblePickup, "pickupables", addPickupable, getPickupable, xmlelement, mode); 95 96 this->initializeIdentifier();97 }98 99 /**100 @brief101 Initializes the PickupIdentifier for this pickup.102 */103 void PickupCollection::initializeIdentifier(void)104 {105 for(std::vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)106 {107 this->pickupCollectionIdentifier_->addPickup((*it)->getPickupIdentifier());108 }109 88 } 110 89 … … 120 99 this->processingUsed_ = true; 121 100 // Change used for all Pickupables this PickupCollection consists of. 122 for(std:: vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)101 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 123 102 (*it)->setUsed(this->isUsed()); 124 103 … … 138 117 return; 139 118 119 size_t numPickupsEnabled = 0; 120 size_t numPickupsInUse = 0; 121 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 122 { 123 if ((*it)->isEnabled()) 124 ++numPickupsEnabled; 125 if ((*it)->isUsed()) 126 ++numPickupsInUse; 127 } 128 140 129 // If all the pickups are not in use but the PickupCollection is. 141 if( this->usedCounter_== 0 && this->isUsed())130 if(numPickupsInUse == 0 && this->isUsed()) 142 131 this->setUsed(false); 143 132 144 133 // If all the enabled pickups are in use but the PickupCollection is not. 145 if( this->usedCounter_ != 0 && this->usedCounter_ == this->pickups_.size()-this->disabledCounter_&& !this->isUsed())134 if(numPickupsInUse > 0 && numPickupsInUse == numPickupsEnabled && !this->isUsed()) 146 135 this->setUsed(true); 147 136 } … … 157 146 158 147 // Change the PickupCarrier for all Pickupables this PickupCollection consists of. 159 for(std:: vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)148 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 160 149 { 161 150 if(this->getCarrier() == NULL) … … 177 166 this->processingPickedUp_ = true; 178 167 // Change the pickedUp status for all Pickupables this PickupCollection consists of. 179 for(std:: vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)180 (* it)->setPickedUp(this->isPickedUp());168 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ) 169 (*(it++))->setPickedUp(this->isPickedUp()); 181 170 182 171 this->processingPickedUp_ = false; … … 195 184 return; 196 185 197 // If at least all the enabled pickups of this PickupCollection are no longer picked up. 198 if(this->pickedUpCounter_ <= this->disabledCounter_ && this->isPickedUp()) 186 // If at least all the enabled pickups of this PickupCollection are no longer picked up. 187 bool isOnePickupEnabledAndPickedUp = false; 188 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 189 { 190 if ((*it)->isEnabled() && (*it)->isPickedUp()) 191 { 192 isOnePickupEnabledAndPickedUp = true; 193 break; 194 } 195 } 196 if(!isOnePickupEnabledAndPickedUp && this->isPickedUp()) 199 197 this->Pickupable::destroy(); 200 201 // If the PickupCollection is no longer picked up.202 if(!this->isPickedUp())203 this->pickedUpCounter_ = 0;204 }205 206 /**207 @brief208 Creates a duplicate of the input Pickupable.209 This method needs to be implemented by any Class inheriting from Pickupable.210 @param item211 A reference to a pointer to the OrxonoxClass that is to be duplicated.212 */213 void PickupCollection::clone(OrxonoxClass*& item)214 {215 if(item == NULL)216 item = new PickupCollection(this);217 218 SUPER(PickupCollection, clone, item);219 220 PickupCollection* pickup = dynamic_cast<PickupCollection*>(item);221 // Clone all Pickupables this PickupCollection consist of.222 for(std::vector<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)223 {224 Pickupable* newPickup = (*it)->clone();225 CollectiblePickup* collectible = static_cast<CollectiblePickup*>(newPickup);226 pickup->addPickupable(collectible);227 }228 229 pickup->initializeIdentifier();230 198 } 231 199 … … 240 208 bool PickupCollection::isTarget(const PickupCarrier* carrier) const 241 209 { 242 for(std:: vector<CollectiblePickup*>::const_iterator it = this->pickups_.begin(); it != this->pickups_.end(); it++)210 for(std::list<CollectiblePickup*>::const_iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 243 211 { 244 212 if(!carrier->isTarget(*it)) … … 247 215 248 216 return true; 249 }250 251 /**252 @brief253 Get the PickupIdentifier of this PickupCollection.254 This is in fact the PickupCollectionIdentifier.255 @return256 Returns a pointer to the PickupIdentifier of this PickupCollection.257 */258 const PickupIdentifier* PickupCollection::getPickupIdentifier(void) const259 {260 return this->pickupCollectionIdentifier_;261 217 } 262 218 … … 274 230 return false; 275 231 276 pickup->addToCollection(this);277 232 this->pickups_.push_back(pickup); 233 pickup->wasAddedToCollection(this); 234 this->pickupsChanged(); 278 235 return true; 279 236 } … … 289 246 const Pickupable* PickupCollection::getPickupable(unsigned int index) const 290 247 { 291 return this->pickups_[index]; 248 if(this->pickups_.size() >= index) 249 return NULL; 250 251 std::list<CollectiblePickup*>::const_iterator it = this->pickups_.begin(); 252 std::advance(it, index); 253 return *it; 254 } 255 256 /** 257 @brief 258 Removes the Pickup from the Collection. 259 @param pickup 260 The Pickup to be removed. 261 @return 262 Returns true if the pickup was in the collection. 263 */ 264 bool PickupCollection::removePickupable(CollectiblePickup* pickup) 265 { 266 for(std::list<CollectiblePickup*>::iterator it = this->pickups_.begin(); it != this->pickups_.end(); ++it) 267 { 268 if (*it == pickup) 269 { 270 this->pickups_.erase(it); 271 pickup->wasRemovedFromCollection(); 272 this->pickupsChanged(); 273 return true; 274 } 275 } 276 return false; 292 277 } 293 278 … … 297 282 This is used internally by the CollectiblePickup class. 298 283 @param changed 299 The value the used status has changed to. 284 The value the used status has changed to. 300 285 */ 301 286 void PickupCollection::pickupChangedUsed(bool changed) 302 287 { 303 if(changed)304 this->usedCounter_++;305 else306 this->usedCounter_--;307 308 288 this->changedUsedAction(); 309 289 } … … 318 298 void PickupCollection::pickupChangedPickedUp(bool changed) 319 299 { 320 if(changed)321 this->pickedUpCounter_++;322 else323 this->pickedUpCounter_--;324 325 300 this->changedPickedUpAction(); 326 301 } … … 333 308 void PickupCollection::pickupDisabled(void) 334 309 { 335 this->disabledCounter_++; 310 } 311 312 /** 313 @brief 314 Helpfer function if the number of pickups in this collection has changed. 315 */ 316 void PickupCollection::pickupsChanged(void) 317 { 318 this->changedUsedAction(); 319 this->changedPickedUpAction(); 336 320 } 337 321 … … 339 323 @brief 340 324 Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 341 This method must be implemented by any class directly inheriting from Pickupable. It is most easily done by just creating a new DroppedPickup, e.g.:342 DroppedPickup(BaseObject* creator, Pickupable* pickup, const Vector3& position);343 325 @return 344 326 Returns true if a spawner was created, false if not. … … 346 328 bool PickupCollection::createSpawner(void) 347 329 { 348 newDroppedPickup(this, this, this->getCarrier());330 PickupSpawner::createDroppedPickup(this, this, this->getCarrier()); 349 331 return true; 350 332 } -
code/trunk/src/modules/pickup/PickupCollection.h
r8351 r9348 50 50 The PickupCollection combines different @ref orxonox::Pickupable "Pickupables" (more precisely @ref orxonox::CollectiblePickup "CollectiblePickups") to a coherent, single pickup and makes them seem (from the outside looking in) just as if they were just one @ref orxonox::Pickupable "Pickupable". 51 51 52 To differentiate between different types of @ref orxonox::PickupCollection "PickupCollections" (just as we differentiate between different types of @ref orxonox::Pickupable "Pickupables") we define a new identifyer called the @ref orxonox::PickupCollectionIdentifier "PickupCollectionIdentifier" which has pretty much the same properties as the @ref orxonox::PickupIdentifier "PickupIdentifier" but extende to @ref orxonox::PickupCollection "PickupCollections".53 54 52 A PickupCollection can be created in XML as follows: 55 53 @code … … 81 79 virtual void changedPickedUp(void); //!< Is called when the pickup has transited from picked up to dropped or the other way around. 82 80 83 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input pickup.84 85 81 virtual bool isTarget(const PickupCarrier* carrier) const; //!< Get whether a given class, represented by the input Identifier, is a target of this PickupCollection. 86 82 87 virtual const PickupIdentifier* getPickupIdentifier(void) const; //!< Get the PickupIdentifier of this PickupCollection. 83 inline void setRepresentationName(const std::string& name) 84 { this->representationName_ = name; } 85 virtual const std::string& getRepresentationName() const 86 { return this->representationName_; } 88 87 89 88 bool addPickupable(CollectiblePickup* pickup); //!< Add the input Pickupable to list of Pickupables combined by this PickupCollection. 90 89 const Pickupable* getPickupable(unsigned int index) const; //!< Get the Pickupable at the given index. 90 bool removePickupable(CollectiblePickup* pickup); //!< Removes the input Pickupable from the list of Pickupables in this PickupCollection. 91 92 inline const std::list<CollectiblePickup*>& getPickups() const 93 { return this->pickups_; } 91 94 92 95 void pickupChangedUsed(bool changed); //!< Informs the PickupCollection, that one of its pickups has changed its used status to the input value. … … 95 98 96 99 protected: 97 void initializeIdentifier(void); //!< Initializes the PickupIdentifier for this pickup.98 99 100 virtual bool createSpawner(void); //!< Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 100 101 PickupCollectionIdentifier* pickupCollectionIdentifier_; //!< The PickupCollectionIdentifier of this PickupCollection. Is used to distinguish different PickupCollections amongst themselves.102 101 103 102 private: 104 103 void changedUsedAction(void); //!< Helper method. 105 104 void changedPickedUpAction(void); //!< Helper method. 105 void pickupsChanged(void); //!< Helper method. 106 106 107 std::vector<CollectiblePickup*> pickups_; //!< The list of the pointers of all the Pickupables this PickupCollection consists of. They are weak pointers to facilitate testing, whether the pointers are still valid. 108 109 unsigned int usedCounter_; //!< Keeps track of the number of pickups of this PickupCollection, that are in use. 110 unsigned int pickedUpCounter_; //!< Keeps track of the number of pickups of this PickupCollection, that are picked up. 111 unsigned int disabledCounter_; //!< Keeps track of the number of pickups of this PickupCollection, that are disabled. 107 std::string representationName_; //!< The name of the associated PickupRepresentation. 108 std::list<CollectiblePickup*> pickups_; //!< The list of the pointers of all the Pickupables this PickupCollection consists of. They are weak pointers to facilitate testing, whether the pointers are still valid. 112 109 113 110 bool processingUsed_; //!< Boolean to ensure, that the PickupCollection doesn't update its used status while its internal state is inconsistent. -
code/trunk/src/modules/pickup/PickupManager.cc
r8858 r9348 87 87 88 88 this->representations_.clear(); 89 this->representationsNetworked_.clear();90 89 91 90 // Destroying all the PickupInventoryContainers that are still there. … … 106 105 /** 107 106 @brief 108 Registers a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents, on the server (or in standalone mode). 109 For every type of Pickupable (uniquely identified by a PickupIdentifier) there can be one (and just one) PickupRepresentation registered. 110 @param identifier 111 The PickupIdentifier identifying the Pickupable. 107 Registers a PickupRepresentation. 108 @param name 109 The representation's name. 112 110 @param representation 113 111 A pointer to the PickupRepresentation. … … 115 113 Returns true if successful and false if not. 116 114 */ 117 bool PickupManager::registerRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation) 118 { 119 assert(identifier); 115 bool PickupManager::registerRepresentation(const std::string& name, PickupRepresentation* representation) 116 { 120 117 assert(representation); 121 118 122 119 // If the list is not empty and Pickupable already has a Representation registered. 123 if(!this->representations_.empty() && this->representations_.find( identifier) != this->representations_.end())120 if(!this->representations_.empty() && this->representations_.find(name) != this->representations_.end()) 124 121 return false; 125 122 126 this->representations_[ identifier] = representation;123 this->representations_[name] = representation; 127 124 128 125 orxout(verbose, context::pickups) << "PickupRepresentation &" << representation << " registered with the PickupManager." << endl; … … 132 129 /** 133 130 @brief 134 Unegisters a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents, on the server (or in standalone mode). 135 @param identifier 136 The PickupIdentifier identifying the Pickupable. 137 @param representation 138 A pointer to the PickupRepresentation. 131 Unegisters a PickupRepresentation. 132 @param name 133 The representation's name. 139 134 @return 140 135 Returns true if successful and false if not. 141 136 */ 142 bool PickupManager::unregisterRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation) 143 { 144 assert(identifier); 145 assert(representation); 146 147 std::map<const PickupIdentifier*, PickupRepresentation*, PickupIdentifierCompare>::iterator it = this->representations_.find(identifier); 137 bool PickupManager::unregisterRepresentation(const std::string& name) 138 { 139 std::map<std::string, PickupRepresentation*>::iterator it = this->representations_.find(name); 148 140 if(it == this->representations_.end()) // If the Pickupable is not registered in the first place. 149 141 return false; … … 151 143 this->representations_.erase(it); 152 144 153 orxout(verbose, context::pickups) << "PickupRepresentation &" << representation<< " unregistered with the PickupManager." << endl;145 orxout(verbose, context::pickups) << "PickupRepresentation &" << name << " unregistered with the PickupManager." << endl; 154 146 return true; 155 147 } … … 157 149 /** 158 150 @brief 159 Registers a PickupRepresentation on the host it was created. 160 @param representation 161 A pointer to the PickupRepresentation. 162 @return 163 Returns true if successful, false if not. 164 */ 165 bool PickupManager::registerRepresentation(PickupRepresentation* representation) 166 { 167 assert(representation); 168 169 // If the list is not empty and PickupRepresentation is already registered. 170 if(!this->representationsNetworked_.empty() && this->representationsNetworked_.find(representation->getObjectID()) != this->representationsNetworked_.end()) 171 return false; 172 173 this->representationsNetworked_[representation->getObjectID()] = representation; 174 return true; 175 } 176 177 /** 178 @brief 179 Unregisters a PickupRepresentation on the host it is being destroyed (which is the same host on which it was created). 180 @param representation 181 A pointer to the Pickuprepresentation. 182 @return 183 Returns true if successful, false if not. 184 */ 185 bool PickupManager::unregisterRepresentation(PickupRepresentation* representation) 186 { 187 assert(representation); 188 189 std::map<uint32_t, PickupRepresentation*>::iterator it = this->representationsNetworked_.find(representation->getObjectID()); 190 if(it == this->representationsNetworked_.end()) // If the Pickupable is not registered in the first place. 191 return false; 192 193 this->representationsNetworked_.erase(it); 194 return true; 195 } 196 197 /** 198 @brief 199 Get the PickupRepresentation representing the Pickupable with the input PickupIdentifier. 200 @param identifier 201 The PickupIdentifier. 151 Get the PickupRepresentation with the given name. 152 @param name 153 The name of the PickupRepresentation. 202 154 @return 203 155 Returns a pointer to the PickupRepresentation. 204 156 */ 205 PickupRepresentation* PickupManager::getRepresentation(const PickupIdentifier* identifier)206 { 207 std::map< const PickupIdentifier*, PickupRepresentation*, PickupIdentifierCompare>::iterator it = this->representations_.find(identifier);208 if(it == this->representations_.end()) // If there is no PickupRepresentation associated with the input PickupIdentifier.157 PickupRepresentation* PickupManager::getRepresentation(const std::string& name) 158 { 159 std::map<std::string, PickupRepresentation*>::iterator it = this->representations_.find(name); 160 if(it == this->representations_.end()) // If there is no PickupRepresentation associated with the input name. 209 161 { 210 162 orxout(verbose, context::pickups) << "PickupManager::getRepresentation() returned default representation." << endl; … … 353 305 { 354 306 // If there is no PickupRepresentation registered the default representation is used. 355 if(this->representations_.find(pickup->get PickupIdentifier()) == this->representations_.end())356 PickupManager::pickupChangedPickedUpNetwork(index, pickup->isUsable(), this->defaultRepresentation_->getObjectID(), pick edUp);307 if(this->representations_.find(pickup->getRepresentationName()) == this->representations_.end()) 308 PickupManager::pickupChangedPickedUpNetwork(index, pickup->isUsable(), this->defaultRepresentation_->getObjectID(), pickup->getRepresentationName(), pickedUp); 357 309 else 358 PickupManager::pickupChangedPickedUpNetwork(index, pickup->isUsable(), this->representations_[pickup->get PickupIdentifier()]->getObjectID(), pickedUp);310 PickupManager::pickupChangedPickedUpNetwork(index, pickup->isUsable(), this->representations_[pickup->getRepresentationName()]->getObjectID(), pickup->getRepresentationName(), pickedUp); 359 311 } 360 312 // If the concerned host is somewhere in the network, we call pickupChangedPickedUpNetwork() on its PickupManager. … … 362 314 { 363 315 // If there is no PickupRepresentation registered the default representation is used. 364 if(this->representations_.find(pickup->get PickupIdentifier()) == this->representations_.end())316 if(this->representations_.find(pickup->getRepresentationName()) == this->representations_.end()) 365 317 { 366 318 callStaticNetworkFunction(PickupManager::pickupChangedPickedUpNetwork, clientId, index, pickup->isUsable(), this->defaultRepresentation_->getObjectID(), pickedUp); … … 368 320 else 369 321 { 370 callStaticNetworkFunction(PickupManager::pickupChangedPickedUpNetwork, clientId, index, pickup->isUsable(), this->representations_[pickup->get PickupIdentifier()]->getObjectID(), pickedUp);322 callStaticNetworkFunction(PickupManager::pickupChangedPickedUpNetwork, clientId, index, pickup->isUsable(), this->representations_[pickup->getRepresentationName()]->getObjectID(), pickedUp); 371 323 } 372 324 } … … 388 340 The pickedUp status the Pickupable changed to. 389 341 */ 390 /*static*/ void PickupManager::pickupChangedPickedUpNetwork(uint32_t pickup, bool usable, uint32_t representationObjectId, bool pickedUp)342 /*static*/ void PickupManager::pickupChangedPickedUpNetwork(uint32_t pickup, bool usable, uint32_t representationObjectId, const std::string& representationName, bool pickedUp) 391 343 { 392 344 PickupManager& manager = PickupManager::getInstance(); // Get the PickupManager singleton on this host. … … 402 354 container->unusable = false; 403 355 container->representationObjectId = representationObjectId; 356 container->representationName = representationName; 404 357 // Insert the container into the pickupInventoryContainers_ list. 405 358 manager.pickupInventoryContainers_.insert(std::pair<uint32_t, PickupInventoryContainer*>(pickup, container)); … … 417 370 manager.updateGUI(); // Tell the PickupInventory that something has changed. 418 371 } 419 }420 421 /**422 @brief423 Get the PickupRepresentation of an input Pickupable.424 This method spares us the hassle to export the PickupIdentifier class to lua.425 @param pickup426 The number identifying the Pickupable whose PickupRepresentation should be returned.427 @return428 Returns the PickupRepresentation of the input Pickupable or NULL if an error occurred.429 */430 orxonox::PickupRepresentation* PickupManager::getPickupRepresentation(uint32_t pickup)431 {432 // Clear and rebuild the representationsNetworked_ list.433 //TODO: Better solution?434 this->representationsNetworked_.clear();435 for(ObjectList<PickupRepresentation>::iterator it = ObjectList<PickupRepresentation>::begin(); it != ObjectList<PickupRepresentation>::end(); ++it)436 this->representationsNetworked_[it->getObjectID()] = *it;437 438 // Get the container belonging to the input pickup, if not found return the default representation.439 std::map<uint32_t, PickupInventoryContainer*>::iterator it = this->pickupInventoryContainers_.find(pickup);440 if(it == this->pickupInventoryContainers_.end())441 return this->defaultRepresentation_;442 443 // Get the PickupRepresentation of the input pickup (through the objecId of the representation stored in the PickupInventoryContainer belonging to the pickup), if not found return the default representation.444 std::map<uint32_t, PickupRepresentation*>::iterator it2 = this->representationsNetworked_.find(it->second->representationObjectId);445 if(it2 == this->representationsNetworked_.end())446 return this->defaultRepresentation_;447 448 return it2->second;449 372 } 450 373 -
code/trunk/src/modules/pickup/PickupManager.h
r8706 r9348 41 41 #include "core/WeakPtr.h" 42 42 43 #include "pickup/PickupIdentifier.h"44 45 43 #include "PickupRepresentation.h" 46 44 … … 67 65 bool unusable; //!< Whether the @ref orxonox::Pickupable "Pickupable" is droppable. 68 66 uint32_t representationObjectId; //!< The objectId of the @ref orxonox::PickupRepresentation "PickupRepresentation" that represents the @ref orxonox::Pickupable "Pickupable". 67 std::string representationName; //!< The name of the associated PickupRepresentation 69 68 }; 70 69 // tolua_end … … 74 73 The PickupManager class manages @ref orxonox::Pickupable "Pickupables". 75 74 76 It has in essence two tasks to fulfill. Firstly it must link @ref orxonox::Pickupable "Pickupables" (through their @ref orxonox::PickupIdentifier "PickupIdentifiers") to theirrespective @ref orxonox::PickupRepresentation "PickupRepresentations". Secondly it manages the PickupInventory. (The PickupInventory is the GUI that displays @ref orxonox::Pickupable "Pickupables" for the covenience of the user.)75 It has in essence two tasks to fulfill. Firstly it must link @ref orxonox::Pickupable "Pickupables" (through their representation-name attribute) to the respective @ref orxonox::PickupRepresentation "PickupRepresentations". Secondly it manages the PickupInventory. (The PickupInventory is the GUI that displays @ref orxonox::Pickupable "Pickupables" for the covenience of the user.) 77 76 78 77 @section PickupManagerTechnicalDetails Technical details … … 86 85 87 86 Firstly there are a number of lists (where by list I really mean any kind of ordered data structure) kept. 88 - The @ref orxonox::PickupManager::representations_ "representations_" list links @ref orxonox::PickupRepresentation "PickupRepresentations" with @ref orxonox::PickupIdentifier "PickupIdentifiers" and can be used to get the @ref orxonox::PickupRepresentation "PickupRepresentation" for a given @ref orxonox::Pickupable "Pickupable". It is only populated on the server (or in standalone mode). Each @ref orxonox::PickupRepresentation "PickupRepresentation" that is generated through XML registers itself with the PickupManager and is thereby added to the list. 89 - The @ref orxonox::PickupManager::representationsNetworked_ "representationsNetworked_" list is the networked (hence the name) equivalent to the @ref orxonox::PickupManager::representations_ "representations_" list. It links an objectId of a @ref orxonox::PickupRepresentation "PickupRepresentation" to a @ref orxonox::PickupRepresentation "PickupRepresentation". This list is maintained on all hosts, each representation registers itself (in its constructor) with the PickupManager. Since the representations are synchronised they are created on each host. The "same" instance on each host is identified by the same objectId and that is why we store the representations with the objectId as key. We can then use this list to get a @ref orxonox::PickupRepresentation "PickupRepresentation" for a specific @ref orxonox::Pickupable "Pickupable" (or more precisely a number identifiying that particular pickup, but we'll see that, when we look at the next list) on a client to be used in the PickupInventory. 87 - The @ref orxonox::PickupManager::representations_ "representations_" list links @ref orxonox::PickupRepresentation "PickupRepresentations" with its name and can be used to get the @ref orxonox::PickupRepresentation "PickupRepresentation" for a given @ref orxonox::Pickupable "Pickupable". It is only populated on the server (or in standalone mode). Each @ref orxonox::PickupRepresentation "PickupRepresentation" that is generated through XML registers itself with the PickupManager and is thereby added to the list. 90 88 - The @ref orxonox::PickupManager::pickupInventoryContainers_ "pickupInventoryContainers_" list links a number identifying a @ref orxonox::Pickupable "Pickupable" to a data structure (the @ref orxonox::PickupInventoryContainer "PickupInventoryContainer"), which contains all necessary information about that @ref orxonox::Pickupable "Pickupable". This list is maintained on all hosts, a new container is inserted when a @ref orxonox::Pickupable "Pickupable" is picked up, but only if it has been picked up by the repsective host. This list is then used by the PickupInventory to access the required information and to get the correct @ref orxonox::PickupRepresentation "PickupRepresentation". 91 89 - The @ref orxonox::PickupManager::pickups_ "pickups_" list links a number identifiying a @ref orxonox::Pickupable "Pickupable" to a (weak pointer to a) @ref orxonox::Pickupable "Pickupable". It is only maintained by the server (or in standalone mode), to be able to use, unuse and drop @ref orxonox::Pickupable "Pickupables" through the PickupInventory. Since @ref orxonox::Pickupable "Pickupables" only exist on the server a client that wants to change a pickups status has so send a request over the network (with the number identifying the pickup) to the server and then the server facilitates the change, using this list to map from the identifyer to the actual @ref orxonox::Pickupable "Pickupable". … … 114 112 static PickupManager& getInstance() { return Singleton<PickupManager>::getInstance(); } // tolua_export 115 113 116 bool registerRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation); //!< Registers a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents.117 bool unregisterRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation); //!< Unegisters a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents.114 bool registerRepresentation(const std::string& name, PickupRepresentation* representation); 115 bool unregisterRepresentation(const std::string& name); 118 116 119 bool registerRepresentation(PickupRepresentation* representation); //!< Registers a PickupRepresentation on the host it was created. 120 bool unregisterRepresentation(PickupRepresentation* representation); //!< Unregisters a PickupRepresentation on the host it is being destroyed. 121 122 PickupRepresentation* getRepresentation(const PickupIdentifier* identifier); //!< Get the PickupRepresentation representing the Pickupable with the input PickupIdentifier. 117 PickupRepresentation* getRepresentation(const std::string& name); // tolua_export 123 118 124 119 virtual void pickupChangedUsed(Pickupable* pickup, bool used); //!< Is called by the PickupListener to notify the PickupManager, that the input Pickupable has transited to the input used state. 125 120 static void pickupChangedUsedNetwork(uint32_t pickup, bool inUse, bool usable, bool unusable); //!< Helper method to react to the change in the used status of a Pickupable. 126 121 virtual void pickupChangedPickedUp(Pickupable* pickup, bool pickedUp); //!< Is called by the PickupListener to notify the PickupManager, that the input Pickupable has transited to the input pickedUp state. 127 static void pickupChangedPickedUpNetwork(uint32_t pickup, bool usable, uint32_t representationObjectId, bool pickedUp); //!< Helper method to react to the change in the pickedUp status of a Pickupable.122 static void pickupChangedPickedUpNetwork(uint32_t pickup, bool usable, uint32_t representationObjectId, const std::string& representationName, bool pickedUp); //!< Helper method to react to the change in the pickedUp status of a Pickupable. 128 123 129 124 // Methods to be used by the PickupInventory. 130 125 public: 131 126 // tolua_begin 132 orxonox::PickupRepresentation* getPickupRepresentation(uint32_t pickup); //!< Get the PickupRepresentation of an input indentifier for Pickupable.133 134 127 int getNumPickups(void); //!< Get the number of pickups currently picked up by the player. 135 128 /** … … 163 156 PickupRepresentation* defaultRepresentation_; //!< The default PickupRepresentation. 164 157 165 std::map<const PickupIdentifier*, PickupRepresentation*, PickupIdentifierCompare> representations_; //!< Map linking PickupIdentifiers (representing types of Pickupables) and PickupRepresentations. 166 std::map<uint32_t, PickupRepresentation*> representationsNetworked_; //!< Map linking the PickupRepresentation's objectId to the PickupRepresentation itself. It is used for networking purposes. 158 std::map<std::string, PickupRepresentation*> representations_; //!< Map linking PickupRepresentations and their names. 167 159 168 160 std::map<uint32_t, PickupInventoryContainer*> pickupInventoryContainers_; //!< Map linking a number identifying a Pickupable to a PickupInventoryContainer, which contains all necessary information about that Pickupable. -
code/trunk/src/modules/pickup/PickupPrereqs.h
r8706 r9348 70 70 71 71 class CollectiblePickup; 72 class DroppedPickup;73 72 class Pickup; 74 73 class PickupCollection; 75 class PickupCollectionIdentifier;76 74 class PickupManager; 77 75 class PickupRepresentation; … … 86 84 class ShieldPickup; 87 85 class ShrinkPickup; 88 86 class DamageBoostPickup; 89 87 } 90 88 -
code/trunk/src/modules/pickup/PickupRepresentation.cc
r8858 r9348 52 52 This is primarily for use of the PickupManager in creating a default PickupRepresentation. 53 53 */ 54 PickupRepresentation::PickupRepresentation() : BaseObject(NULL), Synchronisable(NULL), spawnerRepresentation_(NULL) , pickup_(NULL)54 PickupRepresentation::PickupRepresentation() : BaseObject(NULL), Synchronisable(NULL), spawnerRepresentation_(NULL) 55 55 { 56 56 RegisterObject(PickupRepresentation); … … 64 64 Default Constructor. Registers the object and initializes its member variables. 65 65 */ 66 PickupRepresentation::PickupRepresentation(BaseObject* creator) : BaseObject(creator), Synchronisable(creator), spawnerRepresentation_(NULL) , pickup_(NULL)66 PickupRepresentation::PickupRepresentation(BaseObject* creator) : BaseObject(creator), Synchronisable(creator), spawnerRepresentation_(NULL) 67 67 { 68 68 RegisterObject(PickupRepresentation); … … 70 70 this->initialize(); 71 71 this->registerVariables(); 72 73 PickupManager::getInstance().registerRepresentation(this); // Registers the PickupRepresentation with the PickupManager.74 72 } 75 73 … … 84 82 85 83 if(this->isInitialized()) 86 { 87 if(GameMode::isMaster() && this->pickup_ != NULL) 88 { 89 PickupManager::getInstance().unregisterRepresentation(this->pickup_->getPickupIdentifier(), this); 90 } 91 PickupManager::getInstance().unregisterRepresentation(this); 92 } 84 PickupManager::getInstance().unregisterRepresentation(this->getName()); 93 85 } 94 86 … … 128 120 XMLPortParam(PickupRepresentation, "spawnerTemplate", setSpawnerTemplate, getSpawnerTemplate, xmlelement, mode); 129 121 XMLPortParam(PickupRepresentation, "inventoryRepresentation", setInventoryRepresentation, getInventoryRepresentation, xmlelement, mode); 130 XMLPortObject(PickupRepresentation, Pickupable, "pickup", setPickup, getPickup, xmlelement, mode);131 122 XMLPortObject(PickupRepresentation, StaticEntity, "spawner-representation", setSpawnerRepresentation, getSpawnerRepresentationIndex, xmlelement, mode); 132 133 if(GameMode::isMaster())134 {135 // Registers the PickupRepresentation with the PickupManager through the PickupIdentifier of the Pickupable it represents.136 PickupManager::getInstance().registerRepresentation(this->pickup_->getPickupIdentifier(), this);137 }138 139 if(this->spawnerRepresentation_ != NULL)140 this->spawnerRepresentation_->setVisible(false);141 123 142 124 orxout(verbose, context::pickups) << "PickupRepresentation created: name: '" << this->name_ << "', description: '" << this->description_ << "', spawnerTemplate: '" << this->spawnerTemplate_ << "'." << endl; … … 151 133 Returns a pointer to the StaticEntity. 152 134 */ 153 StaticEntity* PickupRepresentation:: getSpawnerRepresentation(PickupSpawner* spawner)135 StaticEntity* PickupRepresentation::createSpawnerRepresentation(PickupSpawner* spawner) 154 136 { 155 137 if(this->spawnerRepresentation_ == NULL) … … 158 140 if(this->spawnerTemplate_ == "") 159 141 { 160 orxout( verbose, context::pickups) << "PickupRepresentation: Spawner template is empty." << endl;142 orxout(internal_warning, context::pickups) << "PickupRepresentation: Spawner template is empty." << endl; 161 143 // If neither spawnerRepresentation nor spawnerTemplate was specified 162 144 return this->getDefaultSpawnerRepresentation(spawner); … … 165 147 } 166 148 167 StaticEntity* representation = this->spawnerRepresentation_; 168 representation->setVisible(true); 149 this->spawnerRepresentation_->setVisible(true); 150 StaticEntity* temp = this->spawnerRepresentation_; 151 this->spawnerRepresentation_ = NULL; 169 152 170 this->addTemplate(this->spawnerTemplate_);171 this->spawnerRepresentation_->setVisible(false);153 return temp; 154 } 172 155 173 return representation; 156 void PickupRepresentation::changedName() 157 { 158 // Registers the PickupRepresentation with the PickupManager. 159 PickupManager::getInstance().unregisterRepresentation(this->getOldName()); 160 PickupManager::getInstance().registerRepresentation(this->getName(), this); 161 } 162 163 void PickupRepresentation::setSpawnerRepresentation(StaticEntity* representation) 164 { 165 this->spawnerRepresentation_ = representation; 166 if(this->spawnerRepresentation_ != NULL) 167 this->spawnerRepresentation_->setVisible(false); 174 168 } 175 169 -
code/trunk/src/modules/pickup/PickupRepresentation.h
r7547 r9348 41 41 42 42 #include "interfaces/Pickupable.h" 43 #include "pickup/PickupIdentifier.h"44 43 #include "worldentities/StaticEntity.h" 45 44 … … 54 53 /** 55 54 @brief 56 The PickupRepresentation class represents a specific pickup type (identified by its @ref orxonox::PickupIdentifier "PickupIdentifier"). It defines the information displayed in the GUI (PickupInventory) and how @ref orxonox::PickupSpawner "PickupSpawners" that spawn the pickup type look like.55 The PickupRepresentation class represents a specific pickup type. It defines the information displayed in the GUI (PickupInventory) and how @ref orxonox::PickupSpawner "PickupSpawners" that spawn the pickup type look like. 57 56 They are created through XML and are registered with the @ref orxonox::PickupManager "PickupManager". 58 57 … … 64 63 spawnerTemplate = "awesomePickupRepresentation" 65 64 inventoryRepresentation = "AwesomePickup" 66 > 67 <pickup> 68 <SomePickup /> 69 </pickup> 70 </PickupRepresentation> 65 /> 71 66 @endcode 72 67 As you might have noticed, there is a parameter called <em>spawnerTemplate</em> and also another parameter called <em>inventoryRepresentation</em>. Let's first explain the second one, <em>inventoryRepresentation</em>. … … 133 128 */ 134 129 inline const std::string& getInventoryRepresentation(void) const { return this->inventoryRepresentation_; } // tolua_export 135 /**136 @brief Get the Pickupable represented by this PickupRepresentation.137 @param index The index.138 @return Returns (for index = 0) a pointer to the Pickupable. For index > 0 it returns NULL.139 */140 inline const Pickupable* getPickup(unsigned int index) const141 { if(index == 0) return this->pickup_; return NULL; }142 130 143 StaticEntity* getSpawnerRepresentation(PickupSpawner* spawner); //!< Get a spawnerRepresentation for a specific PickupSpawner. 131 virtual void changedName(); 132 133 StaticEntity* createSpawnerRepresentation(PickupSpawner* spawner); //!< Create a spawnerRepresentation for a specific PickupSpawner. 144 134 145 135 protected: … … 168 158 @param representation A pointer to the StaticEntity that is the spawnerRepresentation of this PickupRepresentation. 169 159 */ 170 inline void setSpawnerRepresentation(StaticEntity* representation)171 { this->spawnerRepresentation_ = representation; } 160 void setSpawnerRepresentation(StaticEntity* representation); 161 172 162 /** 173 163 @brief Set the image representing the pickup in the PickupInventory. … … 176 166 inline void setInventoryRepresentation(const std::string& image) 177 167 { this->inventoryRepresentation_ = image; } 178 /**179 @brief Set the Pickupable that is represented by this PickupRepresentation.180 @param pickup A pointer to the Pickupable.181 */182 inline void setPickup(Pickupable* pickup)183 { this->pickup_ = pickup; }184 168 185 169 private: … … 195 179 std::string inventoryRepresentation_; //!< The name of an image representing the pickup in the PickupInventory. 196 180 197 Pickupable* pickup_; //!< The Pickupable that is represented by this PickupRepresentation.198 199 181 }; // tolua_export 200 182 -
code/trunk/src/modules/pickup/PickupSpawner.cc
r8891 r9348 55 55 Pointer to the object which created this item. 56 56 */ 57 PickupSpawner::PickupSpawner(BaseObject* creator) : StaticEntity(creator), pickup_(NULL) 57 PickupSpawner::PickupSpawner(BaseObject* creator) : StaticEntity(creator), pickup_(NULL), representation_(NULL), pickupTemplate_(NULL) 58 58 { 59 59 RegisterObject(PickupSpawner); 60 60 61 61 this->initialize(); 62 }63 64 /**65 @brief66 Constructor, Creates a fully functional PickupSpawner.67 @param creator68 The creator of this PickupSpawner.69 @param pickup70 The Pickupable to be spawned by this PickupSpawner.71 @param triggerDistance72 The distance at which the PickupSpawner will trigger.73 @param respawnTime74 The minimum time between two spawns.75 @param maxSpawnedItems76 The maximum number of items spawned by this PickupSpawner.77 */78 PickupSpawner::PickupSpawner(BaseObject* creator, Pickupable* pickup, float triggerDistance, float respawnTime, int maxSpawnedItems) : StaticEntity(creator), pickup_(NULL)79 {80 RegisterObject(PickupSpawner);81 82 this->initialize();83 84 this->pickup_ = pickup;85 86 this->triggerDistance_ = triggerDistance;87 this->respawnTime_ = respawnTime;88 this->setMaxSpawnedItems(maxSpawnedItems);89 90 if(this->pickup_ == NULL)91 {92 orxout(internal_warning, context::pickups) << "A PickupSpawner was created without a valid Pickupable. This won't work." << endl;93 this->setActive(false);94 }95 else96 {97 PickupRepresentation* representation = PickupManager::getInstance().getRepresentation(this->pickup_->getPickupIdentifier());98 this->attach(representation->getSpawnerRepresentation(this));99 this->setActive(true);100 }101 62 } 102 63 … … 112 73 this->spawnsRemaining_ = INF; 113 74 this->selfDestruct_ = false; 75 76 this->setPickupable(NULL); 114 77 } 115 78 … … 122 85 if(this->isInitialized() && this->selfDestruct_ && this->pickup_ != NULL) 123 86 this->pickup_->destroy(); 87 } 88 89 /** 90 @brief 91 Factory method, Creates a fully functional PickupSpawner. 92 @param creator 93 The creator of this PickupSpawner. 94 @param pickup 95 The Pickupable to be spawned by this PickupSpawner. 96 @param carrier 97 The PickupCarrier that carried the input pickup before it was dropped. 98 @param triggerDistance 99 The distance at which the PickupSpawner will trigger. 100 */ 101 /*static*/ PickupSpawner* PickupSpawner::createDroppedPickup(BaseObject* creator, Pickupable* pickup, PickupCarrier* carrier, float triggerDistance) 102 { 103 PickupSpawner* spawner = new PickupSpawner(creator); 104 105 spawner->setPickupable(pickup); 106 spawner->setTriggerDistance(triggerDistance); 107 spawner->setMaxSpawnedItems(1); 108 109 spawner->setPosition(carrier->getCarrierPosition()); 110 spawner->block(carrier); 111 112 return spawner; 124 113 } 125 114 … … 136 125 SUPER(PickupSpawner, XMLPort, xmlelement, mode); 137 126 138 XMLPortObject(PickupSpawner, Pickupable, "pickup", setPickupable, getPickupable, xmlelement, mode); 139 127 XMLPortParam(PickupSpawner, "pickup", setPickupTemplateName, getPickupTemplateName, xmlelement, mode); 140 128 XMLPortParam(PickupSpawner, "triggerDistance", setTriggerDistance, getTriggerDistance, xmlelement, mode); 141 129 XMLPortParam(PickupSpawner, "respawnTime", setRespawnTime, getRespawnTime, xmlelement, mode); 142 130 XMLPortParam(PickupSpawner, "maxSpawnedItems", setMaxSpawnedItems, getMaxSpawnedItems, xmlelement, mode); 143 144 if(this->pickup_ == NULL)145 {146 orxout(internal_warning, context::pickups) << "A PickupSpawner was created without a valid Pickupable. This won't work." << endl;147 this->setActive(false);148 }149 else150 {151 PickupRepresentation* representation = PickupManager::getInstance().getRepresentation(this->pickup_->getPickupIdentifier());152 this->attach(representation->getSpawnerRepresentation(this));153 this->setActive(true);154 }155 }156 157 /**158 @brief159 Invoked when the activity has changed. Sets visibility of attached objects.160 */161 void PickupSpawner::changedActivity()162 {163 SUPER(PickupSpawner, changedActivity);164 165 if(GameMode::isMaster())166 this->setVisible(this->isActive());167 131 } 168 132 … … 199 163 200 164 Vector3 distance = it->getWorldPosition() - this->getWorldPosition(); 201 PickupCarrier* carrier = dynamic_cast<PickupCarrier*>(*it);165 PickupCarrier* carrier = static_cast<PickupCarrier*>(*it); 202 166 // If a PickupCarrier, that fits the target-range of the Pickupable spawned by this PickupSpawner, is in trigger-distance and the carrier is not blocked. 203 167 if(distance.length() < this->triggerDistance_ && carrier != NULL && this->blocked_.find(carrier) == this->blocked_.end()) … … 212 176 /** 213 177 @brief 178 Trigger the PickupSpawner. 179 Adds the pickup to the Pawn that triggered, sets the timer to re-activate and deactives the PickupSpawner. 180 @param carrier 181 Carrier which triggered the PickupSpawner. 182 */ 183 void PickupSpawner::trigger(PickupCarrier* carrier) 184 { 185 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") triggered and active." << endl; 186 187 PickupCarrier* target = carrier->getTarget(this->pickup_); 188 189 this->block(carrier); 190 191 assert(target); 192 bool pickedUp = this->pickup_->pickup(target); 193 assert(pickedUp); 194 pickedUp = false; // To avoid compiler warning. 195 196 this->setPickupable(NULL); 197 this->decrementSpawnsRemaining(); 198 } 199 200 void PickupSpawner::setPickupTemplateName(const std::string& name) 201 { 202 Template* temp = Template::getTemplate(name); 203 if (temp) 204 this->setPickupTemplate(temp); 205 } 206 207 void PickupSpawner::setPickupTemplate(Template* temp) 208 { 209 this->pickupTemplate_ = temp; 210 this->pickupTemplateName_ = temp->getName(); 211 212 this->setPickupable(this->createPickup()); 213 } 214 215 /** 216 @brief 214 217 Sets the maximum number of spawned items. 215 218 @param items … … 233 236 this->spawnsRemaining_--; 234 237 238 this->setActive(false); 239 235 240 if(this->spawnsRemaining_ != 0 && this->respawnTime_ > 0) 236 241 { 237 242 this->startRespawnTimer(); 238 239 this->setActive(false);240 243 this->fireEvent(); 241 244 } … … 243 246 { 244 247 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") empty, selfdestruct initialized." << endl; 245 this->setActive(false);246 248 this->destroy(); 247 249 } … … 255 257 { 256 258 this->respawnTimer_.setTimer(this->respawnTime_, false, createExecutor(createFunctor(&PickupSpawner::respawnTimerCallback, this))); 259 } 260 261 /** 262 @brief 263 Invoked by the timer, re-activates the PickupSpawner. 264 */ 265 void PickupSpawner::respawnTimerCallback() 266 { 267 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") reactivated." << endl; 268 269 this->setPickupable(this->createPickup()); 270 } 271 272 /** 273 @brief 274 Creates a new Pickupable. 275 @return 276 The Pickupable created. 277 */ 278 Pickupable* PickupSpawner::createPickup(void) 279 { 280 if(this->spawnsRemaining_ == 0) 281 { 282 orxout(internal_error, context::pickups) << "Massive Error: PickupSpawner still alive until having spawned last item." << endl; 283 return NULL; 284 } 285 286 if (this->pickupTemplate_ != NULL) 287 { 288 Identifier* identifier = this->pickupTemplate_->getBaseclassIdentifier(); 289 if (identifier != NULL) 290 { 291 Pickupable* pickup = orxonox_cast<Pickupable*>(identifier->fabricate(this)); 292 orxonox_cast<BaseObject*>(pickup)->addTemplate(this->pickupTemplate_); 293 return pickup; 294 } 295 else 296 orxout(internal_error, context::pickups) << "No base class defined in pickup-template " << this->pickupTemplateName_ << endl; 297 } 298 299 return NULL; 257 300 } 258 301 … … 265 308 void PickupSpawner::setPickupable(Pickupable* pickup) 266 309 { 267 if(this->pickup_ != NULL) 268 { 269 orxout(internal_error, context::pickups) << "In PickupSpawner (&" << this << "): setPickupable called, with this->pickup_ already set." << endl; 270 return; 271 } 272 if(pickup == NULL) 273 { 274 orxout(internal_error, context::pickups) << "In PickupSpawner (&" << this << "): Argument of setPickupable is NULL." << endl; 275 return; 310 if (this->representation_ != NULL) 311 { 312 this->representation_->destroy(); 313 this->representation_ = NULL; 314 } 315 316 if (pickup != NULL) 317 { 318 if (this->pickup_ != NULL) 319 this->pickup_->destroy(); 320 321 PickupRepresentation* representation = PickupManager::getInstance().getRepresentation(pickup->getRepresentationName()); 322 this->representation_ = representation->createSpawnerRepresentation(this); 323 this->attach(this->representation_); 324 this->setActive(true); 325 } 326 else 327 { 328 this->setActive(false); 276 329 } 277 330 278 331 this->pickup_ = pickup; 279 332 } 280 281 /**282 @brief283 Get the Pickupable that is spawned by this PickupSpawner.284 @return285 Returns the Pickupable that is spawned by this PickupSpawner.286 */287 const Pickupable* PickupSpawner::getPickupable(void) const288 {289 return this->pickup_;290 }291 292 /**293 @brief294 Trigger the PickupSpawner.295 Adds the pickup to the Pawn that triggered, sets the timer to re-activate and deactives the PickupSpawner.296 @param pawn297 Pawn which triggered the PickupSpawner.298 */299 void PickupSpawner::trigger(Pawn* pawn)300 {301 if(this->isActive()) // Checks whether PickupSpawner is active.302 {303 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") triggered and active." << endl;304 305 PickupCarrier* carrier = dynamic_cast<PickupCarrier*>(pawn);306 assert(carrier);307 308 // If the Pawn isn't a target of the Pickupable.309 if(!carrier->isTarget(this->pickup_))310 {311 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") triggered but Pawn wasn't a target of the Pickupable." << endl;312 return;313 }314 315 PickupCarrier* target = carrier->getTarget(this->pickup_);316 Pickupable* pickup = this->getPickup();317 318 this->block(carrier);319 320 assert(pickup);321 assert(target);322 bool pickedUp = pickup->pickup(target);323 assert(pickedUp);324 pickedUp = false; // To avoid compiler warning.325 326 this->decrementSpawnsRemaining();327 }328 }329 330 /**331 @brief332 Creates a new Pickupable.333 @return334 The Pickupable created.335 */336 Pickupable* PickupSpawner::getPickup(void)337 {338 if(this->spawnsRemaining_ == 0)339 {340 orxout(internal_error, context::pickups) << "Massive Error: PickupSpawner still alive until having spawned last item." << endl;341 return NULL;342 }343 344 Pickupable* pickup = this->pickup_->clone();345 return pickup;346 }347 348 /**349 @brief350 Invoked by the timer, re-activates the PickupSpawner.351 */352 void PickupSpawner::respawnTimerCallback()353 {354 orxout(verbose, context::pickups) << "PickupSpawner (&" << this << ") reactivated." << endl;355 356 this->setActive(true);357 }358 333 } -
code/trunk/src/modules/pickup/PickupSpawner.h
r7549 r9348 78 78 public: 79 79 PickupSpawner(BaseObject* creator); //!< Default Constructor. 80 PickupSpawner(BaseObject* creator, Pickupable* pickup, float triggerDistance, float respawnTime, int maxSpawnedItems); //!< Constructor.81 80 virtual ~PickupSpawner(); //!< Destructor. 82 81 82 static PickupSpawner* createDroppedPickup(BaseObject* creator, Pickupable* pickup, PickupCarrier* carrier, float triggerDistance = 10.0); 83 83 84 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a PickupSpawner through XML. 84 virtual void changedActivity(); //!< Invoked when activity has changed (set visibilty).85 85 virtual void tick(float dt); //!< Tick, checks if any Pawn is close enough to trigger. 86 86 … … 103 103 inline int getMaxSpawnedItems(void) const 104 104 { return this->maxSpawnedItems_; } 105 /** 106 @brief Returns the name of the template which is used to create a pickup for this spawner. 107 */ 108 inline const std::string& getPickupTemplateName() const 109 { return this->pickupTemplateName_; } 110 /** 111 @brief Returns the template which is used to create a pickup for this spawner. 112 */ 113 inline Template* getPickupTemplate() const 114 {return this->pickupTemplate_; } 105 115 106 protected: 116 private: 117 void initialize(void); 118 119 void trigger(PickupCarrier* carrier); //!< Method called when a carrier is close enough. 120 void respawnTimerCallback(); //!< Method called when the timer runs out. 121 107 122 void decrementSpawnsRemaining(void); //!< Decrements the number of remaining spawns. 108 123 void startRespawnTimer(void); //!< Invoked by the timer, re-activates the PickupSpawner. … … 128 143 inline void setRespawnTime(float time) 129 144 { this->respawnTime_ = time; } 145 130 146 void setMaxSpawnedItems(int items); //!< Sets the maximum number of spawned items. 131 147 132 virtual Pickupable* getPickup(void); //!< Creates a new Pickupable. 148 void setPickupTemplateName(const std::string& name); 149 void setPickupTemplate(Template* temp); 133 150 151 Pickupable* createPickup(void); //!< Creates a new Pickupable. 134 152 void setPickupable(Pickupable* pickup); //!< Sets a Pickupable for the PickupSpawner to spawn. 135 const Pickupable* getPickupable(void) const; //!< Get the Pickupable that is spawned by this PickupSpawner.136 153 137 154 Pickupable* pickup_; //!< The pickup to be spawned. 138 139 private: 140 void initialize(void); 141 142 void trigger(Pawn* pawn); //!< Method called when a Pawn is close enough. 143 void respawnTimerCallback(); //!< Method called when the timer runs out. 155 StaticEntity* representation_; //!< The active representation of the spawner. 156 std::string pickupTemplateName_; //!< The name of the pickup template. 157 Template* pickupTemplate_; //!< The template to be used to create a pickupable. 144 158 145 159 int maxSpawnedItems_; //!< Maximum number of items spawned by this PickupSpawner. -
code/trunk/src/modules/pickup/items/CMakeLists.txt
r8706 r9348 7 7 ShieldPickup.cc 8 8 ShrinkPickup.cc 9 DamageBoostPickup.cc 9 10 ) -
code/trunk/src/modules/pickup/items/DronePickup.cc
r8858 r9348 39 39 40 40 #include "controllers/DroneController.h" 41 #include "pickup/PickupIdentifier.h"42 41 #include "worldentities/Drone.h" 43 42 #include "worldentities/pawns/Pawn.h" … … 75 74 { 76 75 this->addTarget(ClassIdentifier<Pawn>::getIdentifier()); 77 this->setDurationType Direct(pickupDurationType::once);76 this->setDurationType(pickupDurationType::once); 78 77 this->droneTemplate_ = ""; 79 }80 81 /**82 @brief83 Initializes the PickupIdentifier of this pickup.84 */85 void DronePickup::initializeIdentifier(void)86 {87 std::string val = this->getDroneTemplate();88 std::string type = "droneTemplate";89 this->pickupIdentifier_->addParameter(type, val);90 78 } 91 79 … … 98 86 SUPER(DronePickup, XMLPort, xmlelement, mode); 99 87 XMLPortParam(DronePickup, "droneTemplate", setDroneTemplate, getDroneTemplate, xmlelement, mode); 100 101 this->initializeIdentifier();102 88 } 103 89 … … 108 94 The name of the Template to e set. 109 95 */ 110 void DronePickup::setDroneTemplate( std::stringtemplatename){96 void DronePickup::setDroneTemplate(const std::string& templatename){ 111 97 droneTemplate_ = templatename; 112 98 } … … 144 130 145 131 Controller* controller = drone->getController(); 146 DroneController* droneController = dynamic_cast<DroneController*>(controller);132 DroneController* droneController = orxonox_cast<DroneController*>(controller); 147 133 if(droneController != NULL) 148 134 { … … 175 161 { 176 162 PickupCarrier* carrier = this->getCarrier(); 177 Pawn* pawn = dynamic_cast<Pawn*>(carrier);163 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 178 164 179 165 if(pawn == NULL) … … 184 170 return pawn; 185 171 } 186 187 /**188 @brief189 Creates a duplicate of the input OrxonoxClass.190 @param item191 A pointer to the Orxonox class.192 */193 void DronePickup::clone(OrxonoxClass*& item)194 {195 if(item == NULL)196 item = new DronePickup(this);197 198 SUPER(DronePickup, clone, item);199 200 DronePickup* pickup = dynamic_cast<DronePickup*>(item);201 pickup->setDroneTemplate(this->getDroneTemplate());202 203 pickup->initializeIdentifier();204 }205 172 } -
code/trunk/src/modules/pickup/items/DronePickup.h
r7547 r9348 70 70 71 71 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 72 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.73 72 74 73 const std::string& getDroneTemplate() const; //!< Get the name of the droneTemplate. 75 74 76 75 protected: 77 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup. 78 79 void setDroneTemplate(std::string templatename); //!< Set the droneTemplate. 76 void setDroneTemplate(const std::string& templatename); //!< Set the droneTemplate. 80 77 81 78 private: -
code/trunk/src/modules/pickup/items/HealthPickup.cc
r8864 r9348 38 38 #include "core/XMLPort.h" 39 39 40 #include "pickup/PickupIdentifier.h"41 40 #include "worldentities/pawns/Pawn.h" 42 41 … … 87 86 /** 88 87 @brief 89 Initializes the PickupIdentifier of this pickup.90 */91 void HealthPickup::initializeIdentifier(void)92 {93 std::stringstream stream;94 stream << this->getHealth();95 std::string type1 = "health";96 std::string val1 = stream.str();97 this->pickupIdentifier_->addParameter(type1, val1);98 99 std::string val2 = this->getHealthType();100 std::string type2 = "healthType";101 this->pickupIdentifier_->addParameter(type2, val2);102 103 stream.clear();104 stream << this->getHealthRate();105 std::string val3 = stream.str();106 std::string type3 = "healthRate";107 this->pickupIdentifier_->addParameter(type3, val3);108 }109 110 /**111 @brief112 88 Method for creating a HealthPickup object through XML. 113 89 */ … … 118 94 XMLPortParam(HealthPickup, "health", setHealth, getHealth, xmlelement, mode); 119 95 XMLPortParam(HealthPickup, "healthRate", setHealthRate, getHealthRate, xmlelement, mode); 120 XMLPortParam(HealthPickup, "healthType", setHealthType , getHealthType, xmlelement, mode);96 XMLPortParam(HealthPickup, "healthType", setHealthTypeAsString, getHealthTypeAsString, xmlelement, mode); 121 97 122 98 if(!this->isContinuous()) 123 this->healthRate_ = 0.0f; 124 125 this->initializeIdentifier(); 99 this->setHealthRate(0.0f); // TODO: this logic should be inside tick(), not in XMLPort 126 100 } 127 101 … … 151 125 this->setHealth(this->getHealth()-health); 152 126 153 switch(this->getHealthType Direct())127 switch(this->getHealthType()) 154 128 { 155 129 case pickupHealthType::permanent: … … 198 172 199 173 float health = 0.0f; 200 switch(this->getHealthType Direct())174 switch(this->getHealthType()) 201 175 { 202 176 case pickupHealthType::permanent: … … 227 201 else 228 202 { 229 if(this->getHealthType Direct() == pickupHealthType::temporary)203 if(this->getHealthType() == pickupHealthType::temporary) 230 204 { 231 205 PickupCarrier* carrier = this->getCarrier(); 232 Pawn* pawn = dynamic_cast<Pawn*>(carrier);206 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 233 207 234 208 if(pawn == NULL) … … 264 238 { 265 239 PickupCarrier* carrier = this->getCarrier(); 266 Pawn* pawn = dynamic_cast<Pawn*>(carrier);240 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 267 241 268 242 if(pawn == NULL) … … 270 244 271 245 return pawn; 272 }273 274 /**275 @brief276 Creates a duplicate of the input OrxonoxClass.277 @param item278 A pointer to the Orxonox class.279 */280 void HealthPickup::clone(OrxonoxClass*& item)281 {282 if(item == NULL)283 item = new HealthPickup(this);284 285 SUPER(HealthPickup, clone, item);286 287 HealthPickup* pickup = dynamic_cast<HealthPickup*>(item);288 pickup->setHealth(this->getHealth());289 pickup->setHealthRate(this->getHealthRate());290 pickup->setHealthTypeDirect(this->getHealthTypeDirect());291 292 pickup->initializeIdentifier();293 246 } 294 247 … … 299 252 Returns the health type as a string. 300 253 */ 301 const std::string& HealthPickup::getHealthType (void) const302 { 303 switch(this->getHealthType Direct())254 const std::string& HealthPickup::getHealthTypeAsString(void) const 255 { 256 switch(this->getHealthType()) 304 257 { 305 258 case pickupHealthType::limited: … … 352 305 The type as a string. 353 306 */ 354 void HealthPickup::setHealthType (std::stringtype)307 void HealthPickup::setHealthTypeAsString(const std::string& type) 355 308 { 356 309 if(type == HealthPickup::healthTypeLimited_s) 357 this->setHealthType Direct(pickupHealthType::limited);310 this->setHealthType(pickupHealthType::limited); 358 311 else if(type == HealthPickup::healthTypeTemporary_s) 359 this->setHealthType Direct(pickupHealthType::temporary);312 this->setHealthType(pickupHealthType::temporary); 360 313 else if(type == HealthPickup::healthTypePermanent_s) 361 this->setHealthType Direct(pickupHealthType::permanent);314 this->setHealthType(pickupHealthType::permanent); 362 315 else 363 316 orxout(internal_error, context::pickups) << "Invalid healthType '" << type << "' in HealthPickup." << endl; -
code/trunk/src/modules/pickup/items/HealthPickup.h
r7551 r9348 97 97 98 98 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 99 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.100 99 101 100 /** … … 116 115 @return Returns the health type as an enum. 117 116 */ 118 inline pickupHealthType::Value getHealthType Direct(void) const117 inline pickupHealthType::Value getHealthType(void) const 119 118 { return this->healthType_; } 120 const std::string& getHealthType (void) const; //!< Get the health type of this pickup.119 const std::string& getHealthTypeAsString(void) const; //!< Get the health type of this pickup. 121 120 122 121 protected: 123 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup.124 125 122 void setHealth(float health); //!< Sets the health. 126 123 void setHealthRate(float speed); //!< Set the rate at which health is transferred if the pickup is continuous. … … 130 127 @param type The type of this pickup as an enum. 131 128 */ 132 inline void setHealthType Direct(pickupHealthType::Value type)129 inline void setHealthType(pickupHealthType::Value type) 133 130 { this->healthType_ = type; } 134 void setHealthType (std::stringtype); //!< Set the type of the HealthPickup.131 void setHealthTypeAsString(const std::string& type); //!< Set the type of the HealthPickup. 135 132 136 133 private: -
code/trunk/src/modules/pickup/items/InvisiblePickup.cc
r8858 r9348 40 40 #include "core/XMLPort.h" 41 41 42 #include "pickup/PickupIdentifier.h"43 42 #include "worldentities/pawns/Pawn.h" 44 43 … … 79 78 /** 80 79 @brief 81 Initializes the PickupIdentifier of this pickup.82 */83 void InvisiblePickup::initializeIdentifier(void)84 {85 std::stringstream stream;86 stream << this->getDuration();87 std::string type1 = "duration";88 std::string val1 = stream.str();89 this->pickupIdentifier_->addParameter(type1, val1);90 }91 92 /**93 @brief94 80 Method for creating a HealthPickup object through XML. 95 81 */ … … 98 84 SUPER(InvisiblePickup, XMLPort, xmlelement, mode); 99 85 XMLPortParam(InvisiblePickup, "duration", setDuration, getDuration, xmlelement, mode); 100 101 this->initializeIdentifier();102 86 } 103 87 … … 148 132 /** 149 133 @brief 150 Creates a duplicate of the input OrxonoxClass.151 @param item152 A pointer to the Orxonox class.153 */154 void InvisiblePickup::clone(OrxonoxClass*& item)155 {156 if(item == NULL)157 item = new InvisiblePickup(this);158 159 SUPER(InvisiblePickup, clone, item);160 161 InvisiblePickup* pickup = dynamic_cast<InvisiblePickup*>(item);162 pickup->setDuration(this->getDuration());163 pickup->initializeIdentifier();164 }165 166 /**167 @brief168 134 Sets the invisibility. 169 135 @param invisibility … … 202 168 { 203 169 PickupCarrier* carrier = this->getCarrier(); 204 Pawn* pawn = dynamic_cast<Pawn*>(carrier);170 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 205 171 206 172 if(pawn == NULL) -
code/trunk/src/modules/pickup/items/InvisiblePickup.h
r7547 r9348 72 72 InvisiblePickup(BaseObject* creator); //!< Constructor. 73 73 virtual ~InvisiblePickup(); //!< Destructor. 74 74 75 75 virtual void XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode); //!< Method for creating a HealthPickup object through XML. 76 76 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 77 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.78 77 79 78 /** … … 91 90 92 91 protected: 93 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup.94 95 92 bool setInvisible(bool invisibility); //!< Set the Pawn to be invisible or visible again. 96 93 void setDuration(float duration); //!< Sets the time the InvisibilityPickup will last. -
code/trunk/src/modules/pickup/items/MetaPickup.cc
r8858 r9348 36 36 37 37 #include "interfaces/PickupCarrier.h" 38 #include "pickup/PickupIdentifier.h"39 38 #include "worldentities/pawns/Pawn.h" 40 39 … … 80 79 this->addTarget(ClassIdentifier<PickupCarrier>::getIdentifier()); 81 80 82 this->setDurationType Direct(pickupDurationType::once);81 this->setDurationType(pickupDurationType::once); 83 82 this->metaType_ = pickupMetaType::none; 84 83 } … … 86 85 /** 87 86 @brief 88 Helper method to initialize the PickupIdentifier.89 */90 void MetaPickup::initializeIdentifier(void)91 {92 std::string val = this->getMetaType();93 std::string type = "metaType";94 this->pickupIdentifier_->addParameter(type, val);95 }96 97 /**98 @brief99 87 Method for creating a MetaPickup object through XML. 100 88 */ … … 103 91 SUPER(MetaPickup, XMLPort, xmlelement, mode); 104 92 105 XMLPortParam(MetaPickup, "metaType", setMetaType, getMetaType, xmlelement, mode); 106 107 this->initializeIdentifier(); 93 XMLPortParam(MetaPickup, "metaType", setMetaTypeAsString, getMetaTypeAsString, xmlelement, mode); 108 94 } 109 95 … … 121 107 { 122 108 PickupCarrier* carrier = this->getCarrier(); 123 if(this->getMetaType Direct() != pickupMetaType::none && carrier != NULL)109 if(this->getMetaType() != pickupMetaType::none && carrier != NULL) 124 110 { 125 111 // If the metaType is destroyCarrier, then the PickupCarrier is destroyed. 126 if(this->getMetaType Direct() == pickupMetaType::destroyCarrier)112 if(this->getMetaType() == pickupMetaType::destroyCarrier) 127 113 { 128 114 Pawn* pawn = orxonox_cast<Pawn*>(carrier); … … 139 125 140 126 // If the metaType is use, then the Pickupable is set to used. 141 if(this->getMetaType Direct() == pickupMetaType::use && !pickup->isUsed())127 if(this->getMetaType() == pickupMetaType::use && !pickup->isUsed()) 142 128 { 143 129 pickup->setUsed(true); 144 130 } 145 131 // If the metaType is drop, then the Pickupable is dropped. 146 else if(this->getMetaType Direct() == pickupMetaType::drop)132 else if(this->getMetaType() == pickupMetaType::drop) 147 133 { 148 134 pickup->drop(); 149 135 } 150 136 // If the metaType is destroy, then the Pickupable is destroyed. 151 else if(this->getMetaType Direct() == pickupMetaType::destroy)137 else if(this->getMetaType() == pickupMetaType::destroy) 152 138 { 153 139 pickup->Pickupable::destroy(); … … 161 147 /** 162 148 @brief 163 Creates a duplicate of the input OrxonoxClass.164 @param item165 A pointer to the Orxonox class.166 */167 void MetaPickup::clone(OrxonoxClass*& item)168 {169 if(item == NULL)170 item = new MetaPickup(this);171 172 SUPER(MetaPickup, clone, item);173 174 MetaPickup* pickup = dynamic_cast<MetaPickup*>(item);175 pickup->setMetaTypeDirect(this->getMetaTypeDirect());176 177 pickup->initializeIdentifier();178 }179 180 /**181 @brief182 149 Get the meta type of this MetaPickup. 183 150 @return 184 151 Returns a string with the meta type of the MetaPickup. 185 152 */ 186 const std::string& MetaPickup::getMetaType (void) const187 { 188 switch(this->getMetaType Direct())153 const std::string& MetaPickup::getMetaTypeAsString(void) const 154 { 155 switch(this->getMetaType()) 189 156 { 190 157 case pickupMetaType::none: … … 209 176 A string with the type to be set. 210 177 */ 211 void MetaPickup::setMetaType (const std::string& type)178 void MetaPickup::setMetaTypeAsString(const std::string& type) 212 179 { 213 180 if(type == MetaPickup::metaTypeNone_s) 214 181 { 215 this->setMetaType Direct(pickupMetaType::none);182 this->setMetaType(pickupMetaType::none); 216 183 } 217 184 else if(type == MetaPickup::metaTypeUse_s) 218 185 { 219 this->setMetaType Direct(pickupMetaType::use);186 this->setMetaType(pickupMetaType::use); 220 187 } 221 188 else if(type == MetaPickup::metaTypeDrop_s) 222 189 { 223 this->setMetaType Direct(pickupMetaType::drop);190 this->setMetaType(pickupMetaType::drop); 224 191 } 225 192 else if(type == MetaPickup::metaTypeDestroy_s) 226 193 { 227 this->setMetaType Direct(pickupMetaType::destroy);194 this->setMetaType(pickupMetaType::destroy); 228 195 } 229 196 else if(type == MetaPickup::metaTypeDestroyCarrier_s) 230 197 { 231 this->setMetaType Direct(pickupMetaType::destroyCarrier);198 this->setMetaType(pickupMetaType::destroyCarrier); 232 199 } 233 200 else -
code/trunk/src/modules/pickup/items/MetaPickup.h
r7547 r9348 69 69 70 70 The default value is <em>none</em>, which basically does nothing. 71 71 72 72 The parameter <b>activation type</b> can be used to specify, whether the MetaPickup is used upon pickup (<em>immediate</em>) or not (<em>onUse</em>). With <em>immediate</em> being the default. 73 73 … … 95 95 96 96 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 97 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.98 97 99 98 /** … … 101 100 @return Returns an enum with the meta type of the MetaPickup. 102 101 */ 103 inline pickupMetaType::Value getMetaType Direct(void) const102 inline pickupMetaType::Value getMetaType(void) const 104 103 { return this->metaType_; } 105 const std::string& getMetaType (void) const; //!< Get the meta type of this MetaPickup.104 const std::string& getMetaTypeAsString(void) const; //!< Get the meta type of this MetaPickup. 106 105 107 106 protected: 108 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup.109 110 107 /** 111 108 @brief Set the meta type of the MetaPickup. 112 109 @param type The meta type as an enum. 113 110 */ 114 inline void setMetaType Direct(pickupMetaType::Value type)111 inline void setMetaType(pickupMetaType::Value type) 115 112 { this->metaType_ = type; } 116 void setMetaType (const std::string& type); //!< Set the meta type of this MetaPickup.113 void setMetaTypeAsString(const std::string& type); //!< Set the meta type of this MetaPickup. 117 114 118 115 private: -
code/trunk/src/modules/pickup/items/ShieldPickup.cc
r8858 r9348 38 38 #include "core/XMLPort.h" 39 39 40 #include "pickup/PickupIdentifier.h"41 40 #include "worldentities/pawns/Pawn.h" 42 41 … … 80 79 /** 81 80 @brief 82 Initializes the PickupIdentifier of this pickup.83 */84 void ShieldPickup::initializeIdentifier(void)85 {86 std::stringstream stream;87 stream << this->getDuration();88 std::string type1 = "duration";89 std::string val1 = stream.str();90 this->pickupIdentifier_->addParameter(type1, val1);91 92 stream.clear();93 stream << this->getShieldHealth();94 std::string type2 = "ShieldHealth";95 std::string val2 = stream.str();96 this->pickupIdentifier_->addParameter(type2, val2);97 98 stream.clear();99 stream << this->getShieldAbsorption();100 std::string type3 = "ShieldAbsorption";101 std::string val3 = stream.str();102 this->pickupIdentifier_->addParameter(type3, val3);103 104 }105 106 /**107 @brief108 81 Method for creating a ShieldPickup object through XML. 109 82 */ … … 115 88 XMLPortParam(ShieldPickup, "shieldabsorption", setShieldAbsorption, getShieldAbsorption, xmlelement, mode); 116 89 XMLPortParam(ShieldPickup, "duration", setDuration, getDuration, xmlelement, mode); 117 118 this->initializeIdentifier();119 90 } 120 91 … … 177 148 { 178 149 PickupCarrier* carrier = this->getCarrier(); 179 Pawn* pawn = dynamic_cast<Pawn*>(carrier);150 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 180 151 181 152 if(pawn == NULL) … … 184 155 } 185 156 return pawn; 186 }187 188 /**189 @brief190 Creates a duplicate of the input OrxonoxClass.191 @param item192 A pointer to the Orxonox class.193 */194 void ShieldPickup::clone(OrxonoxClass*& item)195 {196 if(item == NULL)197 item = new ShieldPickup(this);198 199 SUPER(ShieldPickup, clone, item);200 201 ShieldPickup* pickup = dynamic_cast<ShieldPickup*>(item);202 pickup->setDuration(this->getDuration());203 pickup->setShieldAbsorption(this->getShieldAbsorption());204 pickup->setShieldHealth(this->getShieldHealth());205 pickup->initializeIdentifier();206 157 } 207 158 -
code/trunk/src/modules/pickup/items/ShieldPickup.h
r7547 r9348 82 82 83 83 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 84 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.85 84 86 85 /** … … 104 103 105 104 protected: 106 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup.107 105 void pickupTimerCallback(void); //!< Helper method. Is called by the Timer as soon as it expires. 108 106 -
code/trunk/src/modules/pickup/items/ShrinkPickup.cc
r8713 r9348 40 40 #include "core/XMLPort.h" 41 41 42 #include "pickup/PickupIdentifier.h"43 42 #include "worldentities/pawns/Pawn.h" 44 43 … … 81 80 } 82 81 83 void ShrinkPickup::initializeIdentifier(void)84 {85 std::stringstream stream;86 stream << this->getShrinkFactor();87 std::string type1 = "shrinkFactor";88 std::string val1 = stream.str();89 this->pickupIdentifier_->addParameter(type1, val1);90 91 stream.clear();92 stream << this->getDuration();93 std::string val2 = stream.str();94 std::string type2 = "duration";95 this->pickupIdentifier_->addParameter(type2, val2);96 97 stream.clear();98 stream << this->getShrinkDuration();99 std::string val3 = stream.str();100 std::string type3 = "shrinkDuration";101 this->pickupIdentifier_->addParameter(type3, val3);102 }103 104 82 /** 105 83 @brief … … 113 91 XMLPortParam(ShrinkPickup, "duration", setDuration, getDuration, xmlelement, mode); 114 92 XMLPortParam(ShrinkPickup, "shrinkDuration", setShrinkDuration, getShrinkDuration, xmlelement, mode); 115 116 this->initializeIdentifier(); 93 } 94 95 /** 96 @brief Sets the shrinking factor. 97 @param factor The factor, needs to greater than 1. 98 */ 99 void ShrinkPickup::setShrinkFactor(float factor) 100 { 101 if(factor <= 1.0f) 102 { 103 orxout(internal_warning, context::pickups) << "Invalid shrinking factor in ShrinkPickup. Ignoring.." << endl; 104 return; 105 } 106 this->shrinkFactor_ = factor; 107 } 108 109 /** 110 @brief Set the duration for which the ship remains shrunken. 111 @param duration The duration, needs to be non-negative. 112 */ 113 void ShrinkPickup::setDuration(float duration) 114 { 115 if(duration < 0.0f) 116 { 117 orxout(internal_warning, context::pickups) << "Invalid duration in ShrinkPickup. Ignoring.." << endl; 118 return; 119 } 120 this->duration_ = duration; 121 } 122 123 /** 124 @brief Set the shrink duration. 125 @param speed The shrink duration, needs to be positive. 126 */ 127 void ShrinkPickup::setShrinkDuration(float speed) 128 { 129 if(speed <= 0.0f) 130 { 131 orxout(internal_warning, context::pickups) << "Invalid shrink duration in ShrinkPickup. Ignoring.." << endl; 132 return; 133 } 134 this->shrinkDuration_ = speed; 117 135 } 118 136 … … 148 166 { 149 167 SUPER(ShrinkPickup, changedPickedUp); 150 168 151 169 if(!this->isPickedUp() && this->isActive_) 152 170 { … … 271 289 272 290 bool destroy = false; 273 291 274 292 // Stop shrinking if the desired size is reached. 275 293 if(this->timeRemainig_ <= 0.0f) … … 314 332 { 315 333 PickupCarrier* carrier = this->getCarrier(); 316 Pawn* pawn = dynamic_cast<Pawn*>(carrier);334 Pawn* pawn = orxonox_cast<Pawn*>(carrier); 317 335 318 336 return pawn; 319 337 } 320 321 /**322 @brief323 Creates a duplicate of the input OrxonoxClass.324 @param item325 A pointer to the Orxonox class.326 */327 void ShrinkPickup::clone(OrxonoxClass*& item)328 {329 if(item == NULL)330 item = new ShrinkPickup(this);331 332 SUPER(ShrinkPickup, clone, item);333 ShrinkPickup* pickup = dynamic_cast<ShrinkPickup*>(item);334 pickup->setShrinkFactor(this->getShrinkFactor());335 pickup->setDuration(this->getDuration());336 pickup->setShrinkDuration(this->getShrinkDuration());337 338 pickup->initializeIdentifier();339 }340 338 } -
code/trunk/src/modules/pickup/items/ShrinkPickup.h
r8858 r9348 80 80 virtual void changedUsed(void); // Is called when the pickup has transited from used to unused or the other way around. 81 81 virtual void changedPickedUp(void); 82 virtual void clone(OrxonoxClass*& item); // Creates a duplicate of the input OrxonoxClass.83 82 84 83 /** … … 88 87 inline float getShrinkFactor(void) const 89 88 { return this->shrinkFactor_; } 90 /** 91 @brief Sets the shrinking factor. 92 @param factor The factor, needs to greater than 1. 93 */ 94 inline void setShrinkFactor(float factor) 95 { if(factor <= 1.0f) { orxout(internal_warning, context::pickups) << "Invalid shrinking factor in ShrinkPickup. Ignoring.." << endl; return; } this->shrinkFactor_ = factor; } 89 void setShrinkFactor(float factor); 90 96 91 /** 97 92 @brief Get the duration for which the ship remains shrunken. … … 100 95 inline float getDuration(void) const 101 96 { return this->duration_; } 102 /** 103 @brief Set the duration for which the ship remains shrunken. 104 @param duration The duration, needs to be non-negative. 105 */ 106 inline void setDuration(float duration) 107 { if(duration < 0.0f) { orxout(internal_warning, context::pickups) << "Invalid duration in ShrinkPickup. Ignoring.." << endl; return; } this->duration_ = duration; } 97 void setDuration(float duration); 98 108 99 /** 109 100 @brief Get the shrink speed. … … 112 103 inline float getShrinkDuration(void) const 113 104 { return this->shrinkDuration_; } 114 /** 115 @brief Set the shrink duration. 116 @param speed The shrink duration, needs to be positive. 117 */ 118 inline void setShrinkDuration(float speed) 119 { if(speed <= 0.0f) { orxout(internal_warning, context::pickups) << "Invalid shrink duration in ShrinkPickup. Ignoring.." << endl; return; } this->shrinkDuration_ = speed; } 120 121 protected: 122 void initializeIdentifier(void); 105 void setShrinkDuration(float speed); 123 106 124 107 private: … … 135 118 float currentFactor_; //!< The shrink factor that is currently applied. 136 119 float timeRemainig_; //!< The remaining shrink time. 137 120 138 121 Pawn* carrierToPawnHelper(void); 139 122 Timer durationTimer_; -
code/trunk/src/modules/pickup/items/SpeedPickup.cc
r8858 r9348 38 38 #include "core/XMLPort.h" 39 39 40 #include "pickup/PickupIdentifier.h"41 40 #include "worldentities/pawns/SpaceShip.h" 42 41 … … 80 79 /** 81 80 @brief 82 Initializes the PickupIdentifier of this pickup.83 */84 void SpeedPickup::initializeIdentifier(void)85 {86 std::stringstream stream;87 stream << this->getDuration();88 std::string type1 = "duration";89 std::string val1 = stream.str();90 this->pickupIdentifier_->addParameter(type1, val1);91 92 stream.clear();93 stream << this->getSpeedAdd();94 std::string type2 = "speedAdd";95 std::string val2 = stream.str();96 this->pickupIdentifier_->addParameter(type2, val2);97 98 stream.clear();99 stream << this->getSpeedMultiply();100 std::string type3 = "speedMultiply";101 std::string val3 = stream.str();102 this->pickupIdentifier_->addParameter(type3, val3);103 }104 105 /**106 @brief107 81 Method for creating a SpeedPickup object through XML. 108 82 */ … … 114 88 XMLPortParam(SpeedPickup, "speedAdd", setSpeedAdd, getSpeedAdd, xmlelement, mode); 115 89 XMLPortParam(SpeedPickup, "speedMultiply", setSpeedMultiply, getSpeedMultiply, xmlelement, mode); 116 117 this->initializeIdentifier();118 90 } 119 91 … … 176 148 { 177 149 PickupCarrier* carrier = this->getCarrier(); 178 SpaceShip* ship = dynamic_cast<SpaceShip*>(carrier);150 SpaceShip* ship = orxonox_cast<SpaceShip*>(carrier); 179 151 180 152 if(ship == NULL) … … 184 156 185 157 return ship; 186 }187 188 /**189 @brief190 Creates a duplicate of the input OrxonoxClass.191 @param item192 A pointer to the Orxonox class.193 */194 void SpeedPickup::clone(OrxonoxClass*& item)195 {196 if(item == NULL)197 item = new SpeedPickup(this);198 199 SUPER(SpeedPickup, clone, item);200 201 SpeedPickup* pickup = dynamic_cast<SpeedPickup*>(item);202 pickup->setDuration(this->getDuration());203 pickup->setSpeedAdd(this->getSpeedAdd());204 pickup->setSpeedMultiply(this->getSpeedMultiply());205 206 pickup->initializeIdentifier();207 158 } 208 159 -
code/trunk/src/modules/pickup/items/SpeedPickup.h
r8727 r9348 81 81 82 82 virtual void changedUsed(void); //!< Is called when the pickup has transited from used to unused or the other way around. 83 virtual void clone(OrxonoxClass*& item); //!< Creates a duplicate of the input OrxonoxClass.84 83 85 84 /** … … 103 102 104 103 protected: 105 void initializeIdentifier(void); //!< Initializes the PickupIdentifier of this pickup.106 104 void pickupTimerCallback(void); //!< Function that gets called when timer ends. 107 105 … … 112 110 private: 113 111 void initialize(void); //!< Initializes the member variables. 114 SpaceShip* carrierToSpaceShipHelper(void); //!< Helper to transform the PickupCarrier to a SpaceS Hip, and throw an error message if the conversion fails.112 SpaceShip* carrierToSpaceShipHelper(void); //!< Helper to transform the PickupCarrier to a SpaceShip, and throw an error message if the conversion fails. 115 113 116 114 Timer durationTimer_; //!< Timer. -
code/trunk/src/modules/pong/Pong.cc
r9258 r9348 256 256 Is called when the player scored. 257 257 */ 258 void Pong::playerScored(PlayerInfo* player )259 { 260 Deathmatch::playerScored(player );258 void Pong::playerScored(PlayerInfo* player, int score) 259 { 260 Deathmatch::playerScored(player, score); 261 261 262 262 if (this->center_ != NULL) // If there is a centerpoint. -
code/trunk/src/modules/pong/Pong.h
r9258 r9348 73 73 virtual void spawnPlayer(PlayerInfo* player); //!< Spawns the input player. 74 74 75 virtual void playerScored(PlayerInfo* player ); //!< Is called when the player scored.75 virtual void playerScored(PlayerInfo* player, int score = 1); //!< Is called when the player scored. 76 76 77 77 /** -
code/trunk/src/modules/tetris/CMakeLists.txt
r8706 r9348 3 3 TetrisCenterpoint.cc 4 4 TetrisStone.cc 5 TetrisBrick.cc 6 TetrisScore.cc 5 7 ) 6 8 … … 10 12 LINK_LIBRARIES 11 13 orxonox 14 overlays 12 15 SOURCE_FILES ${TETRIS_SRC_FILES} 13 16 ) -
code/trunk/src/modules/tetris/Tetris.cc
r8858 r9348 23 23 * ... 24 24 * Co-authors: 25 * ... 26 * 25 * Johannes Ritz 26 * 27 * 28 * 29 * 30 *TASK c) end the game in a nicer way 31 *TASK d) save the highscore 32 *TASK e) eye candy 27 33 */ 28 34 … … 42 48 #include "TetrisCenterpoint.h" 43 49 #include "TetrisStone.h" 50 #include "TetrisBrick.h" 44 51 #include "infos/PlayerInfo.h" 45 52 … … 52 59 @brief 53 60 Constructor. Registers and initializes the object. 61 @ingroup Tetris 54 62 */ 55 63 Tetris::Tetris(BaseObject* creator) : Deathmatch(creator) … … 57 65 RegisterObject(Tetris); 58 66 59 this->active Stone_ = NULL;67 this->activeBrick_ = 0; 60 68 61 69 // Pre-set the timer, but don't start it yet. 62 this->starttimer_.setTimer(1.0, false, createExecutor(createFunctor(&Tetris::start Stone, this)));70 this->starttimer_.setTimer(1.0, false, createExecutor(createFunctor(&Tetris::startBrick, this))); 63 71 this->starttimer_.stopTimer(); 64 72 65 73 this->player_ = NULL; 74 this->setHUDTemplate("TetrisHUD"); 75 this->futureBrick_ = 0; 66 76 } 67 77 … … 82 92 void Tetris::cleanup() 83 93 { 84 94 if (this->activeBrick_) 95 { 96 this->activeBrick_->destroy(); 97 this->activeBrick_ = 0; 98 } 99 if (this->futureBrick_) 100 { 101 this->futureBrick_->destroy(); 102 this->futureBrick_ = 0; 103 } 104 105 for (std::list<SmartPtr<TetrisStone> >::iterator it = this->stones_.begin(); it != this->stones_.end(); ++it) 106 (*it)->destroy(); 107 this->stones_.clear(); 85 108 } 86 109 … … 89 112 SUPER(Tetris, tick, dt); 90 113 91 if(this->activeStone_ != NULL) 92 { 93 if(!this->isValidStonePosition(this->activeStone_, this->activeStone_->getPosition())) 94 { 95 this->activeStone_->setVelocity(Vector3::ZERO); 96 this->createStone(); 97 this->startStone(); 114 if((this->activeBrick_ != NULL)&&(!this->hasEnded())) 115 { 116 if(!this->isValidBrickPosition(this->activeBrick_)) 117 { 118 for (unsigned int i = 0; i < this->activeBrick_->getNumberOfStones(); i++) 119 this->stones_.push_back(this->activeBrick_->getStone(i)); 120 this->activeBrick_->setVelocity(Vector3::ZERO); 121 this->activeBrick_->releaseStones(this->center_); 122 this->findFullRows(); 123 this->startBrick(); 98 124 } 99 125 } … … 109 135 return false; 110 136 111 for(std::vector<TetrisStone*>::const_iterator it = this->stones_.begin(); it != this->stones_.end(); ++it) 112 { 113 if(stone == *it) 114 continue; 115 137 for(std::list<SmartPtr<TetrisStone> >::const_iterator it = this->stones_.begin(); it != this->stones_.end(); ++it) 138 { 116 139 const Vector3& currentStonePosition = (*it)->getPosition(); //!< Saves the position of the currentStone 117 140 … … 123 146 } 124 147 148 /** 149 @brief 150 Check for each stone in a brick if it is moved the right way. 151 */ 152 bool Tetris::isValidMove(TetrisBrick* brick, const Vector3& position, bool isRotation = false) 153 { 154 assert(brick); 155 156 for (unsigned int i = 0; i < brick->getNumberOfStones(); i++ ) 157 { 158 TetrisStone* stone = brick->getStone(i); 159 Vector3 stonePosition; //the current stone's offset to position 160 if(isRotation) 161 stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount()+1); 162 else 163 stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount()); 164 165 if(! this->isValidMove(stone, position + stonePosition )) 166 { 167 return false; 168 } 169 170 //catch illegal rotation (such that collisions with ground are not permitted) 171 if(isRotation) 172 { 173 if((position + stonePosition).y < this->center_->getStoneSize()/2.0f) //!< If the stone has reached the bottom of the level 174 { 175 return false; 176 } 177 } 178 } 179 return true; 180 181 } 182 183 184 125 185 bool Tetris::isValidStonePosition(TetrisStone* stone, const Vector3& position) 126 186 { 127 187 assert(stone); 128 188 129 // we use a reverse iterator because we have to check for collisions with the topmost stones first 130 for(std::vector<TetrisStone*>::const_reverse_iterator it = this->stones_.rbegin(); it != this->stones_.rend(); ++it) 131 { 132 if(stone == *it) 189 // check for collisions with all stones 190 for(std::list<SmartPtr<TetrisStone> >::const_iterator it = this->stones_.begin(); it != this->stones_.end(); ++it) 191 { 192 //Vector3 currentStonePosition = rotateVector((*it)->getPosition(), this->activeBrick_->getRotationCount()); 193 const Vector3& currentStonePosition = (*it)->getPosition(); //!< Saves the position of the currentStone 194 //!< Saves the position of the currentStone 195 196 //filter out cases where the falling stone is already below a steady stone 197 if(position.y < currentStonePosition.y - this->center_->getStoneSize()/2.0f) 133 198 continue; 134 135 const Vector3& currentStonePosition = (*it)->getPosition(); //!< Saves the position of the currentStone136 137 199 if((position.x == currentStonePosition.x) && (position.y < currentStonePosition.y + this->center_->getStoneSize())) 138 200 { 139 this->activeStone_->setPosition(Vector3(this->activeStone_->getPosition().x, currentStonePosition.y+this->center_->getStoneSize(), this->activeStone_->getPosition().z)); 201 float y_offset = static_cast<int>((this->activeBrick_->getPosition().y-currentStonePosition.y+10)/10)*10 + currentStonePosition.y; 202 if(y_offset < 0) //filter out extreme cases (very rare bug) 203 y_offset = 0; 204 this->activeBrick_->setPosition(Vector3(this->activeBrick_->getPosition().x, y_offset, this->activeBrick_->getPosition().z)); 140 205 return false; 141 206 }// This case applies if the stones overlap partially vertically … … 145 210 if(position.y < this->center_->getStoneSize()/2.0f) //!< If the stone has reached the bottom of the level 146 211 { 147 stone->setPosition(Vector3(stone->getPosition().x, this->center_->getStoneSize()/2.0f, stone->getPosition().z)); 212 float yOffset = stone->getPosition().y + this->center_->getStoneSize()/2.0f;//calculate offset 213 if(yOffset < 0) //catch brake-throughs 214 yOffset = 0; 215 this->activeBrick_->setPosition(Vector3(this->activeBrick_->getPosition().x, yOffset, this->activeBrick_->getPosition().z)); 148 216 return false; 149 217 } … … 151 219 return true; 152 220 } 221 /** 222 * @brief This function determines wether a brick touches another brick or the ground. 223 * 224 */ 225 bool Tetris::isValidBrickPosition(TetrisBrick* brick) 226 { 227 assert(brick); 228 229 const Vector3& brickPosition = this->activeBrick_->getPosition(); 230 231 // check all stones in the brick 232 for (unsigned int i = 0; i < brick->getNumberOfStones(); i++ ) 233 { 234 TetrisStone* stone = brick->getStone(i); 235 const Vector3& stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount()); 236 if(! this->isValidStonePosition(stone, brickPosition + stonePosition) ) 237 { 238 // recurse because all stones have to checked again after the brick was re-positioned 239 this->isValidBrickPosition(brick); 240 return false; 241 } 242 } 243 return true; 244 } 245 246 /** 247 @brief 248 A Vector3 is rolled 90 * degrees * amount (anticlockwise rotation) 249 */ 250 Vector3 Tetris::rotateVector(Vector3 position, unsigned int amount) 251 { 252 float temp = 0; 253 for(unsigned int i = 0; i < amount; i++) 254 { 255 temp = position.x; 256 position.x = -position.y; 257 position.y = temp; 258 } 259 return position; 260 } 153 261 154 262 /** … … 160 268 if (this->center_ != NULL) // There needs to be a TetrisCenterpoint, i.e. the area the game takes place. 161 269 { 162 // Create the first stone.163 this->create Stone();270 // Create the first brick. 271 this->createBrick(); 164 272 } 165 273 else // If no centerpoint was specified, an error is thrown and the level is exited. … … 190 298 void Tetris::end() 191 299 { 300 this->activeBrick_->setVelocity(Vector3::ZERO); 301 if(this->activeBrick_ != NULL) 302 { 303 this->player_->stopControl(); 304 } 305 192 306 this->cleanup(); 193 307 … … 225 339 } 226 340 227 /** 228 @brief 229 Starts the first stone. 230 */ 231 void Tetris::startStone(void) 341 342 343 void Tetris::startBrick(void) 232 344 { 233 345 if(this->player_ == NULL) … … 235 347 236 348 unsigned int cameraIndex = 0; 237 if(this->active Stone_ != NULL)349 if(this->activeBrick_ != NULL) 238 350 { 239 351 // Get camera settings 240 cameraIndex = this->active Stone_->getCurrentCameraIndex();352 cameraIndex = this->activeBrick_->getCurrentCameraIndex(); 241 353 this->player_->stopControl(); 242 } 243 244 // Make the last stone to be created the active stone. 245 this->activeStone_ = this->stones_.back(); 246 247 this->player_->startControl(this->activeStone_); 248 this->activeStone_->setVelocity(0.0f, -this->center_->getStoneSpeed(), 0.0f); 249 this->activeStone_->setCameraPosition(cameraIndex); 250 } 251 252 /** 253 @brief 254 Creates a new stone. 255 */ 256 void Tetris::createStone(void) 257 { 258 // Create a new stone and add it to the list of stones. 259 TetrisStone* stone = new TetrisStone(this->center_); 260 this->stones_.push_back(stone); 261 262 // Apply the stone template to the stone. 263 stone->addTemplate(this->center_->getStoneTemplate()); 264 265 // Attach the stone to the Centerpoint and set the position of the stone to be at the top middle. 266 this->center_->attach(stone); 354 // destroy old active brick 355 this->activeBrick_->destroy(); 356 } 357 358 // Make the last brick to be created the active brick. 359 this->activeBrick_ = this->futureBrick_; 360 this->futureBrick_ = 0; 361 362 // set its position 363 this->player_->startControl(this->activeBrick_); 267 364 float xPos = (this->center_->getWidth()/2 + ((this->center_->getWidth() % 2)*2-1)/2.0f)*this->center_->getStoneSize(); 268 365 float yPos = (this->center_->getHeight()-0.5f)*this->center_->getStoneSize(); 269 stone->setPosition(xPos, yPos, 0.0f); 270 stone->setGame(this); 271 } 366 this->activeBrick_->setPosition(xPos, yPos, 0.0f); 367 this->activeBrick_->setVelocity(0.0f, -this->center_->getStoneSpeed(), 0.0f); 368 this->activeBrick_->setCameraPosition(cameraIndex); 369 370 // create a new future brick 371 this->createBrick(); 372 373 // check if the new brick is in a valid position, otherwise end the game 374 if (!this->isValidBrickPosition(this->activeBrick_)) 375 this->end(); 376 } 377 378 void Tetris::createBrick(void) //TODO: random rotation offset between 0 and 3 (times 90°) 379 { 380 // create new futureBrick_ 381 this->futureBrick_ = new TetrisBrick(this->center_); 382 383 384 // Apply the stone template to the stone. 385 this->futureBrick_->addTemplate(this->center_->getBrickTemplate()); 386 387 // Attach the brick to the Centerpoint and set the position of the brick to be at the left side. 388 this->center_->attach(this->futureBrick_); 389 float xPos = (this->center_->getWidth()*1.6f + ((this->center_->getWidth() % 2)*2-1)/2.0f)*this->center_->getStoneSize(); 390 float yPos = (this->center_->getHeight()-5.1f)*this->center_->getStoneSize(); 391 this->futureBrick_->setPosition(xPos, yPos, 0.0f); 392 this->futureBrick_->setGame(this); 393 } 394 272 395 273 396 /** … … 282 405 } 283 406 407 /*TetrisCenterpoint* Tetris::getCenterpoint(void) const 408 { 409 return this->center_; 410 }*/ 411 284 412 /** 285 413 @brief Set the TetrisCenterpoint (the playing field). … … 291 419 } 292 420 421 /** 422 @brief Check each row if it is full. Removes all full rows. Update 423 @brief Manages score. 424 */ 425 void Tetris::findFullRows() 426 { 427 unsigned int correctPosition = 0; 428 unsigned int stonesPerRow = 0; 429 for (unsigned int row = 0; row < this->center_->getHeight(); row++) 430 { 431 stonesPerRow = 0; 432 for(std::list<SmartPtr<TetrisStone> >::iterator it = this->stones_.begin(); it != this->stones_.end(); ) 433 { 434 std::list<SmartPtr<TetrisStone> >::iterator it_temp = it++; 435 correctPosition = static_cast<unsigned int>(((*it_temp)->getPosition().y - 5)/this->center_->getStoneSize()); 436 if(correctPosition == row) 437 { 438 stonesPerRow++; 439 if(stonesPerRow == this->center_->getWidth()) 440 { 441 clearRow(row); 442 row--; //the row counter has to be decreased in order to detect multiple rows! 443 this->playerScored(this->player_);// add points 444 //increase the stone's speed 445 this->center_->setStoneSpeed(this->center_->getStoneSpeed()+1.0f); 446 } 447 } 448 } 449 } 450 } 451 452 void Tetris::clearRow(unsigned int row) 453 {// clear the full row 454 for(std::list<SmartPtr<TetrisStone> >::iterator it = this->stones_.begin(); it != this->stones_.end(); ) 455 { 456 if(static_cast<unsigned int>(((*it)->getPosition().y - 5)/this->center_->getStoneSize()) == row) 457 { 458 (*it)->destroy(); 459 this->stones_.erase(it++); 460 } 461 else 462 ++it; 463 } 464 // adjust height of stones above the deleted row //TODO: check if this could be a source of a bug. 465 for(std::list<SmartPtr<TetrisStone> >::iterator it = this->stones_.begin(); it != this->stones_.end(); ++it) 466 { 467 if(static_cast<unsigned int>(((*it)->getPosition().y - 5)/this->center_->getStoneSize()) > row) 468 (*it)->setPosition((*it)->getPosition()-Vector3(0,10,0)); 469 } 470 471 } 472 473 293 474 } -
code/trunk/src/modules/tetris/Tetris.h
r8706 r9348 56 56 public: 57 57 Tetris(BaseObject* creator); //!< Constructor. Registers and initializes the object. 58 virtual ~Tetris(); //!< Destructor. Cleans up, if initialized. 58 virtual ~Tetris(); //!< Destructor. Cleans up, if initialized. 59 59 60 60 virtual void start(void); //!< Starts the Tetris minigame. … … 68 68 69 69 PlayerInfo* getPlayer(void) const; //!< Get the player. 70 WeakPtr<TetrisCenterpoint> getCenterpoint(void) 71 { return this->center_; } 70 72 71 73 bool isValidMove(TetrisStone* stone, const Vector3& position); 74 bool isValidMove(TetrisBrick* brick, const Vector3& position, bool isRotation); 75 Vector3 rotateVector(Vector3 position, unsigned int amount); 72 76 73 77 protected: 74 78 virtual void spawnPlayersIfRequested(); //!< Spawns player. 75 79 80 76 81 private: 77 void start Stone(void); //!< Starts with the first stone.78 void create Stone(void);82 void startBrick(void); 83 void createBrick(void); 79 84 void cleanup(void); //!< Cleans up the Gametype by destroying the ball and the bats. 80 85 bool isValidStonePosition(TetrisStone* stone, const Vector3& position); 81 86 bool isValidBrickPosition(TetrisBrick* brick); 87 void findFullRows(void); 88 void clearRow(unsigned int row); 89 90 82 91 PlayerInfo* player_; 83 92 84 93 WeakPtr<TetrisCenterpoint> center_; //!< The playing field. 85 std:: vector<TetrisStone*> stones_; //!< A list of all stones in play.86 std::vector< std::vector<bool> > grid_;87 TetrisStone* activeStone_;88 94 std::list<SmartPtr<TetrisStone> > stones_; //!< A list of all stones in play. 95 WeakPtr<TetrisBrick> activeBrick_; 96 WeakPtr<TetrisBrick> futureBrick_; 97 89 98 Timer starttimer_; //!< A timer to delay the start of the game. 90 99 }; -
code/trunk/src/modules/tetris/TetrisCenterpoint.cc
r8706 r9348 30 30 @file TetrisCenterpoint.cc 31 31 @brief Implementation of the TetrisCenterpoint class. 32 @ingroup Tetris 32 33 */ 33 34 … … 55 56 this->stoneSize_ = 10.0f; 56 57 this->stoneTemplate_ = ""; 58 this->brickTemplate_ = ""; 57 59 this->stoneSpeed_ = 20.0f; 58 60 … … 69 71 70 72 XMLPortParam(TetrisCenterpoint, "width", setWidth, getWidth, xmlelement, mode); // die Breite 71 XMLPortParam(TetrisCenterpoint, "height", setHeight, setWidth, xmlelement, mode); // die Grösse73 XMLPortParam(TetrisCenterpoint, "height", setHeight, getHeight, xmlelement, mode); // die Grösse //was sollte das mit setWidth?? 72 74 XMLPortParam(TetrisCenterpoint, "stoneSize", setStoneSize, getStoneSize, xmlelement, mode); 73 75 XMLPortParam(TetrisCenterpoint, "stoneTemplate", setStoneTemplate, getStoneTemplate, xmlelement, mode); 76 XMLPortParam(TetrisCenterpoint, "brickTemplate", setBrickTemplate, getBrickTemplate, xmlelement, mode); 74 77 XMLPortParam(TetrisCenterpoint, "stoneSpeed", setStoneSpeed, getStoneSpeed, xmlelement, mode); 75 78 } -
code/trunk/src/modules/tetris/TetrisCenterpoint.h
r8706 r9348 45 45 46 46 namespace orxonox 47 { 47 {//idea: add 2 triggers to the centerpoint (one to determine when a box would go above the centerpoint; 48 //the other to find out when the lowest row is filled totally) 48 49 49 50 /** … … 118 119 119 120 /** 121 @brief Set the template for the bricks. 122 @param template The template name to be applied to each brick. 123 */ 124 void setBrickTemplate(const std::string& templateName) 125 { this->brickTemplate_ = templateName; } 126 /** 127 @brief Get the template for the bricks. 128 @return Returns the template name to be applied to each brick. 129 */ 130 const std::string& getBrickTemplate(void) const 131 { return this->brickTemplate_; } 132 133 /** 120 134 @brief Set the speed of the stones. 121 135 @param speed The speed to be set. … … 137 151 float stoneSize_; 138 152 std::string stoneTemplate_; 153 std::string brickTemplate_; 139 154 float stoneSpeed_; 140 155 -
code/trunk/src/modules/tetris/TetrisPrereqs.h
r8706 r9348 68 68 class TetrisCenterpoint; 69 69 class TetrisStone; 70 class TetrisBrick; 71 class TetrisScore; 70 72 } 71 73 -
code/trunk/src/modules/tetris/TetrisStone.cc
r8706 r9348 30 30 @file TetrisStone.cc 31 31 @brief Implementation of the TetrisStone class. 32 @ingroup Tetris 32 33 */ 33 34 … … 47 48 Constructor. Registers and initializes the object. 48 49 */ 49 TetrisStone::TetrisStone(BaseObject* creator) : ControllableEntity(creator)50 TetrisStone::TetrisStone(BaseObject* creator) : MovableEntity(creator) 50 51 { 51 52 RegisterObject(TetrisStone); 52 53 53 54 this->size_ = 10.0f; 54 55 this->delay_ = false; 55 56 this->delayTimer_.setTimer(0.2f, false, createExecutor(createFunctor(&TetrisStone::enableMovement, this))); 57 this->lockRotation_ = false; 58 56 59 } 57 60 … … 64 67 void TetrisStone::moveFrontBack(const Vector2& value) 65 68 { 66 if(value.x < 0) 69 if(value.x < 0) //speedup on key down 67 70 { 68 71 this->setVelocity(this->getVelocity()*1.1); 72 } 73 else if(!this->lockRotation_) //rotate when key up is pressed 74 { 75 this->lockRotation_ = true; // multiple calls of this function have to be filtered out. 76 this->rotationTimer_.setTimer(0.1f, false, createExecutor(createFunctor(&TetrisStone::unlockRotation, this))); 77 Quaternion q(Degree(90), Vector3::UNIT_Z); 78 this->setOrientation(this->getOrientation()*q); //rotation: roll 90° 79 69 80 } 70 81 } -
code/trunk/src/modules/tetris/TetrisStone.h
r8706 r9348 38 38 #include "tetris/TetrisPrereqs.h" 39 39 40 #include "worldentities/ ControllableEntity.h"40 #include "worldentities/MovableEntity.h" 41 41 #include "tools/Timer.h" 42 42 … … 51 51 @ingroup Tetris 52 52 */ 53 class _TetrisExport TetrisStone : public ControllableEntity53 class _TetrisExport TetrisStone : public MovableEntity 54 54 { 55 55 public: … … 81 81 void enableMovement(void) 82 82 { this->delay_ = false; } 83 83 void unlockRotation(void) 84 { this->lockRotation_ = false; } 85 84 86 float size_; //!< The dimensions a stone has in the game world. 85 87 bool delay_; 88 bool lockRotation_; 86 89 Timer delayTimer_; 90 Timer rotationTimer_; ///!< This timer is used to filter out multiple rotation inputs. 87 91 88 92 Tetris* tetris_; -
code/trunk/src/modules/weapons/RocketController.cc
r8858 r9348 53 53 this->rocket_ = new SimpleRocket(this); 54 54 this->rocket_->setController(this); 55 this->setControllableEntity( dynamic_cast<ControllableEntity*>(this->rocket_));55 this->setControllableEntity(orxonox_cast<ControllableEntity*>(this->rocket_)); 56 56 } 57 57
Note: See TracChangeset
for help on using the changeset viewer.