2D Particle System - небольшой движок 2D частиц, написанный при помощи SFML.
Тайм-коды по всей функциональности в описании
- Задание максимального числа партиклов;
- Задание позиции эмиттера;
- Задание радиуса эмиттера;
- Задание время жизни партикла;
- Задание скорости партикла;
- Задание размера партикла;
- Задание угловой скорости партикла;
- Задание разной формы эмиттера (Sphere, Cone, Plane);
- Рисование хвостов партиклов;
- Задание длины следа хвоста;
- Задание постоянного цвета партикла;
- Задание начального цвета партикла;
- Задание конечного цвета партикла;
- Задание Easing кривой для изменения цвета партикла во времени;
- Задание Easing кривой для изменения прозрачности партикла во времени;
- Задание Easing кривой для изменения размера партикла во времени;
- Задание вектора силы на партикл;
- Задание массы партикла;
- Задание Easing кривой для изменения силы воздействия на партикл во времени.
- Добавлять свой эмиттер (менять форму);
- Добавлять свои Easing кривые.
Для добавления своего эмиттера (изменение формы) необходимо поместить *.h и *.cpp файл в папку Emitters.
В этих файлах унаследоваться от Emitters и переопределить 3 метода:
- calculatePosition (вычисление позиции новых партиклов при их создании);
- calculateVelocity (вычисление вектора скорости "выталкивания" партиклов);
- calculateAngle (вычисление "вращения" партиклов).
class SphereEmitter : public Emitter
{
public:
sf::Vector2f calculatePosition() override;
sf::Vector2f calculateVelocity() override;
float calculateAngle() override;
};sf::Vector2f SphereEmitter::calculatePosition()
{
return m_emitterPosition;
}
sf::Vector2f SphereEmitter::calculateVelocity()
{
float theta = MathUtils::degToRad(std::rand() % 360);
float phi = MathUtils::degToRad(std::rand() % 180);
float x = m_emitterRadius * std::sin(phi) * std::cos(theta);
float y = m_emitterRadius * std::sin(phi) * std::sin(theta);
sf::Vector2f direction = sf::Vector2f(x, y);
sf::Vector2f normalizedDirection = direction / std::sqrt(direction.x * direction.x + direction.y * direction.y);
return normalizedDirection;
}
float SphereEmitter::calculateAngle()
{
return 0.0f;
}Для добавления своей easing кривой эмиттера (изменение формы) необходимо в файле EasingCurves.h создать свой класс кривой и переопределить метод interpolate.
class LinearEasing : public EasingCurve {
public:
float interpolate(float t) const override {
return t;
}
};- Разнести все по пространствам имен (namespace);
- Немного не доработаны кривые/формы эмиттеров в 2D системе партиклов (они работают и все с ними прекрасно, но хотелось бы большей гибкости. Аналогично с формой эмиттеров);
- Возможна оптимизация по ресурсам.
