Создание эффекта дождя из частиц

Если вы новичок в сериале, начните здесь: Часть 1, Часть 2 и Часть 3.

Весь код и библиотеки можно найти здесь: https://github.com/GeorgeGally/creative_coding

Итак, теперь, когда у нас есть частицы… давайте повеселимся и создадим несколько эффектов частиц. Это также, надеюсь, даст вам представление о том, как один и тот же фрагмент кода может создавать совершенно разные эффекты, и заставит вас больше экспериментировать, и именно здесь происходит волшебство и веселье.

Итак, давайте создадим простой, но визуально приятный эффект дождя из частиц, как на картинке выше…

У нас уже есть весь код, который нам нужен… нам просто нужно сделать так, чтобы следы частиц падали сверху, а не отскакивали, а затем просто снова появлялись наверху, когда они добирались до дна…

Итак, во-первых, давайте добавим немного частиц... мы установим speed_x нашего мяча на 0, так как частицы просто падают вниз. И мы задаем ему случайную начальную позицию от 0 до ширины экрана, т.е. random(w); то же самое, что сказать random(0, w); И мы даем нашим шарам вертикальную начальную точку где-то над экраном, чтобы они не начинались с одного и того же места. И случайный серый цвет с помощью rgb(random(255));

Таким образом, наш код установки будет выглядеть так:

var ctx = createCanvas("canvas1");
var max_balls = 2000;
var balls = [];
for (var i = 0; i < max_balls; i++) {
  addBall();
}
// push a ball and it's values into the array
function addBall(){
  var ball = {
    x: random(w),
    y: random(-200,0),
    speed_x: 0,
    speed_y: random(0.5, 3),
    size: 8,
    colour: rgb(random(255))
  }
  balls.push(ball);
  if (balls.length > max_balls) balls.splice(0,1);
}

Для нашей функции moveBall() она выглядит почти так же, как и раньше, за исключением того, что нам нужно сбросить частицу наверх, как только она перейдет границу:

function moveBall(){
  for (var i = 0; i < balls.length; i++) {
    
   var b = balls[i];
    b.x = b.x + b.speed_x;
    b.y = b.y + b.speed_y;

   // if ball goes over bottom reset it
   if (b.y > h) {
      b.y = random(-100,0);
      b.colour = rgb(randomInt(255));
   }
  }
}

Для аккуратности поместим все остальное в функцию resetBall(). Нам нужно будет передать ссылку на наш мяч в функцию, иначе функция не будет знать, о каком мяче мы говорим. Мы делаем это, просто передавая объект/переменную функции в квадратных скобках, например:

// syntax: functionName(variable)
resetBall(b)

И получая переменную в функции так:

function resetBall(_b) {
  // do some stuff with _b
}

В программировании мы часто используем символ подчеркивания (например, _b в данном случае), потому что он просто позволяет легко увидеть, что мы имеем в виду ссылку на локальную переменную (любая переменная, объявленная внутри функции, не может быть видна за ее пределами — что хорошая вещь Вы всегда должны стараться держаться подальше от глобальных переменных).

Итак, теперь наш завершенный код должен выглядеть так:

var ctx = createCanvas("canvas1");
var max_balls = 2000;
var balls = [];
for (var i = 0; i < max_balls; i++) {
  addBall();
}
function addBall(){
  var ball = {
    x: random(w),
    y: random(-200,0),
    speed_x: 0,
    speed_y: random(0.5, 3),
    size: 8,
    colour: rgb(random(255))
  }
  balls.push(ball);
  if (balls.length > max_balls) balls.splice(0,1);
}
function draw(){
 ctx.background(0, 0.06);
 moveBall();
 drawBall();
}
function moveBall(){
  for (var i = 0; i < balls.length; i++) {
    var b = balls[i];
    b.x = b.x + b.speed_x;
    b.y = b.y + b.speed_y;
    if (b.y > h) {
      resetBall(b);
    }
  }
}
function resetBall(_b){
  _b.y = random(-100,0);
  _b.colour = rgb(randomInt(255));
}
function drawBall(){
  for (var i = 0; i < balls.length; i++) {
    var b = balls[i];
    ctx.fillStyle = b.colour;
    ctx.fillEllipse(b.x, b.y, b.size, b.size);
  }
}

Вот и все... Частичный дождь. Большая часть кода, который вы будете использовать, на самом деле является просто вариацией этого. Так что поиграйтесь и посмотрите, какие еще эффекты вы можете придумать… Увидимся в следующий раз.

Подпишитесь на меня в Instagram: https://www.instagram.com/radarboy3000/

Подпишитесь на меня в Твиттере здесь: https://twitter.com/radarboy_japan

И лайкните мою страницу в Facebook здесь: https://www.facebook.com/radarboy3000

Введение в творческое кодирование, часть 1: https://medium.com/@radarboy3000/creative-coding-basics-4d623af1c647#.hn9zzliob

Введение в творческое кодирование, часть 2: https://medium.com/@radarboy3000/introduction-to-creative-coding-part-2-d869832d9ffb#.fzxcom541

Введение в творческое кодирование, часть 3: https://medium.com/@radarboy3000/how-to-make-particles-1cbeee937593#.wwjhkv7u2

Github-репозиторий всего кода: https://github.com/GeorgeGally/creative_coding

Hacker Noon — это то, как хакеры начинают свой день. Мы являемся частью семьи @AMI. Сейчас мы принимаем заявки и рады обсудить возможности рекламы и спонсорства.

Если вам понравилась эта история, мы рекомендуем прочитать наши последние технические истории и актуальные технические истории. До следующего раза, не принимайте реалии мира как должное!