163 lines
3.4 KiB
C++
163 lines
3.4 KiB
C++
/*
|
|
** Haaf's Game Engine 1.7
|
|
** 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"
|
|
|
|
class JQuad;
|
|
|
|
#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
|
|
{
|
|
JQuad* sprite; // texture + blend mode
|
|
int nEmission; // particles per sec
|
|
float fLifetime;
|
|
|
|
float fParticleLifeMin;
|
|
float fParticleLifeMax;
|
|
|
|
float fDirection;
|
|
float fSpread;
|
|
bool bRelative;
|
|
|
|
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, JQuad *sprite);
|
|
hgeParticleSystem(hgeParticleSystemInfo *psi);
|
|
hgeParticleSystem(const hgeParticleSystem &ps);
|
|
~hgeParticleSystem() { }
|
|
|
|
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();
|
|
|
|
//static HGE *hge;
|
|
|
|
float fAge;
|
|
float fEmissionResidue;
|
|
|
|
hgeVector vecPrevLocation;
|
|
hgeVector vecLocation;
|
|
float fTx, fTy;
|
|
|
|
int nParticlesAlive;
|
|
hgeRect rectBoundingBox;
|
|
bool bUpdateBoundingBox;
|
|
|
|
hgeParticle particles[MAX_PARTICLES];
|
|
|
|
float mTimer;
|
|
};
|
|
|
|
class hgeParticleManager
|
|
{
|
|
public:
|
|
hgeParticleManager();
|
|
~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 &);
|
|
|
|
int nPS;
|
|
float tX;
|
|
float tY;
|
|
hgeParticleSystem* psList[MAX_PSYSTEMS];
|
|
};
|
|
|
|
|
|
#endif
|