Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/util/track/track_manager.h @ 10230

Last change on this file since 10230 was 10088, checked in by patrick, 18 years ago

added the track subsystem to the buildprocess again, integrated it into the new basobject framework and commented out big regions of code because it didn't compile.
@beni: your work now can begin :D

File size: 9.2 KB
RevLine 
[4584]1/*!
[5014]2 * @file track_manager.h
3 *  manages all tracks defined in the world and the path the player takes
4 *
5 * it is a container for all tracks and all track-nodes. it manages the movement of
6 * the track helper-parent (that drives the player). it is responsable for calculating
7 * smooth curves etc.
[3311]8*/
9
10
11#ifndef _TRACK_MANAGER_H
12#define _TRACK_MANAGER_H
13
[3495]14#include "curve.h"
[3608]15#include "base_object.h"
[3311]16
[4381]17#ifndef NULL
[4489]18#define NULL   0  //!< NULL
[4381]19#endif
20
[3845]21// Forward Definition
[3433]22class PNode;
[3845]23class Text;
[4261]24class TiXmlElement;
[3847]25template<class T> class tAnimation;
[3311]26
[3588]27// Static Definitions
28
[4489]29//! The default Curve-Type to set for the whole path (if not chosen otherwise).
[4833]30#define     TMAN_DEFAULT_CURVETYPE    CURVE_BEZIER
[4489]31//! A default value for the duration for each TrackElement
[4833]32#define     TMAN_DEFAULT_DURATION     10
[4489]33//! A default width for the width of a TrackElement
[4833]34#define     TMAN_DEFAULT_WIDTH        10
[3588]35
[3331]36//! A Graph-Element, that holds the curve-structure of a Level.
37/**
38   A TrackElement is used, to define the structure of the Track itself.
39   It is a graph and not a tree, because paths can fork and join again.
40*/
[4584]41class TrackElement : public BaseObject
[3331]42{
[10088]43  ObjectListDeclaration(TrackElement);
44
[3331]45 public:
[4746]46  TrackElement();
[6981]47  virtual ~TrackElement();
[3331]48
[3332]49  TrackElement* findByID(unsigned int trackID);
[7221]50  TrackElement* findByName(const std::string& trackName);
[4746]51  bool backLoopCheck() const;
[3332]52
[5313]53  TrackElement* getChild(unsigned int childNumber) const;
[3594]54
[4508]55 private:
56  bool backLoopCheckAtomic(tList<const TrackElement>* trackList) const;
[4489]57
[4508]58 public:
[3588]59  // atributes
[4489]60  bool                  isFresh;              //!< If no Points where added until now
61  bool                  isHotPoint;           //!< If the first node is a specialPoint;
62  bool                  isSavePoint;          //!< If the first node is a savePoint
63  bool                  isFork;               //!< If the first node is a Fork
64  bool                  isJoined;             //!< If the End of the Curve is joined.
65  bool                  mainJoin;             //!< If the End of the Curve is joined, and this is the one Curve the others join to.
66  int                   ID;                   //!< The ID of this TrackElement
67  float                 startingTime;         //!< The time at which this Track begins.
68  float                 duration;             //!< The time used to cross this TrackElement (curve).
69  float                 endTime;              //!< The time at which this Track ends.
70  float                 jumpTime;             //!< The Time this Track has to jump to its preceding Track (only >0 if Track isJoined==true)
71  float                 width;                //!< Th width of the Path. This tells the Player(s), how far he(they) can go to the left/right.
72  int                   nodeCount;            //!< The count of points this TrackElement has.
73  Curve*                curve;                //!< The Curve of this TrackElement
74  int                   childCount;           //!< The number of Children This TrackElement has.
75  tList<TrackElement>*  children;             //!< A TrackElement can have a Tree of following TrackElements.
[3522]76
[3588]77
[3527]78  // runtime
79  TrackElement* history;     //!< a pointer to the last TrackElement we were on. This is if you want to walk the path backwards again.
80
[4746]81  void debug() const;
[3593]82
[3522]83  // CONDITION FUNCTIONS and STUFF
84  void* subject;             //!< The Subject the Condition should act upon.
[3835]85  int (TrackElement::*condFunc)(const void*) const; //!< Pointer to the condition function
[3522]86
[3835]87  int lowest(const void* nothing) const;
88  int highest(const void* nothing) const;
89  int random(const void* nothing) const;
[3522]90
[3835]91  int leftRight(const void* node) const;
92  int nearest(const void* node) const;
[3522]93  // todo  int enemyKilled(void* entity);
[3588]94
[3331]95};
96
[3522]97//! the Condition to choose between the different ways of the game.
98enum CONDITION {LOWEST, HIGHEST, RANDOM, LEFTRIGHT, NEAREST, ENEMYKILLED};
[3331]99
[3330]100//! The TrackManager handles the flow of the Players through the game.
101/**
102
103   <b>The TrackManager works as followed:</b> \n
104     \n
105   <b>1. Initialize it, by setting up the Graph. You can do this by using the following Commands.</b>
106    \li workOn(): changes the ID that will be altered through the changes.
[3332]107    \li setCurveType(): lets you set the CurveType of the Curve we are Working on. (default is BezierCurve, set this as early as possible, for this uses resources).
[3333]108    \li setDuration(): sets the length of the current path in seconds.
[3330]109    \li addPoint(): adds a point to the Curve.
110    \li addHotPoint(): adds save/splitpoint.\n
111    \li fork(): adds some interessting non-linear movments through the level (fork will force addHotPoint if not done then).
112    \li condition(): decides under what condition a certain Path will be chosen.
113    \li join(): joins some tracks together again. Join will set the localTime to the longest time a Path has to get to this Point)
114    \li setSavePoint(): Sets a HotPoint into a savePoint. A Savepoint can be used as a rollbackpoint if a Player gets shot.
115
[3332]116    HotPoints and Joins are at the beginning of a TrackElement. \n
117    SavePoints and Forks are at the end of a TrackElement \n
[3330]118    look out: <b>SAVEPOINTS CAN NOT BE FORKS</b> (but joins), because the condition is really hard to guess if you do not give some impuls. \n
119\n
120   <b> 2. Runtime knows the following: </b>
121    \li calcPos(): returns the current position on the track
122    \li calcDir(): returns the current Direction the track is flying on.
123    \li tick(): makes a Step on the Path. increases localTime by dt.
124    \li choosePath(): a Function that decides which Path we should follow.
[4584]125
[3330]126   TrackManager can be handled as a StateMachine.
[3331]127   \n\n
[4584]128    Names:
[3331]129    \li TrackManager: handles Tracks
130    \li Track:        The Track that the ship can follow
131    \li Path:         one way through the Level, that is dependent on conditionals.
132    \li Conditional:  A decition making device, that chooses betwen different TrackElements for the Path.
133    \li TrackElement: A Part of A whole Track
[3330]134*/
[10088]135class TrackManager
[3331]136{
[3311]137 public:
[4746]138  virtual ~TrackManager();
[4836]139  /** @returns a Pointer to the only object of this Class */
[4746]140  inline static TrackManager* getInstance() { if (!singletonRef) singletonRef = new TrackManager();  return singletonRef; };
[3544]141
[6512]142  virtual void loadParams(const TiXmlElement* root);
[3311]143
[3330]144  // Methods to change the Path (initialisation)
[3332]145  void workOn(unsigned int trackID);
[7221]146  void workOnS(const std::string& trackName);
[3836]147
[4836]148  /** \see setCurveType(CurveType curveType, TrackElement* trackElem); @param curveType the type of the Curve */
[3522]149  inline void setCurveType(CurveType curveType) { this->setCurveType (curveType, this->currentTrackElem);};
[3433]150  void setCurveType(CurveType curveType, TrackElement* trackElem);
[4496]151  void setDuration(float duration);
152  void setDuration(float duration, TrackElement* trackElem);
153  void addPoint(float x, float y, float z);
154  void addPointV(Vector newPoint, TrackElement* trackElem = NULL);
[4509]155  void addHotPoint(float x, float y, float z);
156  int addHotPointV(Vector newPoint, TrackElement* trackElem = NULL);
[7221]157  void setSavePointS(const std::string& nextElementName);
[4502]158  void setSavePoint(TrackElement* trackElem = NULL);
[3332]159  void fork(unsigned int count, ...);
[4220]160  void forkS(unsigned int count, ...);
[7221]161  void forkS(const std::string& forkString);
[4220]162  void forkV(unsigned int count, int* trackIDs, char** trackNames, TrackElement* trackElem = NULL);
[3837]163  void condition(unsigned int trackID, CONDITION cond, void* subject);
164  void condition(CONDITION cond, void* subject, TrackElement* trackElem = NULL);
[3332]165  void join(unsigned int count, ...);
[7221]166  void joinS(const std::string& joinString);
[4220]167  void joinS(unsigned int cound, ...);
[3332]168  void joinV(unsigned int count, int* trackIDs);
[4746]169  void finalize();
[3311]170
[3330]171  // Methods to calculate the position on the Path (runtime)
[4746]172  inline Vector calcPos() const;
173  inline Vector calcDir() const;
174  float getWidth() const;
[3330]175  void tick(float dt);
[3331]176  void jumpTo(float time);
[3522]177  inline int choosePath(TrackElement* trackElem);
[3311]178
[3433]179  void setBindSlave(PNode* bindSlave);
[4746]180  PNode* getTrackNode();
[3433]181
[3350]182  // DEBUG //
183  void drawGraph(float dt) const;
184  void debug(unsigned int level) const;
[4489]185
186 private:
[4746]187  TrackManager();
[4489]188  void initChildren(unsigned int childCount, TrackElement* trackElem = NULL);
189
190 private:
191  static TrackManager* singletonRef;           //!< There may only be one TrackManager.
192
193  TrackElement*        firstTrackElem;         //!< The first TrackElement that exists.
194  TrackElement*        currentTrackElem;       //!< The TrackElement we are working on.
195  CurveType            curveType;              //!< The CurveType the entire TrackSystem will have.
196  float                localTime;              //!< The time that has been passed since the traveling the Track.
197  float                maxTime;                //!< The maximal time the track has.
198  int                  trackElemCount;         //!< The count of TrackElements that exist.
199
200  // external
201  PNode*               bindSlave;              //!< The node that is slave to the TrackManager. This node will be moved while update the TrackManager, and must NOT move itself.
202  PNode*               trackNode;              //!< The main TrackNode of this Track.
203  Text*                trackText;              //!< The text to display when switching between Worlds.
204  tAnimation<Text>*    textAnimation;          //!< An Animation for the Text. (for fading it out on trackName-change)
[3311]205};
206
207#endif /* _TRACK_MANAGER_H */
Note: See TracBrowser for help on using the repository browser.