Silverback9

#야생으로

Creative Coding 독학 제115일 2024년07월20일(토)

오늘은 return 명령어를 사용하여 , 꼬리에 꼬리를 무는 재미있는 구조로 Flee를 표현해 보겠습니다~^^*

아래 동영상 강의를 클릭하시면 오늘 공부 내용을 바로 시작(1:35)하실 수 있어요~ 13:24까지 보시면 오늘 공부 끝~^^*

return은 ‘되돌아가다’ ‘되돌려주다’의 뜻을 가지고 있다고 하죠~^^*

어떤 함수 안에 return OOOO; 라는 실행문이 있는 경우, 그 함수를 호출한 다른 함수에게 자신이 일한 결과값 OOOO을 되돌려 주어요. 그러면, 값을 되돌려받은 함수는 그 값을 사용하여 어떤 다른 일을 하게 되겠지요~^^*

어제 우리는, 함수 flee()를 만들기 위해 함수 seek()의 내용을 그대로 따라 쓰고, 벡터 force의 방향을 반대 방향으로 만드는 실행문 하나를 더 했었지요~^^*

오늘은 flee()함수를 정말 정말 정말 짧은 실행문으로 완성해 보려고 합니다.

하나. 함수 seek()가 벡터 force의 값을 자신을 호출한 함수에게 return 하도록, 살짝 고치겠습니다.

  seek(target) {
    let force = p5.Vector.sub(target, this.pos);
    force.setMag(this.maxSpeed);
    force.sub(this.vel);
    force.limit(this.maxForce);
    return force;
  }

둘. 함수 flee()는 이제 함수 seek()를 호출하여 그 return 값에 (-1)을 곱한 후, 그 값을 자신을 호출한 함수에게 return하도록 하겠습니다.

  flee(chaser) {
    return this.seek(chaser).mult(-1);
  }

셋. 함수 draw()는 함수 flee()를 호출하여 그 return 값을 autonomous agent Vehicle에 작용하는 힘에 반영하도록 하겠습니다~^^*

vehicle.applyForce(vehicle.flee(chaser));

프로그램이 작동되는 순서로 되살펴보면~

하나. 함수 draw()가 함수 flee()를 호출합니다.

둘. 함수 flee()가 함수 seek()를 호출합니다.

셋. 함수 seek()가 벡터 force값을 함수 flee()에게 return 합니다.

넷. 함수 flee()가 함수 seek()에게서 return 받은 벡터 force값에 (-1)을 곱하여 방향을 반대로 바꾼 후 벡터 force를 함수 draw()에게 return합니다.

다섯. 함수 draw()가 함수 flee()에게서 return 받은 벡터 force를 autonomous agent Vehicle의 힘에 반영합니다.

무언가를 받아서 다른 무언가를 되돌려주는 것이 꼬리에 꼬리를 물고 있는데요~^^*

오늘 우리가 만들어 볼 return 코드는,

(1) 야채사라다를 받아서,

(2) 식빵 두 조각 사이에 야채사라다를 넣어서,

(3) 야채사라다 샌드위치를 만들어서,

(4) 돌려주는

경우에 더 가까울 것 같아요~^^*

어떤 것을 건네받아 그것을 가지고 어떤 일을 하고 그 일의 결과를 되돌려주는 것~^^*이 될 것 같아요~^^*

그럼 전체 코드를 함께 살펴 볼까요~^^*

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

  </head>
  <body>
    http://vehicle.js
    http://sketch.js
  </body>
</html>

class Vehicle {
  constructor(x, y) {
    this.pos = createVector(x, y);
    this.vel = createVector(0, 0);
    this.acc = createVector(0, 0);
    this.maxSpeed = 4;
    this.maxForce = 0.25;
    this.r = 16;
  }

  flee(chaser) {
    return this.seek(chaser).mult(-1);
   }
  //2. 둘. seek()함수를 호출하여 draw()에게서 건네받은 chaser 값을 건네줍니다.
  //5. 다섯. seek()에게서 return 받은 force 값에 -1을 곱합니다.
  //6. 여섯. draw()에게 force 값을 return합니다.  
  
  seek(target) {
    let force = p5.Vector.sub(target, this.pos);        
    force.setMag(this.maxSpeed);
    force.sub(this.vel);
    force.limit(this.maxForce);      
    return force;
  }
  //3. 셋. flee()이 건네주는 chaser 값을 target 이라는 이름의 인자로 받아 force를 계산합니다.  
  //4. 넷. force 값을 flee()에게 return합니다. 
  
  applyForce(force) {
    this.acc.add(force);
  }

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

  show() {
    stroke(255);
    strokeWeight(2);
    fill(255);
    push();
    translate(this.pos.x, this.pos.y);
    rotate(this.vel.heading());
    triangle(-this.r, -this.r / 2, -this.r, this.r / 2, this.r, 0);
    pop();
  }

  edges() {
    if (this.pos.x > width + this.r) {
      this.pos.x = -this.r;
    } else if (this.pos.x < -this.r) {
      this.pos.x = width + this.r;
    }
    if (this.pos.y > height + this.r) {
      this.pos.y = -this.r;
    } else if (this.pos.y < -this.r) {
      this.pos.y = height + this.r;
    }
  }
}
let vehicle;
let chaser;

function setup() {
  createCanvas(400, 400);
  vehicle = new Vehicle(100, 100);
}

function draw() {
  background(0);
  fill(255, 0, 0);
  noStroke();
  chaser = createVector(mouseX, mouseY);
  circle(chaser.x, chaser.y, 32);
  
  vehicle.applyForce(vehicle.flee(chaser));
  //1. 하나. flee()를 호출하여 chaser 값을 건네줍니다. 
  //7. 일곱. flee()에게서 return 받은 force 값을 vehicle의 force에 반영합니다.
  
  vehicle.update();
  vehicle.show();
}

Return은 ‘되돌아가다/되돌아오다’의 뜻도 있지요~^^*

Return ‘어떤 것을 되돌려준다’는 것과 ‘어떤 상태로 되돌아간다’는 것은 많은 고민과 개선의 노력과 충실한 실행이 필요한 것 같아요. 우리의 Flee! Returns! 프로그램처럼요~^^*

우리가 어떤 시점으로 되돌아갈 수는 없지만, 되돌아가고 싶은 상황을 지금 현재부터 다시 만들어 낼 수는 있는 것 같아요~~^^*

(음…저는 노트정리를 매일 하는 것이 있는데요. 매일 매일 제때 제때 노트정리를 하면 기분이 참 좋았거든요…요즘…며칠 밀렸는데요…노트 정리가 제때 다 되었던 며칠 전으로 돌아갈 수는 없어도, 노트정리가 제때 다되어 기분이 좋은 상황은 지금 현재부터 다시 만들어 낼 수 있으니까…열심히 노트정리를 하도록 해 볼게요~^^*

어떤 상황을 지금 현재부터 다시 만들어 내고 싶으신가요~?^^* 그 소망 저도 응원드릴게요!)

우리 서로를 믿어주고 서로를 응원해 보기로 할까요~^^*

네!!, 그럼~~^^*, 우리 Flee!의 Return을 축하하며 마우스/손가락으로 Flee!와 즐거운 추격놀이를 해 볼까요~^^*

해가 떴다가 비가 내렸다가 이제 말갛게 파란 저녁 공기가 찾아오는 시간, 우리 모두 순수로 되돌아가는 꿈을 꾸는 밤을 기다려 봐요~~^^*

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

내일 우리 또 만나서, 다음 도전을 맞이해 볼까요~~^^*

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

댓글 남기기