Silverback9

#야생으로

Creative Coding 독학 제106일 2024년07월11일(목)

아~~^^* 햇살이 바삭한 아침이예요~~~^^*

저는 지금 햇살 좋은 하늘을 올려다 볼 수 있는, 그런데~~^^* 에어컨 바람이 감돌아 시원한 곳에 와 있어요~~^^*

제가 곧 볼 일이 있어서요~~~^^* 오후에 공부하고 다시 돌아올게요~~^^*

목요일은 일정이 그렇게 되어 가네요~~~^^*

장마 중 햇살일지 장마 끝 햇살일지는 아직 모르겠지만,

이 햇살이 너무 반갑고 감사해요~~^^*

그래서, 이 햇살처럼 상큼하고 고소하고 새콤할 것 같은, 시원한 아이스 아메리카노 선물드려요~~^^* 눈으로 시원하게 마셔요~~~^^* 곁들여 드리는 것은요~~^^* 아주 맛있어 보이는 크라상이예요~~~^^* 눈으로 맛있게 드셔요~~~^^*

크라상이 사진으로는 좀 작아 보이는데요. 실물로 보시면 엄청 큰 크라상이예요~^^*

눈 부르게 많이 드셔요~~^^*

신선한 커피의 좋은 카페인과 오늘 구운 크라상의 에너지로 즐거운 오전 오후 보내시고요~~

우리 저녁에 다시 여기서 만나요~~~^^*

네~~ 오전 오후 즐겁게 보내셨나요~~^^*

아이스 아메리카노도 마시고 크라상도 먹었으니, 우리 힘을 좀 방출해 볼까요~^^*

셀프세차장 고고~~^^*

네^^* 오늘은 달밤의 셀프세차장을 프로그램으로 표현해 보겠습니다~~^^*

아래 동영상 강의를 클릭하셔서 5:10까지 보시면 오늘 공부 끝~~^^*

두둥실 보름달은 떴구요~~~

폼건에서 거품은 포실포실 쏴쏴 몽글몽글 하늘로 날아 오르구요~~^^*

두둥실 보름달은~~~~?

그렇죠~~^^* 어제 선물드린 동그라미를

화면 왼쪽 상단에 크게 한 번 띄워보겠습니다~~^^*

어머 그럼 자동차는요~~~?

네^^* 아주 귀여운 자동차를 그려서 화면 중앙 하단에 주차시켜 놓겠습니다~^^*

포슬포슬 쏴쏴 몽글몽글 폼건은~~~?

그렇죠~~^^* 지난 번 만들어 놓은 동그라미 입자를

(1) 입자 배열에 담고

(2) 마우스/손가락 움직임으로

(3) 폼건 노즐의 방향을 조정하겠습니다~^^*

그럼 이제 코드를 저와 함께 살펴 보시죠~~^^*

<!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 = 16;
    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);
  }
}
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.1);
      particle.applyForce(gravity);
      //중력의 작용을 받도록 하겠습니다~^^*
      
      let dirX = map(mouseX, 0, width, -0.3, 0.3);
      let dirY = map(mouseY, 0, height, -0.3, 0.3);
      let yourControl = createVector(dirX, dirY);
      particle.applyForce(yourControl);
      //마우스 움직임에 따라 폼건 노즐의 방향이 변환합니다~^^*
      
      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 = [];
//폼건 거품 입자들을 담을 배열입니다~^^*

let imgMoon;
let imgCar;
//보름달과 자동차 이미지 파일을 저장할 변수입니다~^^*

function preload(){
  imgMoon = loadImage('texture.png');
  imgCar = loadImage('car.png');
  //보름달과 자동차 그림 파일을 로드하여 보름달 및 자동차 이미지 변수에 저장합니다~^^*
}

function setup() {
  createCanvas(400, 400);
  emitters.push(new Emitter(300, 200));
}

function draw() {
  background(100);
  //달밤이라 좀 어두운 듯 밝은 듯한 밤공기예요~^^*
  image(imgMoon, 0, 0, 100, 100);
  image(imgCar, 50, 200, 300, 300);
  //보름달 이미지를 왼쪽 상단에 크기 100*100으로 배치해요~^^*
  //자동차 이미지를 하단 중앙에 크기 300*300으로 배치해요~^^*
  
  for (let emitter of emitters) {
    emitter.emit(2);
    //한 번에 비누거품 2 두개씩 만들어 뿜어내는 폼건입니다~^^*
    emitter.show();
    emitter.update();
  }
}

마우스/손가락을 화면 위에서 움직이며 우리의 귀여운 자동차를 정성스럽게 세차해 주셔요~~^^* 달밤의 낭만을 만끽하시기 바래요~~^^*

단 1회 폼건 사용으로 자동차를 비누거품으로 잘 덮으려면~~~~^^*

세차를 하니 차도 깔끔하고 기분도 개운하고~~^^*

수고 많으셨어요~~~^^*

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

우리 내일 또 만나서 함께 코딩 공부해요~~~ 화염을 만들어서 이열치열~~^^*

편안한 저녁 보내시구요~~~^^*

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

댓글 남기기