어제 하얀 눈이 하염없이 내렸는데요~^^* 그 눈의 하얀 자취가 남아있는 아침의 창가~^^*
서늘하면서도 온화한 눈꽃들의 소리로 채워진 이 아침과 공명하고 계시겠어요~^^*?
공부 정리해서 돌아올게요~^^* 쓩우웅~^^*
네~^^*
오늘은, 우리가 발견했었던 에러를 고쳐보겠습니다~^^*
무한 반복 함수인 draw()의 특성~^^*,
for 구문의 조건 사항~^^*,
배열 구성요소를 삭제하고 빈자리에 다음 구성요소들을 차례로 옮겨와 배열을 정돈하는 함수 splice()의 특성~^^*,
조건문 if (A) ~ else if(B) 의 구조~^^*
등을 잘 이해해 볼 수 있는 좋은 예시가 될 것 같기도 해요~^^*
class Vehicle {
.
.
.
eat(list) {
var record = Infinity;
var closest = -1;
for (var i = 0; i < list.length; i++) {
var d = this.position.dist(list[i]);
if(d < record) {
record = d;
closest = i;
}
}
//this.seek(list[closest]);
if(record < 5) {
list.splice(closest, 1);
} else if(closest > -1) {
this.seek(list[closest]);
}
}
seek(target) {
const desired = p5.Vector.sub(target, this.position);
desired.setMag(this.maxspeed);
let steer = p5.Vector.sub(desired, this.velocity);
steer.limit(this.maxforce);
this.applyForce(steer);
}
.
.
.
}
//가장 가까운 거리에 대한 신기록 record는 앞으로 점점 수치가 작아질 것이므로, 시작하기 전까지는 알 수 없는 가장 큰 값 Infinity 무한대 값으로 초기 설정하겠습니다~^^*
//배열 list[]의 첫 구성요소 list[0]도 살펴봐야 하기 때문에, 가장 가까운 list 구성요소의 인덱스를 표현할 closest는 -1로 초기 설정하겠습니다.
//"IF"가장 가까운 거리에 대한 신기록 record가 5 pixel보다도 작다면, 정말 가까운 것이니까, "제가 한 번 먹어 보도록 하겠습니다~"
//list[]의 closest번째부터 구성요소 하나만을 제거하도록 하겠습니다. 즉, closest 번째 구성요소를 제거하겠습니다.
//함수 splice()에 의해 제거된 구성요소 다음의 구성요소들이 차례로 앞으로 한 칸씩 이동하여 배열이 정돈될 것입니다~^^*
//먹는 행동만 하고, 함수 eat()는 종료될 것입니다.
//"ELSE IF" 즉, 5 픽셀 반경 안에 list[]의 구성요소가 없는 경우에는
// else if의 조건에 따라~^^* cloest가 -1보다 큰 경우만
//vehicle과 가장 가까운 거리에 있는 list의 구성요소인 list[closest]를 추구하도록 함수 seek를 호출하겠습니다~^^*
//무한 반복 함수 draw()에 의해 함수 eat()가 계속 호출될 것입니다.
//더 이상 배열 list[]에 구성요소가 남아있지 않게 되면, for 구문이 작동되지 않습니다. "i = 0 < list.length == 0", 즉, "0 < 0" 조건이 만족될 경우가 없기 때문입니다.
//그래서 closest는 -1의 상태를 유지하게 됩니다.
//그러면 if문의 조건도 else if문의 조건도 해당되지 않아서, 먹지도 않고 탐색하지도 않고 함수 eat()는 종료합니다.
function draw() {
.
.
.
vehicle.eat(food);
.
.
.
}
food가 5 픽셀 거리 보다 더 가까이 있으면, 그 food를 먹기만 하고, 즉 배열 food에서 그 food를 삭제만 하고 (그러면, 배열 food[]의 구성요소 총 갯수 food.length가 1 감소하게 되겠네요), 행동을 종료합니다.
함수 draw()는 무한 반복함수이기 때문에, 다시 food.eat()을 호출할 것입니다.
그러면, closest는 -1로 재세팅이 되겠네요.
이때, 모든 food들을 다 먹어버린 상태라면, food.length가 0이기 때문에, 가장 가까운 거리 신기록을 갱신하며 배열 food[]에서의 그 food의 순번을 찾는 for구문이 작동되지 않을 것입니다.
왜냐하면~^^*
food.length == 0 이라서~^^*,
맨 처음 i 가 0일 때부터~^^*,
i < food.length ( 즉, 0 < 0 , “0”이 “0”보다 더 작다) 라는 조건을~^^*
만족시킬 수 없어서~^^*,
for 구문은 처음부터 작동되지 않습니다~^^*.
그러면 closest는 여전히 -1 상태에 머물러 있을 것입니다.
그래서 closest가 -1보다 큰 경우에만, 즉 배열 food[]에 구성요소가 남아있을 경우에만, food의 위치를 파악하여 그 방향으로 몸을 트는 함수 seek()를 작동시킵니다.
poison의 경우도 함수 eat()를 호출하기 때문에, 같은 작용이 일어날 것 같습니다~^^*
네~^^* 구성요소가 더 이상 존재하지 않는 경우에는 탐색하지 않기 때문에, 존재하지 않는 구성요소를 찾아 거리를 계산하느라 컴퓨터가 힘들어서 에러 메시지를 내던 상황은 해결된 것 같습니다~^^*
네~^* 아주 간단하게 몇 자만 수정하였는데도 에러가 해결되니 신기하네요~^^*
네~^^* 몇 글자 되지 않는 수정 작업이 내포하고 있는 의미가 생각보다 방대하고 정교해서 또한 신기하기도 하네요~^^*
수정작업은 아주 간단하지만 되살펴보면 좋을 내용들을 아주 많이 가지고 있어서요~^^*
오늘은 여기까지만 하기로 할까요~^^*
네~^^* 좋아요~^^* 고마워요~^^*
오늘 저와 함께 간단하지만 심도 깊은 에러 수정 작업을 해내어 주셔서 감사합니다~^^*
마치 깊은 바다 속을 헤엄치는 듯한 이 신기함~~^^*
내일은 음식과 독약을 구분할 수 있는 지혜를 한 톨 한 톨 따라가는 과정을 우리 함께 시작해 볼까요~^^*
네~^^* 좋아요~^^* 고마워요~^^*
오늘도!!
맛있는 점심 냠냠!!!
보람찬 하루~YEAH!!!
따끈한 저녁 후루룩!!!
포근하고 깊은 밤 코~~^^* 하시기 바래요~~^^*
주말 동안의 반갑고 기쁜 만남에 설레어 하며 좋은 꿈 꾸시고요~^^*
네~^^* 꿈은 이루어 집니다~^^*
댓글 남기기