// PLEASE NOTE that this is not the 1.81 version of hgeparticle.h ... // the game I'm working on used an older HGE that breaks with the 1.81 // particle system. If you want 1.81, add the "bRelative" stuff to it. --ryan. /* ** Haaf's Game Engine 1.61 ** Copyright (C) 2003-2007, Relish Games ** hge.relishgames.com ** ** hgeParticleSystem helper class header */ #ifndef HGEPARTICLE_H #define HGEPARTICLE_H #include "hge.h" #include "hgesprite.h" #include "hgevector.h" #include "hgecolor.h" #include "hgerect.h" #define MAX_PARTICLES 500 #define MAX_PSYSTEMS 100 struct hgeParticle { hgeVector vecLocation; hgeVector vecVelocity; float fGravity; float fRadialAccel; float fTangentialAccel; float fSpin; float fSpinDelta; float fSize; float fSizeDelta; hgeColor colColor; // + alpha hgeColor colColorDelta; float fAge; float fTerminalAge; }; struct hgeParticleSystemInfo { hgeSprite* sprite; // texture + blend mode int nEmission; // particles per sec float fLifetime; float fParticleLifeMin; float fParticleLifeMax; float fDirection; float fSpread; BYTE bRelative; // was "bool", but that's 4 bytes on PowerPC instead of 1, and it broke loading from disk... float fSpeedMin; float fSpeedMax; float fGravityMin; float fGravityMax; float fRadialAccelMin; float fRadialAccelMax; float fTangentialAccelMin; float fTangentialAccelMax; float fSizeStart; float fSizeEnd; float fSizeVar; float fSpinStart; float fSpinEnd; float fSpinVar; hgeColor colColorStart; // + alpha hgeColor colColorEnd; float fColorVar; float fAlphaVar; }; class hgeParticleSystem { public: hgeParticleSystemInfo info; hgeParticleSystem(const char *filename, hgeSprite *sprite, float fps=0.0f); hgeParticleSystem(hgeParticleSystemInfo *psi, float fps=0.0f); hgeParticleSystem(const hgeParticleSystem &ps); ~hgeParticleSystem() { hge->Release(); } hgeParticleSystem& operator= (const hgeParticleSystem &ps); void Render(); void FireAt(float x, float y); void Fire(); void Stop(bool bKillParticles=false); void Update(float fDeltaTime); void MoveTo(float x, float y, bool bMoveParticles=false); void Transpose(float x, float y) { fTx=x; fTy=y; } void TrackBoundingBox(bool bTrack) { bUpdateBoundingBox=bTrack; } int GetParticlesAlive() const { return nParticlesAlive; } float GetAge() const { return fAge; } void GetPosition(float *x, float *y) const { *x=vecLocation.x; *y=vecLocation.y; } void GetTransposition(float *x, float *y) const { *x=fTx; *y=fTy; } hgeRect* GetBoundingBox(hgeRect *rect) const { memcpy(rect, &rectBoundingBox, sizeof(hgeRect)); return rect; } private: hgeParticleSystem(); void _update(float fDeltaTime); static HGE *hge; float fUpdSpeed; float fResidue; float fAge; float fEmissionResidue; hgeVector vecPrevLocation; hgeVector vecLocation; float fTx, fTy; int nParticlesAlive; hgeRect rectBoundingBox; bool bUpdateBoundingBox; hgeParticle particles[MAX_PARTICLES]; }; class hgeParticleManager { public: hgeParticleManager(float fps=0.0f); ~hgeParticleManager(); void Update(float dt); void Render(); hgeParticleSystem* SpawnPS(hgeParticleSystemInfo *psi, float x, float y); bool IsPSAlive(hgeParticleSystem *ps) const; void Transpose(float x, float y); void GetTransposition(float *dx, float *dy) const {*dx=tX; *dy=tY;} void KillPS(hgeParticleSystem *ps); void KillAll(); private: hgeParticleManager(const hgeParticleManager &); hgeParticleManager& operator= (const hgeParticleManager &); float fFPS; int nPS; float tX; float tY; hgeParticleSystem* psList[MAX_PSYSTEMS]; }; #endif