예전 에는 현묘 하고 현묘 한 충돌 검출 알고리즘 이 라 고 생각 했 지만 사실은 가감 법 에 불과 했다.아무래도 너무 적 게 쓴 것 같 아서 대부분 은 보기 만 하고 멈 추 는 단계 에 머 물 렀 다.
직사각형의 충돌 검 측 원 리 는 두 직사각형의 x 값 + 너비 와 y 값 + 높이 의 각종 비교 이다.
function (c1,c2{
return !{
b1.x + b1.w < b2.x ||
b1.y + b1.h < b2.y ||
b2.x + b2.w < b1.x ||
b2.y + b2.h < b1.y
}
직사각형 1 의 x 에 직사각형 1 의 너비 가 직사각형 2 의 x 보다 작 다 는 뜻 이다. 그러면 직사각형 1 이 직사각형 2 의 왼쪽 에 있 을 때 두 사각형 이 수평 방향 에서 중첩 되 었 는 지 확인 할 수 있다.수직 방향 이 같 으 면 x 를 y 로 바 꾸 고 너 비 를 높이 로 바 꾸 면 됩 니 다.
충돌 검 측 원 리 를 알 게 된 후에 다른 것 은 작은 뜻 입 니 다. 애니메이션 프레임 을 이용 하면 사각형 이 떨 어 지 는 애니메이션 을 만 들 수 있 습 니 다.
전체 코드 는 다음 과 같 습 니 다:
<span style="color:#008000;">/*</span><span style="color:#008000;"> y , , </span><span style="color:#008000;">*/</span>
<span style="color:#0000ff;">var</span> cav = document.getElementById("cav"<span style="color:#000000;">),
ctx </span>= cav.getContext('2d'<span style="color:#000000;">);
</span><span style="color:#0000ff;">var</span> rects = [],<span style="color:#008000;">//</span><span style="color:#008000;"> </span>
speed = 2;<span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">function</span><span style="color:#000000;"> rectInit(x, y, width, height) {
</span><span style="color:#0000ff;">this</span>.x =<span style="color:#000000;"> x;
</span><span style="color:#0000ff;">this</span>.y =<span style="color:#000000;"> y;
</span><span style="color:#0000ff;">this</span>.w =<span style="color:#000000;"> width;
</span><span style="color:#0000ff;">this</span>.h =<span style="color:#000000;"> height;
}
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">function</span><span style="color:#000000;"> createRect() {
</span><span style="color:#0000ff;">var</span> x = cav.width *<span style="color:#000000;"> Math.random(),
y </span>= 0<span style="color:#000000;">;
</span><span style="color:#0000ff;">var</span> rect = <span style="color:#0000ff;">new</span> rectInit(x, y, 30, 30<span style="color:#000000;">);
rects.push(rect);
</span><span style="color:#0000ff;">return</span><span style="color:#000000;"> rect;
}
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">var</span> oRect = <span style="color:#0000ff;">new</span> rectInit(cav.width / 2, 0, 30, 30<span style="color:#000000;">);
rects.push(oRect);
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">function</span><span style="color:#000000;"> animate() {
ctx.clearRect(</span>0, 0<span style="color:#000000;">, cav.width, cav.height);
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">if</span>(oRect.y < cav.height-<span style="color:#000000;">oRect.h){
oRect.y </span>+=<span style="color:#000000;"> speed;
}
</span><span style="color:#0000ff;">else</span>{<span style="color:#008000;">//</span><span style="color:#008000;"> </span>
oRect.y = cav.height-<span style="color:#000000;">oRect.h;
oRect </span>= createRect();<span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#000000;"> }
ctx.fillStyle </span>= '#f00'<span style="color:#000000;">;
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
rects.forEach(<span style="color:#0000ff;">function</span><span style="color:#000000;">(r,i){
</span><span style="color:#0000ff;">if</span>(oRect !== r &&<span style="color:#000000;"> collision(oRect,r)){
</span><span style="color:#008000;">//</span><span style="color:#008000;"> console.log(' ');</span>
oRect.y = r.y -<span style="color:#000000;"> oRect.h;
oRect </span>=<span style="color:#000000;"> createRect();
}
ctx.fillRect(r.x,r.y,r.w,r.h);
});
requestAnimationFrame(animate);
}
animate();
</span><span style="color:#008000;">//</span><span style="color:#008000;"> </span>
<span style="color:#0000ff;">function</span><span style="color:#000000;"> collision(c1, c2) {
</span><span style="color:#0000ff;">return</span> !(c1.x + c1.w < c2.x ||<span style="color:#000000;">
c1.y </span>+ c1.h < c2.y ||<span style="color:#000000;">
c2.x </span>+ c2.w < c1.x ||<span style="color:#000000;">
c2.y </span>+ c2.h <<span style="color:#000000;"> c1.y
);
}
</span>
다음으로 전송:https://www.cnblogs.com/11lang/p/6082811.html
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.