00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef PARTICLE_H
00023 #define PARTICLE_H
00024
00025 #include <list>
00026 #include <string>
00027
00028 #include "guichanfwd.h"
00029 #include "sprite.h"
00030 #include "vector.h"
00031
00032 class Map;
00033 class Particle;
00034 class ParticleEmitter;
00035
00036 typedef std::list<Particle *> Particles;
00037 typedef Particles::iterator ParticleIterator;
00038 typedef std::list<ParticleEmitter *> Emitters;
00039 typedef Emitters::iterator EmitterIterator;
00040
00044 class Particle : public Sprite
00045 {
00046 public:
00047 static const float PARTICLE_SKY;
00048 static int fastPhysics;
00049 static int particleCount;
00050 static int maxCount;
00051 static int emitterSkip;
00058 Particle(Map *map);
00059
00063 ~Particle();
00064
00068 void clear();
00069
00074 void setupEngine();
00075
00080 virtual bool update();
00081
00085 virtual void draw(Graphics *graphics, int offsetX, int offsetY) const;
00086
00090 virtual int getPixelY() const
00091 { return (int) (mPos.y + mPos.z) - 64; }
00092
00096 void setMap(Map *map);
00097
00102 Particle *addEffect(const std::string &particleEffectFile,
00103 int pixelX, int pixelY, int rotation = 0);
00104
00108 Particle *addTextSplashEffect(const std::string &text, int x, int y,
00109 const gcn::Color *color, gcn::Font *font,
00110 bool outline = false);
00111
00115 Particle *addTextRiseFadeOutEffect(const std::string &text,
00116 int x, int y, const gcn::Color *color, gcn::Font *font,
00117 bool outline = false);
00118
00122 void addEmitter (ParticleEmitter* emitter)
00123 { mChildEmitters.push_back(emitter); }
00124
00128 void moveTo(const Vector &pos)
00129 { moveBy (pos - mPos);}
00130
00134 void moveTo(float x, float y);
00135
00139 const Vector& getPosition() const
00140 { return mPos; }
00141
00145 void moveBy (const Vector &change);
00146
00150 void setLifetime(int lifetime)
00151 { mLifetimeLeft = lifetime; mLifetimePast = 0; }
00152
00157 void setFadeOut(int fadeOut)
00158 { mFadeOut = fadeOut; }
00159
00164 void setFadeIn(int fadeIn)
00165 { mFadeIn = fadeIn; }
00166
00170 void setAlpha(float alpha)
00171 { mAlpha = alpha; }
00172
00177 void setSpriteIterator(std::list<Sprite*>::iterator spriteIterator)
00178 { mSpriteIterator = spriteIterator; }
00179
00183 std::list<Sprite*>::iterator
00184 getSpriteIterator() const
00185 { return mSpriteIterator; }
00186
00190 void setVelocity(float x, float y, float z)
00191 { mVelocity.x = x; mVelocity.y = y; mVelocity.z = z; }
00192
00196 void setGravity(float gravity)
00197 { mGravity = gravity; }
00198
00202 void setRandomness(int r)
00203 { mRandomness = r; }
00204
00209 void setBounce(float bouncieness)
00210 { mBounce = bouncieness; }
00211
00215 void setFollow(bool follow)
00216 { mFollow = follow; }
00217
00221 bool doesFollow()
00222 { return mFollow; }
00223
00228 void setDestination(Particle *target, float accel, float moment)
00229 { mTarget = target; mAcceleration = accel; mMomentum = moment; }
00230
00236 void setDieDistance(float dist)
00237 { mInvDieDistance = 1.0f / dist; }
00238
00239 bool isAlive()
00240 { return mAlive; }
00241
00245 bool isExtinct()
00246 { return !isAlive() && mChildParticles.empty(); }
00247
00251 void kill()
00252 { mAlive = false; mAutoDelete = true; }
00253
00258 void disableAutoDelete()
00259 { mAutoDelete = false; }
00260
00261 protected:
00262 bool mAlive;
00263 Vector mPos;
00264 int mLifetimeLeft;
00265 int mLifetimePast;
00266 int mFadeOut;
00267 int mFadeIn;
00268 float mAlpha;
00270 private:
00271
00272 bool mAutoDelete;
00273 Map *mMap;
00274 std::list<Sprite*>::iterator mSpriteIterator;
00275 Emitters mChildEmitters;
00276 Particles mChildParticles;
00278
00279 Vector mVelocity;
00280 float mGravity;
00281 int mRandomness;
00282 float mBounce;
00283 bool mFollow;
00285
00286 Particle *mTarget;
00287 float mAcceleration;
00288 float mInvDieDistance;
00289 float mMomentum;
00290 };
00291
00292 extern Particle *particleEngine;
00293
00294 #endif