Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Несколько систем частиц

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Описание[1]

Кликните мышкой по экрану, чтобы создать в месте клика «фонтан» частиц.

Каждый «фонтан» – это один экземпляр системы частиц, извергающей объекты Particle и CrazyParticle (это подкласс Particle). Обратите внимание на то, что в этом скетче используются полиморфизм и наследование.

Пример

  1. ArrayList<ParticleSystem> systems;
  2.  
  3. void setup() {
  4.   size(640, 360);
  5.   systems = new ArrayList<ParticleSystem>();
  6. }
  7.  
  8. void draw() {
  9.   background(0);
  10.   for (ParticleSystem ps : systems) {
  11.     ps.run();
  12.     ps.addParticle();
  13.   }
  14.   if (systems.isEmpty()) {
  15.     fill(255);
  16.     textAlign(CENTER);
  17.     text("click mouse to add particle systems", width/2, height/2);
  18.      //  "Кликните, чтобы создать систему частиц"
  19.   }
  20. }
  21.  
  22. void mousePressed() {
  23.   systems.add(new ParticleSystem(1, new PVector(mouseX, mouseY)));
  24. }
  25.  
  26.  
  27. // для управления частицами Particle
  28. // будет использован объект ArrayList
  29.  
  30. class ParticleSystem {
  31.  
  32.   ArrayList<Particle> particles;    // объект ArrayList
  33.                                     // для хранения всех частиц
  34.   PVector origin;                   // точка, из которой
  35.                                     // будут извергаться частицы
  36.  
  37.   ParticleSystem(int num, PVector v) {
  38.     particles = new ArrayList<Particle>();  // инициализируем
  39.                                             // список ArrayList
  40.     origin = v.copy();                      // сохраняем точку
  41.                                             // извержения частиц
  42.     for (int i = 0; i < num; i++) {
  43.       particles.add(new Particle(origin));  // добавляем в ArrayList
  44.                                             // количество частиц,
  45.                                             // равное значению в «num»
  46.     }
  47.   }
  48.  
  49.  
  50.   void run() {
  51.     // при помощи цикла for() проходим через ArrayList задом наперед,
  52.     // т.к. во время итерации также происходит удаление элементов:
  53.     for (int i = particles.size()-1; i >= 0; i--) {
  54.       Particle p = particles.get(i);
  55.       p.run();
  56.       if (p.isDead()) {
  57.         particles.remove(i);
  58.       }
  59.     }
  60.   }
  61.  
  62.   void addParticle() {
  63.     Particle p;
  64.     // добавляем в систему либо Particle, либо CrazyParticle:
  65.     if (int(random(0, 2)) == 0) {
  66.       p = new Particle(origin);
  67.     }
  68.     else {
  69.       p = new CrazyParticle(origin);
  70.     }
  71.     particles.add(p);
  72.   }
  73.  
  74.   void addParticle(Particle p) {
  75.     particles.add(p);
  76.   }
  77.  
  78.   // метод для проверки того, есть ли еще частицы в системе частиц:
  79.   boolean dead() {
  80.     return particles.isEmpty();
  81.   }
  82. }
  83.  
  84.  
  85.  
  86. // CrazyParticle – это подкласс класса Particle
  87.  
  88. class CrazyParticle extends Particle {
  89.  
  90.   // просто добавляем в CrazyParticle одну новую переменную;
  91.   // все остальные поля этот подкласс наследует у Particle,
  92.   // поэтому нам не придется их переписывать оттуда!
  93.   float theta;
  94.  
  95.   // конструктор CrazyParticle может вызвать
  96.   // конструктор родительского класса (суперкласса):
  97.   CrazyParticle(PVector l) {
  98.     // метод super() должен быть первым методом,
  99.     // вызываемым внутри конструктора подкласса;
  100.     // он сделает все, что делает конструктор суперкласса Particle:
  101.     super(l);
  102.     // еще одна строчка кода, добавляющая новую переменную «theta»:
  103.     theta = 0.0;
  104.   }
  105.  
  106.   // обратите внимание, что у нас здесь нет метода run(),
  107.   // т.к. он наследуется от суперкласса Particle
  108.  
  109.   // этот метод update() заменяет собой
  110.   // метод update() родительского класса:
  111.   void update() {
  112.     super.update();
  113.     // увеличиваем значение вращения,
  114.     // используя значение горизонтальной скорости:
  115.     float theta_vel = (velocity.x * velocity.mag()) / 10.0f;
  116.     theta += theta_vel;
  117.   }
  118.  
  119.   // этот метод display() заменяет собой
  120.   // метод display() родительского класса:
  121.   void display() {
  122.     // рендерим эллипс как обычную частицу:
  123.     super.display();
  124.     // добавляем вращающуюся линию:
  125.     pushMatrix();
  126.     translate(position.x, position.y);
  127.     rotate(theta);
  128.     stroke(255, lifespan);
  129.     line(0, 0, 25, 0);
  130.     popMatrix();
  131.   }
  132. }
  133.  
  134.  
  135. // простой класс Particle
  136.  
  137. class Particle {
  138.   PVector position;
  139.   PVector velocity;
  140.   PVector acceleration;
  141.   float lifespan;
  142.  
  143.   Particle(PVector l) {
  144.     acceleration = new PVector(0, 0.05);
  145.     velocity = new PVector(random(-1, 1), random(-2, 0));
  146.     position = l.copy();
  147.     lifespan = 255.0;
  148.   }
  149.  
  150.   void run() {
  151.     update();
  152.     display();
  153.   }
  154.  
  155.   // метод для обновления позиции:
  156.   void update() {
  157.     velocity.add(acceleration);
  158.     position.add(velocity);
  159.     lifespan -= 2.0;
  160.   }
  161.  
  162.   // метод для отрисовки:
  163.   void display() {
  164.     stroke(255, lifespan);
  165.     fill(255, lifespan);
  166.     ellipse(position.x, position.y, 8, 8);
  167.   }
  168.  
  169.   // частица еще видна?
  170.   boolean isDead() {
  171.     return (lifespan < 0.0);
  172.   }
  173. }

См.также

Внешние ссылки

  1. processing.org - Multiple Particle Systems by Daniel Shiffman