Skip to content

AlexPrime2023/2D-Particle-System

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 

Repository files navigation

2D Particle System

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;
    }
};

Недоработки (TODO)

  • Разнести все по пространствам имен (namespace);
  • Немного не доработаны кривые/формы эмиттеров в 2D системе партиклов (они работают и все с ними прекрасно, но хотелось бы большей гибкости. Аналогично с формой эмиттеров);
  • Возможна оптимизация по ресурсам.

About

Небольшой движок 2D частиц, написанный при помощи SFML.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages