비가 와요~~~^^*
가을비가 와요~~^^*
가을비가 내리고 있어서요~~^^*
우리~~^^* 빗방울이 지붕을 타고 흐르듯, 동그라미들이 선반을 타고 흐르도록 해 볼까요~~?^^*
비도 오는데 말이죠~~^^*
네~~^^* 가을비가 내리고 있어서 말이죠~~^^*
제가 동그라미들을 정성껏 만들고~^^* 선반도 벽에 살짝 기울여 두어 개 달고~~^^*
다시 돌아올게요~~^^*
그동안~~^^*
오늘 새벽의 가을의 모습을 선물 드릴테니~~^^* 안구정화하고 계셔요~~^^*
네^^* 좀 선선해 졌을까 싶어서 새벽 산책을 다녀왔거든요~~^^*
좀 많이 걷고 이제 테이블 맡에 앉았어요~~^^*
가을 새벽을 눈으로 산책하고 계셔요~~^^* 예쁜 선반 두 개 들고 곧 돌아올게요~~^^*






네~^^* 오늘 새벽에는 하늘이 참 맑았어요~~^^*
맑은 하늘 보시며 비 오는 가을 아침을 즐기시기 바래요~^^*
점심도 맛있게 드시구요~~^^*
저는 곧 동그라미들 많이 만들어 돌아올게요~~^^*

네~^^* 어릴 떄, 혹시 그런 상상해 보신 적 있으셔요^^*
아침에 눈을 떴는데~~ 창 밖에 억수비가 내리고 있는 거예요~~
머리에 샴푸를, 할머니가 동백기름 바르시 듯, 곱게 바르고 우산을 쓰지 않고 저 억수비 속으로 들어가 볼까?
머리에 샴푸를 발라서 억수비 속을 뛰어다니면 어떻게 될까? 머리에서 비눗방울들이 뽀로록! 뽀로록! 솟아나지 않을까?
그래서! 준비했습니다! 새로운 p5.js 함수! mouseDragged()!
마우스로 한 번만 클릭하는 것이 아니라, 마우스를 클릭한 채로 주욱 움직이면, 머리에서 비눗방울들이 뽀로록! 뽀로록! 솟아나듯 동그라미가 생성되는 거예요~~^^*
우리 동그라미는 앙증맞은 작은 크기로 생성해 보기로 해요~~^^* 비눗방울 느낌으로~~^^*
비눗방울이 미끌미끌 잘 흐르도록 마찰 friction 계수를 0으로 할까요? 그리고 지붕을 따라 잘 흘러 내리도록, 복원 restitution 계수를 0.6으로 작게 잡아 볼게요~~^^*
let circles = [];
function mouseDragged() {
circles.push(new Circle(mouseX, mouseY, random(5, 10)));
}
class Circle{
constructor(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
let options = {
friction: 0,
restitution: 0.6
}
this.body = Bodies.circle(this.x, this.y, this.r, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
strokeWeight(1);
stroke(255)
fill(127);
ellipse(0, 0, this.r*2);
pop();
}
}
자 이제 우리 붙박이 선반을 살짝 기울여진 각도로 벽에 튼튼하게 달아 봅시다~ 뚝딱뚝딱~^^*
선반이 동그라미들을 부드럽게 흘려 보내도록, 선반의 마찰 계수와 복원 계수도 동그라미처럼 0과 0.6으로 잡아보도록 할게요~^^*
그리고, 선반을 살짝 기울여야 하니까, 회전각 계수도 설정해 보도록 할까요? 화면에서 실행해 보고 언제든 회전각 크기를 적절하게 조절할 수 있으면 더욱 좋겠지요~^^*
그래서! 선반을 생성하는 함수를 호출하면서, 회전각 크기도 매개변수 parameter로 넘겨주도록 해 보겠습니다.
let boundaries = [];
boundaries.push(new Boundary(150, 100, width* 0.6, 20, 0.3));
boundaries.push(new Boundary(250, 300, width* 0.6, 20, -0.3));
//선반 길이는 화면 너비의 60%, 높이는 20 pixel로 설정해 볼게요~^^*
class Boundary {
constructor(x, y, w, h, a) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
let options = {
friction: 0,
restitution: 0.6,
angle: a,
isStatic: true
}
this.body = Bodies.rectangle(this.x, this.y, this.w, this.h, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
fill(0);
rect(0, 0, this.w, this.h);
pop();
}
}
네~^^* 주요 함수와 옵션과 매개변수 준비 작업이 다 된 것 같아요!
이제 비눗방울들이 지붕을 따라 부드럽게 흘러 내리듯, 선반 위를 부드럽게 흘러 내리는 동그라미들을 표현하는 프로그램의 전체 코드를 우리 함께 살펴 볼까요~~^^*
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/addons/p5.sound.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.19.0/matter.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
<main>
</main>
<script src="sketch.js"></script>
<script src="circle.js"></script>
<script src="boundary.js"></script>
</body>
</html>
class Circle{
constructor(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
let options = {
friction: 0,
restitution: 0.6
}
this.body = Bodies.circle(this.x, this.y, this.r, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
strokeWeight(1);
stroke(255)
fill(127);
ellipse(0, 0, this.r*2);
pop();
}
}
class Boundary {
constructor(x, y, w, h, a) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
let options = {
friction: 0,
restitution: 0.6,
angle: a,
isStatic: true
}
this.body = Bodies.rectangle(this.x, this.y, this.w, this.h, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
fill(0);
rect(0, 0, this.w, this.h);
pop();
}
}
const { Engine, World, Bodies, Composite } = Matter;
let engine;
let world;
let circles = [];
let boundaries = [];
function setup() {
createCanvas(400, 400);
engine = Engine.create();
world = engine.world;
boundaries.push(new Boundary(150, 100, width* 0.6, 20, 0.3));
boundaries.push(new Boundary(250, 300, width* 0.6, 20, -0.3));
}
function mouseDragged() {
circles.push(new Circle(mouseX, mouseY, random(5, 10)));
}
function draw() {
background(51);
Engine.update(engine);
for (let i = 0; i < circles.length; i++) {
circles[i].show();
}
for (let i = 0; i < boundaries.length; i++) {
boundaries[i].show();
}
}
우와~~ 우리가 matter.js 두번째 동영상 강의도 끝내었네요~~^^*
샴푸를 머리결 곱게 바르고 억수비 내리는 지붕 위를 미끄럼 타며 비눗방울들을 또르륵! 또르륵! 만들어 내는 우리의 마우스/손가락은 샴푸의 요정~~^^*
오늘 저와 함께 샴푸의 요정이 되어 가을비 내리는 반가운 하늘에 예쁜 비눗방울들을 선물해 주셔서 감사합니다~^^*
우리 내일 또 만나서~^^* 코딩 모험 이어갈까요~^^*
네~^^* 꿈은 이루어 집니다~^^*
댓글 남기기