You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SeasonI/particle.h

89 lines
2.5 KiB

class Particle{
public:
vd2d pos;
vd2d spd;
vd2d acc;
int lifetime; //In frames.
bool wrap;
Particle(vd2d pos,vd2d spd,vd2d acc,int lifetime,bool wrap=false)
:pos(pos),spd(spd),acc(acc),lifetime(lifetime){};
virtual void render(PixelGameEngine*game)=0;
virtual void particleUpdate()=0;
bool update() {
spd+=acc;
pos+=spd;
if (wrap) {
if (pos.x<0) {
pos.x+=WIDTH;
} else
if (pos.y<0) {
pos.y+=HEIGHT;
}
if (pos.x>WIDTH) {
pos.x-=WIDTH;
} else
if (pos.y>HEIGHT) {
pos.y-=HEIGHT;
}
}
lifetime--;
return lifetime>0;
}
vd2d GetPos() {
return pos;
}
vd2d GetSpd() {
return spd;
}
vd2d GetAcc() {
return acc;
}
void SetPos(vd2d pos) {
this->pos=pos;
}
};
class LineParticle:public Particle{
public:
Pixel col;
LineParticle(vd2d pos,vd2d spd,vd2d acc,int lifetime,Pixel col=WHITE,bool wrap=false)
:col(col),Particle(pos,spd,acc,lifetime,wrap){}
void particleUpdate()override{}
void render(PixelGameEngine*game)override{
game->DrawLineDecal(pos,pos+spd,col);
}
};
class SquareParticle:public Particle{
private:
vd2d size;
public:
Pixel col;
SquareParticle(vd2d pos,vd2d size,vd2d spd,vd2d acc,int lifetime,Pixel col=WHITE,bool wrap=false)
:col(col),size(size),Particle(pos,spd,acc,lifetime,wrap){}
void particleUpdate()override{}
void render(PixelGameEngine*game)override{
game->FillRectDecal(pos,size,col);
}
};
class WaterParticle:public Particle{
private:
vd2d size;
vd2d PickRandomSpd() {
return {rand()%60/10.0F-3,-rand()%100/10.0F-2};
}
public:
Pixel col;
WaterParticle(vd2d pos,vd2d size,vd2d acc,int lifetime,Pixel col=WHITE)
:col(col),size(size),Particle(pos,PickRandomSpd(),acc,lifetime){}
void particleUpdate()override{
if (this->pos.y>HEIGHT) {
this->spd=PickRandomSpd();
this->pos={WIDTH/2,HEIGHT};
}
}
void render(PixelGameEngine*game)override{
game->FillRectDecal(pos,size,col);
}
};