Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/worldentities/pawns/SpaceShip.h @ 9495

Last change on this file since 9495 was 8727, checked in by dafrick, 13 years ago

Cleaning up in SpaceShip and Engine. Fixed several bugs.
Kicked localLinearAcceleration, primaryThrust and auxiliaryThrust out of the SpaceShip, since it wasn't used anymore.
Moved the trail lights back a bit.
Added some documentation to SpaceShip and Engine.
SpeedPickup is working again, will need some further tuning.

  • Property svn:eol-style set to native
File size: 14.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _SpaceShip_H__
30#define _SpaceShip_H__
31
32#include "OrxonoxPrereqs.h"
33
34#include <string>
35#include <LinearMath/btVector3.h>
36
37#include "tools/Timer.h"
38#include "util/Math.h"
39#include "util/OrxAssert.h"
40
41#include "Pawn.h"
42
43namespace orxonox
44{
45
46    /**
47    @brief
48        The SpaceShip is the principal entity through which the player interacts with the game. Its main function is to fly, however many things, such as @ref orxonox::Engine Engines or @ref orxonox::Weapon Weapons, can be attached to it.
49
50        There are several parameters that define the behavior of the SpaceShip>
51        - The <b>rotationThrust</b>, specifies the force with which the SpaceShip rotates.
52        - The <b>boost</b>, there are quite some parameters pertaining to boosting. The boost is a special move of the SpaceShip, where, for a limited amount of time, it can fly considerably faster than usual. The <b>boostPower</b> is the amount of power available for boosting. The <b>boostPowerRate</b> is the rate at which the boost power is replenished. The <b>boostRate</b> is the rate at which boosting uses power. And the <b>boostCooldownDuration</b> is the time the SpaceShip cannot boost, once all the boost power has been used up. Naturally all of these parameters must be non-negative.
53        - The <b>boost shaking</b>, when the SpaceShip boosts, the camera shakes to create a more immersive effect. Two parameters can be used to adjust the effect. The <b>shakeFrequency</b> is the frequency with which the camera shakes. And the <b>shakeAmplitude</b> is the amount with which the camera shakes. Again these parameters must bee non-negative.
54        - The <b>lift</b> creates a more natural flight feeling through the addition of a lift force. There are again tow parameters that can be specified. The <b>lift</b> which is the lift force that is applied. And the <b>stallSpeed</b> which is the forward speed after which no more lift is generated.
55
56        As mentioned @ref orxonox::Engine Engines can be mounted on the SpaceShip. Here is a (primitive) example of a SpaceShip defined in XML:
57        @code
58        <SpaceShip
59            rotationThrust    = 50
60
61            lift = 1;
62            stallSpeed = 220;
63
64            boostPower            = 15
65            boostPowerRate        = 1
66            boostRate             = 5
67            boostCooldownDuration = 10
68
69            shakeFrequency = 15
70            shakeAmplitude = 9
71
72            collisionType     = "dynamic"
73            mass              = 100
74            linearDamping     = 0.7
75            angularDamping    = 0.9999999
76            >
77                <engines>
78                    <Engine />
79                    <Engine />
80                </engines>
81            </SpaceShip>
82        @endcode
83
84    @author
85        Fabian 'x3n' Landau
86    */
87    class _OrxonoxExport SpaceShip : public Pawn
88    {
89        public:
90            SpaceShip(BaseObject* creator);
91            virtual ~SpaceShip();
92
93            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
94            virtual void tick(float dt);
95            void setConfigValues();
96
97            /**
98            @brief Move forward or backward,
99            @param value A vector whose first component specifies the amount of movement. Positive means forward, negative means backward.
100            */
101            virtual void moveFrontBack(const Vector2& value)
102                { this->steering_.z -= value.x; }
103            /**
104            @brief Move right or left.
105            @param value A vector whose first component specifies the amount of movement. Positive means right, negative means left.
106            */
107            virtual void moveRightLeft(const Vector2& value)
108                { this->steering_.x += value.x; }
109            /**
110            @brief Move up or down.
111            @param value A vector whose first component specifies the amount of movement. Positive means up, negative means down.
112            */
113            virtual void moveUpDown(const Vector2& value)
114                { this->steering_.y += value.x; }
115
116            virtual void rotateYaw(const Vector2& value); // Rotate in yaw direction.
117            virtual void rotatePitch(const Vector2& value); // Rotate in pitch direction.
118            virtual void rotateRoll(const Vector2& value); // Rotate in roll direction.
119
120            virtual void fire();
121            virtual void boost(bool bBoost); // Starts or stops boosting.
122
123            void addEngine(Engine* engine); // Add an Engine to the SpaceShip.
124            bool hasEngine(Engine* engine) const; // Check whether the SpaceShip has a particular Engine.
125            Engine* getEngine(unsigned int i); // Get the i-th Engine of the SpaceShip.
126            /**
127            @brief Get the list of all Engines that are mounted on the SpaceShip.
128            @return Returns a vector of all Engines of the SpaceShip.
129            */
130            inline const std::vector<Engine*>& getEngineList() const
131                { return this->engineList_; }
132            void removeEngine(Engine* engine); // Remove and destroy all Engines of the SpaceShip.
133            void removeAllEngines(); // Remove a particular Engine from the SpaceShip.
134
135            void addSpeedFactor(float factor); // Add to the speed factor for all engines of the SpaceShip.
136            void addSpeed(float speed); // Add to the speed of all engines of the SpaceShip.
137            float getSpeedFactor() const; // Get the mean speed factor over all engines of the SpaceShip.
138   
139            float getMaxSpeedFront() const; // Get the largest maximal forward speed over all engines of the SpaceShip.
140            float getBoostFactor() const; // Get the mean boost factor over all engines of the SpaceShip.
141
142            /**
143            @brief Set the steering direction of the SpaceShip.
144                   This is set through the user input.
145            @param direction The direction the SpaceShip should steer in.
146            */
147            inline void setSteeringDirection(const Vector3& direction)
148                { this->steering_ = direction; }
149            /**
150            @brief Get the steering direction of the SpaceShip.
151            @return Returns the steering direction of the SpaceShip. The length of the vector is the amount of steering needed.
152            */
153            inline const Vector3& getSteeringDirection() const
154                { return this->steering_; }
155
156            /**
157            @brief Check whether the SpaceShip is currently boosting.
158            @return Returns true if the SpaceShip is boosting, false if not.
159            */
160            inline bool isBoosting() const
161                { return this->bBoost_; }
162            /**
163            @brief Check whether the SpaceShip boost is cooling down.
164            @return Returns true if the SpaceShip is cooling down from boosting.
165            */
166            inline bool isBoostCoolingDown() const
167                { return bBoostCooldown_; }
168
169            /**
170            @brief Set the initial power available for boosting to the input value.
171                   The current boost power is set to the input value as well.
172            @param power The initial boost power. Must be non-negative.
173            */
174            inline void setInitialBoostPower(float power)
175                { OrxAssert(power >= 0.0f, "The boost power must be non-negative."); this->initialBoostPower_ = power; this->boostPower_ = power; }
176            /**
177            @brief Set the rate, at which boost power is recharged, to the input value.
178            @param rate The boost power rate in units per second. Must be non-negative.
179            */
180            inline void setBoostPowerRate(float rate)
181                { OrxAssert(rate >= 0.0f, "The boost power rate must be non-negative."); this->boostPowerRate_ = rate; }
182            /**
183            @brief Set the rate, at which boost power us used up, to the input value.
184            @param rate The boost rate in units per second. Must be non-negative.
185            */
186            inline void setBoostRate(float rate)
187                { OrxAssert(rate >= 0.0f, "The boost rate must be non-negative."); this->boostRate_ = rate; }
188            /**
189            @brief Set the duration for which boosting, if in cooldown, is not possible.
190                   Cooldown is reached if all boost power is depleted.
191            @param duration The cooldown duration in seconds. Must be non-negative.
192            */
193            inline void setBoostCooldownDuration(float duration)
194                { OrxAssert(duration >= 0.0f, "The boost cooldown duration must be non-negative."); this->boostCooldownDuration_ = duration; }
195            /**
196            @brief Set the frequency with which the camera shakes during boosting.
197            @param frequency The frequency in times per second. Must be non-negative.
198            */
199            inline void setShakeFrequency(float frequency)
200                { OrxAssert(frequency >= 0.0f, "The shake frequency must be non-negative."); this->shakeFrequency_ = frequency; }
201            /**
202            @brief Set the amplitude with which the camera shakes during boosting.
203            @param amplitude The amplitude. Must be non-negative.
204            */
205            inline void setShakeAmplitude(float amplitude)
206                { OrxAssert(amplitude >= 0.0f, "The shake amplitude must be non-negative."); this->shakeAmplitude_ = amplitude; }
207
208            /**
209            @brief Get the initial boost power. Is non-negative.
210            @return Returns the initial boost power.
211            */
212            inline float getInitialBoostPower() const
213                { return this->initialBoostPower_; }
214            /**
215            @brief Get the current boost power. Is non-negative.
216            @return Returns the current boost power.
217            */
218            inline float getBoostPower() const
219                { return this->boostPower_; }
220            /**
221            @brief Get the boost power rate.
222            @return Returns the boost power rate in units per second. Is non-negative.
223            */
224            inline float getBoostPowerRate() const
225                { return this->boostPowerRate_; }
226            /**
227            @brief Get the boost rate.
228            @return Returns the boost rate in units per second. Is non-negative.
229            */
230            inline float getBoostRate() const
231                { return this->boostRate_; }
232            /**
233            @brief Get the cooldown duration.
234            @return Returns the cooldown duration in seconds. Is non-negative.
235            */
236            inline float getBoostCooldownDuration() const
237                { return this->boostCooldownDuration_; }
238            /**
239            @brief Get the shake frequency.
240            @return Returns the shake frequency in times per seconds. Is non-negative.
241            */
242            inline float getShakeFrequency() const
243                { return this->shakeFrequency_; }
244            /**
245            @brief Get the shake amplitude.
246            @return Returns the shake amplitude. Is non-negative.
247            */
248            inline float getShakeAmplitude() const
249                { return this->shakeAmplitude_; }
250
251        protected:
252            bool bInvertYAxis_;
253
254            Vector3 steering_; //!< The direction and magnitude of the steering action given through user input.
255
256            float rotationThrust_;               //!< Force with which the SpaceShip rotates.
257            btVector3 localAngularAcceleration_; //!< The acceleration that accounts for angular movement and is used internally.
258
259            bool bBoost_;                 //!< Whether the SpaceShip is currently boosting.
260            bool bBoostCooldown_;         //!< Whether the SpaceShip is currently in boost cooldown, during which boosting is impossible.
261            float initialBoostPower_;     //!< The initial (and maximal) boost power.
262            float boostPower_;            //!< The current boost power.
263            float boostPowerRate_;        //!< The rate at which the boost power is recharged.
264            float boostRate_;             //!< The rate at which boost power is used up.
265            float boostCooldownDuration_; //!< The duration for which boost cooldown is in effect.
266            float shakeFrequency_;        //!< The frequency of the shaking of the camera due to boosting.
267            float shakeAmplitude_;        //!< The amplitude of the shaking of the camera due to boosting.
268
269            float lift_;       //!< The amount of lift that is added.
270            float stallSpeed_; //!< The forward speed where no more lift is added.
271
272        private:
273            void registerVariables();
274            virtual bool isCollisionTypeLegal(WorldEntity::CollisionType type) const;
275
276            void changedEnableMotionBlur(); // Is called when the enableMotionBlur config value has changed.
277            /**
278            @brief Callback function. Is called when the boost has cooled down.
279            */
280            void boostCooledDown(void)
281                { this->bBoostCooldown_ = false; }
282
283            void shakeCamera(float dt); // Shake the camera for a given time interval.
284            void backupCamera(); // Save the original position and orientation of the camera.
285            void resetCamera(); // Reset the camera to its original position.
286
287            std::vector<Engine*> engineList_; //!< The list of all Engines mounted on this SpaceShip.
288
289            Timer timer_;                          //!< Timer for the cooldown duration.
290            float shakeDt_;                        //!< Temporary variable for the shaking of the camera.
291            Vector3 cameraOriginalPosition_;       //!< The original position of the camera before shaking it.
292            Quaternion cameraOriginalOrientation_; //!< The original orientation of the camera before shaking it.
293
294            Shader* boostBlur_;      //!< A radial blur shader, applied when boosting according to the amount of boosting.
295            float blurStrength_;     //!< The strength of the applied blur.
296            bool bEnableMotionBlur_; //!< Whether motion blur is enabled or not.
297       
298    };
299}
300
301#endif /* _SpaceShip_H__ */
Note: See TracBrowser for help on using the repository browser.