/**
* Triangles
* Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/**
* This is based on a wiki entry
* https://github.com/SFML/SFML/wiki/Source:-Particle-System
*/
#pragma once
#include
#include
#include
class ParticleSystem: public sf::Drawable
{
public:
ParticleSystem(int width, int height);
~ParticleSystem();
void fuel(int particles, float angle);
void update(sf::Time delta);
void render();
void clear();
void enable(bool enabled)
{
_enabled = enabled;
}
const bool isEnabled() const
{
return _enabled;
}
void loadColors(const sf::Image& image)
{
_colors.clear();
for(unsigned i = 0; i < image.getSize().x; ++i)
for(unsigned j = 0; j < image.getSize().y; ++j)
{
sf::Color color = image.getPixel(i, j);
if(color.r > 0 || color.g > 0 || color.b > 0)
_colors.emplace_back(color.r, color.g, color.b, 255);
}
}
void setPosition(const sf::Vector2f position)
{
_sprite.setPosition(position - _origin);
}
void setPosition(float x, float y)
{
setPosition(sf::Vector2f(x, y));
}
void setOrigin(const sf::Vector2f origin)
{
_origin = origin;
}
void setOrigin(float x, float y)
{
setOrigin(sf::Vector2f(x, y));
}
void setParticleSpeed(float particleSpeed)
{
_particleSpeed = particleSpeed;
}
void setDissolutionRate(float dissolutionRate)
{
_dissolutionRate = dissolutionRate;
}
const sf::Sprite& getSprite() const
{
return _sprite;
}
private:
struct Particle
{
sf::Vector2f pos;
sf::Vector2f vel;
sf::Color color;
float transparency;
};
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
sf::Vector2f _origin;
sf::Clock _clock;
sf::Image _image;
sf::Texture _texture;
sf::Sprite _sprite;
float _particleSpeed;
float _dissolutionRate;
std::vector _particles;
std::vector _colors;
bool _enabled;
};