Changeset 6475 for code/branches/pickup3/src/orxonox
- Timestamp:
- Mar 5, 2010, 6:26:54 PM (15 years ago)
- Location:
- code/branches/pickup3/src/orxonox
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/pickup3/src/orxonox/interfaces/PickupCarrier.h
r6474 r6475 65 65 @return Returns true if the Pickupable was picked up, false if not. 66 66 */ 67 inlinebool pickup(Pickupable* pickup)67 bool pickup(Pickupable* pickup) 68 68 { 69 69 bool pickedUp = this->pickups_.insert(pickup).second; … … 78 78 @return Returns true if the Pickupable has been dropped, false if not. 79 79 */ 80 inlinebool drop(Pickupable* pickup)80 bool drop(Pickupable* pickup) 81 81 { 82 82 bool dropped = this->pickups_.erase(pickup) == 1; … … 84 84 { 85 85 pickup->dropped(); 86 //TODO: Create Spawner.87 86 } 88 87 return dropped; 89 88 } 90 89 91 inline bool isTarget(Pickupable* pickup) 90 /** 91 @brief Can be used to check whether the PickupCarrier or a child of his is a target ot the input Pickupable. 92 @param pickup A pointer to the Pickupable. 93 @return Returns true if the PickupCarrier or one of its children is a target, false if not. 94 */ 95 //TODO: Use? 96 bool isTarget(const Pickupable* pickup) 92 97 { 93 if(pickup->isTarget(this)) 98 if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target. 94 99 return true; 95 const std::list<PickupCarrier*>* children = this->getChildren(); 100 101 //! Go recursively through all children to check whether they are a target. 102 std::list<PickupCarrier*>* children = this->getCarrierChildren(); 96 103 for(std::list<PickupCarrier*>::const_iterator it = children->begin(); it != children->end(); it++) 97 104 { … … 100 107 } 101 108 109 children->clear(); 110 delete children; 111 102 112 return false; 103 113 } 114 115 /** 116 @brief Get the carrier that is both a child of the PickupCarrier (or the PickupCarrier itself) and a target of the input Pickupable. 117 @param pickup A pounter to the Pickupable. 118 @return Returns a pointer to the PickupCarrier that is the target of the input Pickupable. 119 */ 120 PickupCarrier* getTarget(const Pickupable* pickup) 121 { 122 if(!this->isTarget(pickup)) 123 return NULL; 124 125 if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target. 126 return this; 127 128 //! Go recursively through all children to check whether they are the target. 129 std::list<PickupCarrier*>* children = this->getCarrierChildren(); 130 for(std::list<PickupCarrier*>::iterator it = children->begin(); it != children->end(); it++) 131 { 132 if(pickup->isTarget(*it)) 133 return *it; 134 } 135 136 children->clear(); 137 delete children; 138 139 return NULL; 140 } 104 141 105 protected: 106 //TODO: Good return type? 107 virtual const std::list<PickupCarrier*>* getChildren(void) = 0; 108 virtual PickupCarrier* getParent(void) = 0; 142 protected: 143 /** 144 @brief Get all direct children of this PickupSpawner. 145 This method needs to be implemented by any direct derivative class of PickupCarrier. 146 @return Returns a pointer to a list of all direct children. 147 */ 148 //TODO: Good return type? Maybe not const and destroyed in isTarget... 149 virtual std::list<PickupCarrier*>* getCarrierChildren(void) = 0; 150 /** 151 @brief Get the parent of this PickupSpawner 152 This method needs to be implemented by any direct derivative class of PickupCarrier. 153 @return Returns a pointer to the parent. 154 */ 155 virtual PickupCarrier* getCarrierParent(void) = 0; 156 /** 157 @brief Get the (absolute) position of the PickupCarrier. 158 This method needs to be implemented by any direct derivative class of PickupCarrier. 159 @return Returns the position as a Vector3. 160 */ 161 virtual const Vector3& getCarrierPosition(void) = 0; 109 162 110 163 private: 111 std::set<Pickupable*> pickups_; 164 std::set<Pickupable*> pickups_; //!< The list of Pickupables carried by this PickupCarrier. 112 165 113 114 166 }; 115 116 167 } 117 168 -
code/branches/pickup3/src/orxonox/interfaces/Pickupable.cc
r6474 r6475 36 36 #include "core/Identifier.h" 37 37 #include "core/CoreIncludes.h" 38 #include "pickup/PickupIdentifier.h" 38 39 #include "PickupCarrier.h" 39 40 … … 52 53 this->pickedUp_ = false; 53 54 this->carrier_ = NULL; 55 56 this->pickupIdentifier_ = new PickupIdentifier(); 54 57 } 55 58 … … 91 94 Returns true if the given PickupCarrier is a target. 92 95 */ 93 bool Pickupable::isTarget( PickupCarrier* carrier)96 bool Pickupable::isTarget(const PickupCarrier* carrier) const 94 97 { 95 98 Identifier* identifier = carrier->getIdentifier(); … … 156 159 this->setUsed(false); 157 160 this->setPickedUp(false); 161 162 bool created = this->createSpawner(this->getCarrier()->getCarrierPosition()); 163 158 164 this->setCarrier(NULL); 165 if(!created) 166 this->destroy(); 167 159 168 return true; 160 169 } -
code/branches/pickup3/src/orxonox/interfaces/Pickupable.h
r6474 r6475 39 39 #include <list> 40 40 #include "core/Super.h" 41 #include "pickup/PickupIdentifier.h"42 41 43 42 #include "core/OrxonoxClass.h" … … 83 82 bool dropped(void); //!< Sets the Pickupable to not picked up or dropped. 84 83 85 bool isTarget( PickupCarrier* carrier); //!< Get whether the given PickupCarrier is a target of this pickup.84 bool isTarget(const PickupCarrier* carrier) const; //!< Get whether the given PickupCarrier is a target of this pickup. 86 85 bool addTarget(PickupCarrier* target); //!< Add a PickupCarrier as target of this pickup. 87 86 … … 108 107 */ 109 108 virtual const PickupIdentifier* getPickupIdentifier(void) 110 { return &this->pickupIdentifier_; }109 { return this->pickupIdentifier_; } 111 110 112 111 virtual void destroy(void) … … 120 119 void initializeIdentifier(void) {} 121 120 121 /** 122 @brief Facilitates the creation of a PickupSpawner upon dropping of the Pickupable. 123 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.: 124 DroppedPickup(BaseObject* creator, Pickupable* pickup, const Vector3& position, float triggerDistance); 125 @param position The position at which the PickupSpawner should be placed. 126 @return Returns true if a spawner was created, false if not. 127 */ 128 virtual bool createSpawner(const Vector3& position) = 0; 129 122 130 //TODO: Move to private and create get method in protected. 123 PickupIdentifier pickupIdentifier_; //!< The PickupIdentifier of this Pickupable.131 PickupIdentifier* pickupIdentifier_; //!< The PickupIdentifier of this Pickupable. 124 132 125 133 private: -
code/branches/pickup3/src/orxonox/pickup/PickupIdentifier.cc
r6474 r6475 34 34 { 35 35 36 /** 37 @brief 38 Constructor. Registers the object and initializes member variables. 39 */ 36 40 PickupIdentifier::PickupIdentifier() 37 41 { 38 42 RegisterRootObject(PickupIdentifier); 39 43 40 44 this->classIdentifier_ = NULL; 41 45 } 42 46 … … 52 56 Pointer to the second PickupIdentifier, b. 53 57 @return 54 Returns an int .58 Returns an integer. 0 if the two compared PickupIdentifiers are the same, <0 if a < b and >0 if a > b. 55 59 */ 56 int PickupIdentifier::compare(const PickupIdentifier &identifier) const60 int PickupIdentifier::compare(const PickupIdentifier* identifier) const 57 61 { 58 if(!identifier.classIdentifier_->isExactlyA(this->classIdentifier_)) 59 return this->classIdentifier_->getName().compare(identifier.classIdentifier_->getName()); 62 //! If the classIdentifiers are not the same (meaning the PickupIdentifiers identify different classes), the obviously the two Pickupables identified by the PickupIdentifiers cannot be the same. An ordering is established through the alphabetical ordering of the respective classnames. 63 if(!identifier->classIdentifier_->isExactlyA(this->classIdentifier_)) 64 return this->classIdentifier_->getName().compare(identifier->classIdentifier_->getName()); 60 65 61 if(!(this->parameters_.size() == identifier.parameters_.size())) 66 //! If the class is the same for both PickupIdentifiers we go on to check the parameters of the class. 67 //! If the two have a different number of parameters then obviusly something is very wrong. 68 if(!(this->parameters_.size() == identifier->parameters_.size())) 62 69 { 63 70 COUT(1) << "Something went wrong in PickupIdentifier!" << std::endl; 64 return this->parameters_.size()-identifier .parameters_.size();71 return this->parameters_.size()-identifier->parameters_.size(); 65 72 } 66 73 74 //! We iterate through all parameters and compar their values (which are strings). The first parameter is the most significant. The ordering is once again established by the alphabetical comparison of the two value strings. 67 75 for(std::map<std::string, std::string>::const_iterator it = this->parameters_.begin(); it != this->parameters_.end(); it++) 68 76 { 69 if(identifier.parameters_.find(it->first) == identifier.parameters_.end()) 77 //!< If a parameter present in one of the identifiers is not found in the other, once again, something is very wrong. 78 if(identifier->parameters_.find(it->first) == identifier->parameters_.end()) 70 79 { 71 80 COUT(1) << "Something went wrong in PickupIdentifier!" << std::endl; 72 81 return -1; 73 82 } 74 if(identifier .parameters_.find(it->first)->second != it->second)75 return it->second.compare(identifier .parameters_.find(it->first)->second);83 if(identifier->parameters_.find(it->first)->second != it->second) 84 return it->second.compare(identifier->parameters_.find(it->first)->second); 76 85 } 77 86 … … 79 88 } 80 89 90 /** 91 @brief 92 Add the class of the Pickupable to its PickupIdentifier. 93 @param identifier 94 A pointer to the Identifier of the class. 95 */ 81 96 void PickupIdentifier::addClass(Identifier* identifier) 82 97 { … … 84 99 } 85 100 101 /** 102 @brief 103 Add a parameter to the PickupIdentifier. 104 @param name 105 The name of the parameter. 106 @param value 107 The value of the parameter. 108 @return 109 Returns false if the parameter already existed, true if not. 110 */ 86 111 bool PickupIdentifier::addParameter(std::string & name, std::string & value) 87 112 { -
code/branches/pickup3/src/orxonox/pickup/PickupIdentifier.h
r6474 r6475 32 32 #include "OrxonoxPrereqs.h" 33 33 34 #include "core/OrxonoxClass.h"35 #include "core/Identifier.h"36 34 #include <map> 37 35 #include <string> 36 #include "core/Identifier.h" 37 38 #include "core/OrxonoxClass.h" 38 39 39 40 namespace orxonox 40 41 { 41 42 43 /** 44 @brief 45 The purpose of the PickupIdentifier class is to identify different types of pickups allthough they are of the same class. 46 This allows for more generic classes (or pickups in this case) that can be a number of different pickup types and can be identified as such without the need for a lot of different classes. An example is the HealthPickup class that encompasses a wide variety of different types of health pickups, e.g a HealthPickup that adds 10 health every second for 10 seconds or a HealthPickup that adds 100 health as soon as it is picked up, a.s.o. 47 To that purpose this class provides functionality to compare two PickupIdentifier (and since all Pickupables have an Identifier through that Pickupables can be compared). It als provides functionality to add parameters that distinguish between different types of pickups in the same pickup class. 48 Lastly a struct is provided that can be used in stl containers to establish a strictly lesser ordering between PickupIdentifiers (and thus Pickupables). 49 @author 50 Damian 'Mozork' Frick 51 */ 42 52 class _OrxonoxExport PickupIdentifier : virtual public OrxonoxClass 43 53 { 44 54 45 55 public: 46 PickupIdentifier(void); 47 ~PickupIdentifier(); 56 PickupIdentifier(void); //!< Constructor. 57 ~PickupIdentifier(); //!< Destructor. 48 58 49 virtual int compare(const PickupIdentifier & identifier) const;59 virtual int compare(const PickupIdentifier* identifier) const; //!< Compares two PickupIdentifiers and returns 0 if a == b, <0 if a < b and >0 if a > b for a.compare(b). 50 60 51 void addClass(Identifier* identifier); 52 bool addParameter(std::string & name, std::string & value); 61 void addClass(Identifier* identifier); //!< Add the class of the Pickupable to its PickupIdentifier. 62 bool addParameter(std::string & name, std::string & value); //!< Add a parameter to the PickupIdentifier. 53 63 54 64 private: 55 Identifier* classIdentifier_; 56 std::map<std::string, std::string> parameters_; 57 65 Identifier* classIdentifier_; //!< The Identifier of the class. 66 std::map<std::string, std::string> parameters_; //!< The parameters identifying the type of the pickup beyond the class. 58 67 59 68 }; 60 69 61 //TODO: Needed? 70 /** 71 @brief 72 Struct that overloads the compare operation between two PickupIdentifier pointers. 73 */ 62 74 struct PickupIdentifierCompare 63 75 { 64 bool operator() (const PickupIdentifier& lhs, const PickupIdentifier& rhs) const65 { return lhs.compare(rhs) < 0; }66 };67 68 struct PickupIdentifierPtrCompare69 {70 76 bool operator() (const PickupIdentifier* lhs, const PickupIdentifier* rhs) const 71 { return lhs->compare( *rhs) < 0; }77 { return lhs->compare(rhs) < 0; } 72 78 }; 73 79 -
code/branches/pickup3/src/orxonox/worldentities/pawns/Pawn.h
r6466 r6475 138 138 //TODO: Remove. 139 139 //PickupCollection pickups_; 140 virtual const std::list<PickupCarrier*>* getChildren(void)140 virtual std::list<PickupCarrier*>* getCarrierChildren(void) 141 141 { return new std::list<PickupCarrier*>(); } 142 virtual PickupCarrier* get Parent(void)142 virtual PickupCarrier* getCarrierParent(void) 143 143 { return NULL; } 144 virtual const Vector3& getCarrierPosition(void) 145 { return this->getWorldPosition(); }; 144 146 145 147 float health_;
Note: See TracChangeset
for help on using the changeset viewer.