Changeset 8404
- Timestamp:
- May 5, 2011, 4:14:07 PM (14 years ago)
- Location:
- code/branches/spaceboundaries/src/orxonox/worldentities
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/spaceboundaries/src/orxonox/worldentities/SpaceBoundaries.cc
r8301 r8404 50 50 this->setShowDistance(2500); 51 51 this->setHealthDecrease(1); 52 this->setReaction(0); 52 53 53 54 RegisterObject(SpaceBoundaries); … … 62 63 delete this->centerRadar_; 63 64 64 if(this->boundary_ != NULL)65 {66 delete this->boundary_;67 }68 69 65 this->pawnsIn_.clear(); 70 66 … … 106 102 { 107 103 Billboard *tmp = new Billboard(this); 108 setBillboardOptions( tmp );104 this->setBillboardOptions( tmp ); 109 105 tmp->setPosition(position); 110 106 billboardAdministration tmp2 = { true, tmp }; … … 171 167 return this->healthDecrease_; 172 168 } 169 170 void SpaceBoundaries::setReaction(int mode) 171 { 172 this->reaction_ = mode; 173 } 174 int SpaceBoundaries::getReaction() 175 { 176 return this->reaction_; 177 } 173 178 174 179 void SpaceBoundaries::XMLPort(Element& xmlelement, XMLPort::Mode mode) … … 179 184 XMLPortParam(SpaceBoundaries, "warnDistance", setWarnDistance, getWarnDistance, xmlelement, mode); 180 185 XMLPortParam(SpaceBoundaries, "healthDecrease", setHealthDecrease, getHealthDecrease, xmlelement, mode); 186 XMLPortParam(SpaceBoundaries, "reactionMode", setReaction, getReaction, xmlelement, mode); 181 187 } 182 188 183 189 void SpaceBoundaries::tick(float dt) 184 190 { 191 this->checkWhoIsIn(); 185 192 this->removeAllBillboards(); 186 193 COUT(0) << "Groesse der Liste: " << (int) pawnsIn_.size() << std::endl; … … 188 195 float distance; 189 196 bool humanItem; 190 for( std::list<Pawn*>::iterator current = pawnsIn_.begin(); current != pawnsIn_.end(); current++ ) 191 { 192 Pawn* currentPawn = *current; 193 distance = this->computeDistance(currentPawn); 194 humanItem = this->isHumanPlayer(currentPawn); 195 COUT(0) << "Distanz:" << distance << std::endl; // message for debugging 196 if(distance > this->warnDistance_ && distance < this->maxDistance_) // Zeige Warnung an! 197 { 198 COUT(0) << "You are leaving the area" << std::endl; // message for debugging 199 if(humanItem) 200 { 201 COUT(0) << "humanItem ist true" << std::endl; 202 this->displayWarning("Attention! You are leaving the area!"); 203 } else { 204 205 } 206 } 207 if( (this->maxDistance_ - distance) < this->showDistance_) 208 { 209 // Zeige Grenze an! 210 this->displayBoundaries(currentPawn); 211 } 212 if(distance > this->maxDistance_) 213 { 214 if(humanItem) 215 { 216 COUT(0) << "Health should be decreasing!" << std::endl; 217 this->displayWarning("You are out of the area now!"); 218 currentPawn->removeHealth( (distance - maxDistance_) * this->healthDecrease_); 219 } else { 220 221 } 222 223 this->bounceBack(currentPawn); 224 } 225 } 226 this->checkWhoIsIn(); 197 for( std::list<WeakPtr<Pawn> >::iterator current = pawnsIn_.begin(); current != pawnsIn_.end(); current++ ) 198 { 199 Pawn* currentPawn = current->get(); 200 if( currentPawn && currentPawn->getNode() ) 201 { 202 distance = this->computeDistance(currentPawn); 203 humanItem = this->isHumanPlayer(currentPawn); 204 COUT(0) << "Distanz:" << distance << std::endl; // message for debugging 205 if(distance > this->warnDistance_ && distance < this->maxDistance_) // Zeige Warnung an! 206 { 207 COUT(0) << "You are near by the boundaries!" << std::endl; // message for debugging 208 if(humanItem) 209 { 210 COUT(0) << "humanItem ist true" << std::endl; 211 this->displayWarning("Attention! You are near by the boundaries!"); 212 } 213 } 214 if( (this->maxDistance_ - distance) < this->showDistance_ ) 215 { 216 this->displayBoundaries(currentPawn); // Zeige Grenze an! 217 } 218 if(distance > this->maxDistance_ && (this->reaction_ == 1) ) 219 { 220 if( humanItem ) 221 { 222 COUT(0) << "Health should be decreasing!" << std::endl; 223 this->displayWarning("You are out of the area now!"); 224 } 225 currentPawn->removeHealth( (distance - this->maxDistance_) * this->healthDecrease_); 226 } 227 if( (this->reaction_ == 0) && (distance + 100 > this->maxDistance_)) // Annahme: Ein Pawn kann von einem Tick bis zum nächsten nicht mehr als 100 Distanzeinheiten zurücklegen. 228 { 229 this->conditionalBounceBack(currentPawn, distance, dt); 230 } 231 } 232 } 227 233 } 228 234 … … 254 260 } 255 261 256 void SpaceBoundaries:: bounceBack(Pawn *item)262 void SpaceBoundaries::conditionalBounceBack(Pawn *item, float currentDistance, float dt) 257 263 { 258 264 Vector3 normal = item->getPosition() - this->getPosition(); 259 if( item->getVelocity().dotProduct(normal) > 0 ) // Greife nur ein, falls sich das Pawn nach Aussen bewegt. 265 normal.normalise(); 266 Vector3 velocity = item->getVelocity(); 267 float normalSpeed = item->getVelocity().dotProduct(normal); 268 269 /* Checke, ob das Pawn innerhalb des nächsten Ticks, das erlaubte Gebiet verlassen würde. 270 Falls ja: Spicke es zurück. */ 271 if( currentDistance + normalSpeed * dt > this->maxDistance_ ) 260 272 { 261 273 float dampingFactor = 0.5; 262 263 normal.normalise();264 Vector3 velocity = item->getVelocity();265 274 velocity = velocity.reflect(normal); 266 275 Vector3 acceleration = item->getAcceleration(); -
code/branches/spaceboundaries/src/orxonox/worldentities/SpaceBoundaries.h
r8301 r8404 27 27 */ 28 28 29 /* TODO: - Sobald Bots im Spiel sind, stürzt das Programm relativ bald ab!!! 30 */ 31 32 33 /* REALISIERUNGSIDEEN: 34 35 Mehrere Instanzen: 36 Im Konstruktor schauen, wer innerhalb der eigenen Grenzen ist und diese in eine Liste geben, die in jeder tick-Funktion 37 durchgearbeitet wird. 38 Moeglichkeit bereitstellen, ein Pawn durch ein Portal einer anderen Instanz von SpaceBoundaries zuzuweisen. 39 Schauen, wie es zu handhaben ist, wenn ein neuer Spieler oder Bot nachtraeglich ins Spiel kommt. 40 29 /* TODO: - Textmessages und Billboards sollen teils nur bei einem humanPlayer angezeigt werden, nicht bei allen (vgl. Netzwerk-Spiel mit mehreren humanPlayers) 30 beachte hierzu folgende statische Funktion: 'static unsigned int Host::getPlayerID()' 31 (file:///home/kmaurus/orxonox/spaceBoundaries/build/doc/api/html/classorxonox_1_1_host.html#9c1e3b39e3b42e467dfbf42902911ce2) 32 33 - Kommentieren (Betrachte als Beispiel/Vorbild 'libraries/core/WeakPtr.h') 34 35 - Wiki-SpaceBoundaries-Eintrag aktualisieren 41 36 */ 42 37 … … 44 39 #define _SpaceBoundaries_H__ 45 40 46 /* Einige, spezifische include-Statements */ 41 47 42 #include "core/CoreIncludes.h" 43 #include "core/WeakPtr.h" 48 44 #include "tools/interfaces/Tickable.h" 49 45 #include "interfaces/RadarViewable.h" … … 56 52 #include <vector> 57 53 54 namespace orxonox 55 { 56 58 57 /** 59 @brief SpaceBoundaries gives level creators the possibility to bar Pawns from leaving a defined area .58 @brief SpaceBoundaries gives level creators the possibility to bar Pawns from leaving a defined area (until now this area is a ball). 60 59 61 60 Five attributes can/should be defined in the XML-File: 62 - 'position' : absolute position of the SpaceBoundaries class. 'warnDistance' and 'maxDistance' refer to this 'position'.63 61 - 'warnDistance' : If the distance between the pawn of the human player and 'position' is bigger than 'warnDistance', a message is displayed to 64 62 inform the player that he'll soon be leaving the allowed area. 65 63 - 'maxDistance' : defines the area, where a pawn is allowed to be (radius of a ball). 66 64 - 'showDistance' : If the distance between the pawn and the boundary of the allowed area is smaller than 'showDistance', the boundary is shown. 67 - 'healthDecrease' : a measure to define how fast the health of a pawn should decrease after leaving the allowed area. 68 Empfohlene Werte: 0.1 (langsame Health-Verminderung) bis 5 (sehr schnelle Health-Verminderung) 65 - 'healthDecrease' : a measure to define how fast the health of a pawn should decrease after leaving the allowed area (unnecessary if 'reactionMode' == 0). 66 Recommended values: 0.1 (slow health decrease) to 5 (very fast health decrease) 67 - 'reactionMode' : Integer-Value. Defines what effect appears if a space ship has crossed the boundaries. 68 0: Reflect the space ship (default). 69 1: Decrease Health of the space ship after having left the allowed area. 69 70 */ 70 71 71 namespace orxonox72 {73 72 class _OrxonoxExport SpaceBoundaries : public StaticEntity, public Tickable 74 73 { … … 79 78 void checkWhoIsIn(); //!< Update the list 'pawnsIn_'. 80 79 81 void positionBillboard(const Vector3 position); 80 void positionBillboard(const Vector3 position); //!< Display a Billboard at the position 'position'. 82 81 void setBillboardOptions(Billboard *billy); 83 void removeAllBillboards(); 82 void removeAllBillboards(); //!< Hide all all elements of '*billboard_' and set their attribute 'usedYet' to 0. 84 83 85 84 void setMaxDistance(float r); … … 94 93 void setHealthDecrease(float amount); 95 94 float getHealthDecrease(); 95 96 void setReaction(int mode); 97 int getReaction(); 96 98 97 99 void XMLPort(Element& xmlelement, XMLPort::Mode mode); … … 102 104 struct billboardAdministration{ bool usedYet; Billboard* billy; }; 103 105 104 std::list< Pawn*> pawnsIn_; //!< List of the pawns that this instance of SpaceBoundaries has to handle.106 std::list<WeakPtr<Pawn> > pawnsIn_; //!< List of the pawns that this instance of SpaceBoundaries has to handle. 105 107 106 108 std::vector<billboardAdministration> billboards_; 107 109 110 int reaction_; //!< Werte: 0, 1. 0: Reflektion an Boundaries (Standard). 1: Health-Abzug-Modus. 108 111 float maxDistance_; //!< maximal zulaessige Entfernung von 'this->getPosition()'. 109 112 float warnDistance_; //!< Entfernung von 'this->getPosition()', ab der eine Warnung angezeigt wird, dass man bald das zulaessige Areal verlaesst. … … 113 116 //!< Empfohlene Werte: 0.1 (langsame Health-Verminderung) bis 5 (sehr schnelle Health-Verminderung) 114 117 115 Billboard *boundary_;116 117 118 RadarViewable* centerRadar_; //!< Repraesentation von SpaceBoundaries auf dem Radar. 118 119 … … 120 121 void displayWarning(const std::string warnText); 121 122 void displayBoundaries(Pawn *item); 122 void bounceBack(Pawn *item);123 void conditionalBounceBack(Pawn *item, float currentDistance, float dt); 123 124 bool isHumanPlayer(Pawn *item); 124 125
Note: See TracChangeset
for help on using the changeset viewer.