Silverback9

#야생으로

Creative Coding 독학 제099일 2024년07월04일(목)

오늘은 국지성 호우를 이곳 저곳 마음대로 생성하는 프로그램을 만들어 보겠습니다~^^*

어제 만든 샤워 프로그램을 살짝 디벨롭하여~^^*

마우스/손가락으로 클릭/누르는 곳마다 소나기가 내리도록 해 볼게요~^^*

근데요~~~ 제가 오전에 볼 일이 좀 있어서요~~^^*

우리 오후에 다시 만나서 코딩 공부 할까요~~^^*

모닝 샤워 시원하게 하신 후~

시원한 소나기가 내리는 순간을 상상을 하시며~

시원한 아이스 아메리카노 한 잔 여유롭게 드시며 오전 보내시고~

우리 오후에 다시 만나요~~^^*

넵, 종종 걸음으로 다시 이 페이지로 돌아올게요~^^*

네~^^* 오늘 낮시간 즐겁게 보내셨나요~^^*

이제 코딩 공부할 시간~~~^^*이 다시 또 돌아왔습니다~~^^*

네!!! 오늘의 미션은 여러 곳에 소나기 만들어 뿌리기예요!

소나기 하나는 우리가 어제 만든 샤워를 그대로 써도 될 것 같은데…요…

소나기 여러 개는…..음….

네~~ㅡ 소나기를 만들어 뿌리는 새로운 클래스를 만들어 보면 어떨까요?

이름하여~~~~ Emitter~~~^^*

소나기를 뿌리는 Emitter가 여러 개 필요하니까, 배열 emitters[]를 만들어 볼게요~^^*

그럼 우리 이제, 클래스 두 개(Particle, Emitter), 배열 두 개(particles[], emitters[])를 가지게 되었네요~

하나. Class Particle은 물방울의 모양과 행동양식을 담고 있습니다~

둘. Class Emitter는 소나기를 만드는 위치와 Class Particle의 행동지시 방법을 담고 있습니다~

셋. 배열 particles[]는 하나의 소나기가 생성해 내는 물방울들을 담습니다.

넷 배열 emitters[]는 우리가 마우스/손가락을 클릭하기/누르기를 통해 생성한 소나기 스팟을 담고 있습니다.

어제 프로그램에서는 메인 프로그램이 클래스 Particle를 다루었는데요.

오늘 프로그램에서는 메인 프로그램은 클래스 Emitter를 다루고, 클래스 Emitter는 클래스 Particle을 다루게 되어요.

그래서, 배열 emitters[]는 메인 프로그램에서 정의되고, 배열 particles[]는 클래스 Emitter에서 정의되어요~

자~ 이제 큰 그림은 완성된 것 같은데요!!!

자세한 내용은 코드를 함께 살펴 볼까요~~~^^*

<!DOCTYPE html>
<html lang="en">
  <head>
    https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.4/p5.js
    https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.4/addons/p5.sound.min.js
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />

  </head>
  <body>
    <main>
    </main>
    http://emitter.js
    http://particle.js
    http://sketch.js
  </body>
</html>

class Particle {
  constructor(x, y) {
    this.pos = createVector(x, y);
    this.vel = p5.Vector.random2D();
    this.vel.mult(random(0.5, 2));
    this.acc = createVector(0, 0);
    this.r = 4;
    this.lifetime = 255;
  }

  finished() {
    return this.lifetime < 0;
  }
  //물방울이 완전히 투명하다면 True 값을 반환합니다.

  applyForce(force) {
    this.acc.add(force);
  }

  edges() {
    if (this.pos.y >= height - this.r) {
      this.pos.y = height - this.r;
      this.vel.y *= -1;
    }

    if (this.pos.x >= width - this.r) {
      this.pos.x = width - this.r;
      this.vel.x *= -1;
    } else if (this.pos.x <= this.r) {
      this.pos.x = this.r;
      this.vel.x *= -1;
    }
  }

  update() {
    this.vel.add(this.acc);
    this.pos.add(this.vel);
    this.acc.set(0, 0);

    this.lifetime -= 5;
  }

  show() {
    stroke(255, this.lifetime);
    strokeWeight(2);
    fill(255, this.lifetime);
    //소낙비는 한꺼번에 쏟아져서 마치 우유가 쏟아지는 듯 하지요~^^*
    //바닥에 닿으면, 맑은 물방울로 보이구요~^^*
    //그래서~ 물방울을 처음엔 하얗고, 시간이 지나면 점점 투명해 지도록 만들어 볼게요~~^^*

    ellipse(this.pos.x, this.pos.y, this.r * 2);
  }
}
class Emitter {
  constructor(x, y) {
    this.position = createVector(x, y);
    this.particles = [];
  }
  //국지성 호우 스팟은 각각 지정된 좌표에, 물방물 배열을 생성하여 소나기를 내립니다~

  emit(num) {
    for (let i = 0; i < num; i++) {
      this.particles.push(new Particle(this.position.x, this.position.y));
    }
  }
  //지정된 갯수의 물방울을 한 번에 만들어 물방울 배열에 담습니다~. 

  update() {
    for (let particle of this.particles) {
      let gravity = createVector(0, 0.2);
      particle.applyForce(gravity);
      particle.update();
      particle.edges();
    }
    //물방울들은 중력의 작용을 받고, 벽이나 바닥에 부딪히면 튑니다~

    for (let i = this.particles.length - 1; i >= 0; i--) {
      if (this.particles[i].finished()) {
        this.particles.splice(i, 1);
      }
    }
    //물방울 배열의 맨뒤에서 앞으로 나아가며, 물방울 투명도를 점검하여, 완전히 투명하다면, 물방울 배열에서 삭제합니다. 컴퓨터 복지 향상을 위하여~~~^^*
  }

  show() {
    for (let particle of this.particles) {
      particle.show();
    }
  }
  //물방울을 보여 줍니다~^^*
}
let emitters = [];
//국지성 호우가 내릴 곳들이 배열입니다~^^*

function mousePressed() {
  emitters.push(new Emitter(mouseX, mouseY));
  //마우스/손가락 클릭하는/누르는 곳이 바로 국지성 호우 스팟입니다~
  //마우스/손가락 클릭하여/눌러 생성된 Emitter는 배열 emitters[]의 요소로 저장됩니다. 
}

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(100, 200, 255);
  //맑은 하늘에 갑자기 소나기가 우유빛으로 엄청 내려요~^^*
  for (let emitter of emitters) {
    emitter.emit(2);
    //한 번에 물방울 2 두개씩 만들어 내리는 소나기입니다~^^*
    emitter.show();
    emitter.update();
  }
}

맑은 하늘에 소낙비를 여기 저기 만들어 뿌려 볼까요~~^^* 캔버스 곳곳을 마우스/손가락으로 클릭해/눌러 보셔요~~~^^*

눈이 함박 내리거나 비가 담뿍 내리면 마음이 왠지 순수해 지는 것 같아요~^^* 서로의 행복과 성장을 바라고 지켜주기를 원하는 순수한 사랑의 마음이 세상 모든 존재들에게 천천히 오래오래 스며드는 것 같아요~^^*

오늘도 저와 함께 코딩 공부해 주셔서 감사합니다~^^*

우리 내일도 만나서 함께 코딩 공부 해요~~^^*

이 소나기를 맞고, 우리의 코딩 실력도 한 뼘 자라있을 거예요~~^^*

네!!! 꿈은 이루어 집니다~~!!!

댓글 남기기