😵 ~23.11.10
0726 | 움직임에 대한 충돌 조건식 / 삼각형 그리기
unikue
2023. 7. 27. 10:03
✅ ball 충돌 조건 만들기
1. 볼을 선택해서 curBall을 업데이트하기
canvas.onclick = function (e) {
for (var ball of balls) { // 배열에 담은 볼 객체를 for문으로 돌린다
if (ball.isLocated(e.x, e.y)) { //만약 e.x,e.y의 위치에 해당하는 볼이라면
curBall.setActive(false); //이전의 curBall을 inactive처리
curBall = ball; //curBall업데이트
console.log("선택")
curBall.setActive(); //curBall을 선택상태로 활성화
return; // 아래 moveTo와 연속으로 실행되지 않도록 if조건 실행 후 return처리
}
}
curBall.moveTo(e.x, e.y);
console.log("외부선택")
}
2. 공 충돌 : curBall을 기준으로 선택 볼이 다른 볼과 충돌이 났는지 체크 (for문으로 공마다 순회)
Math.sqrt() - JavaScript | MDN
The Math.sqrt() static method returns the square root of a number. That is
developer.mozilla.org
window.setInterval(function () {
for (var ball of balls) {
// 1) 만약 ball이 curBall하고 같다면 바로 다음턴으로 이동. 기준 볼 잡아주기
if (ball === curBall) { // 값비교가 아닌 객체비교하기
continue;
}
// 2) 나머지 공들이라면 충돌 확인. 만약에 d== r1+r2라면 충돌
//삼각형의 대각선 구하는 공식 적용
var w = curBall.x - ball.x;
var h = curBall.y - ball.y;
var d = Math.sqrt(w * w + h * h);
var rSum = curBall.radius + ball.radius;
if (d <= rSum) {
console.log("충돌");
var idxBall = balls.indexOf(ball); // 인덱스를 찾아내서
balls.splice(idxBall, 1); // 해당 볼을 죽이기
}
}
✅ 버튼만들기
1. 삼각형 그리기
1.1 기존 방법
* path로 설정시 주의사항 ① "따옴표" 안에 설정값 넣기 ② 대소문자 구분하기 (대문자가 좌표, 소문자가 거리)
var shape = new Path2D("M 800 100 L 850 100 L 825 60 z");
ctx.stroke(shape);
ctx.fillStyle = this.color;
ctx.fill(shape);
1.2 변수화를 위해 좌표를 구하는 식 만들기
var bx = 800;
var by = 100;
var br = 30;
var hw = Math.sqrt((br * br) - ((br / 2) * (br / 2))); // 이때 작은값에서 큰 값을 빼면 루트 안에 마이너스가 나옴 > 허수 > NaN으로 콘솔출력됨
var pos1 = { x: bx, y: by + br };
var pos2 = { x: bx - hw, y: by - br / 2 }
var pos3 = { x: bx + hw, y: by - br / 2 }
// console.log(hw) 값이 잘 뽑혔는지 콘솔에 찍어봄
// console.log(pos1.x)
// console.log(pos1.y)
// console.log(pos2.x)
// console.log(pos2.y)
// console.log(pos3.x)
// console.log(pos3.y)
// var btnshape = new Path2D();
ctx.lineTo(pos1.x, pos1.y);
ctx.lineTo(pos2.x, pos2.y);
ctx.lineTo(pos3.x, pos3.y);
ctx.lineTo(pos1.x, pos1.y);
ctx.stroke();
ctx.fillStyle = "orange";
ctx.fill();