JavaScript 객체에 대한 작은 공 충돌의 기본 원리
3602 단어 javascript
function PZ(options){
this.kwidth= options.kwidth || 600;
this.kheight= options.kheight || 400;
this.kclass=options.kclass || "";
this.bwidth= options.bwidth || 40;
this.bheight= options.bheight || 40;
this.bclass=options.bclass || "";
this.bnum=options.bnum || 1;
this.balls=[];
this.K;
this.ck=function(){
this.K=document.createElement("div");
this.K.style.width=this.kwidth+"px";
this.K.style.height=this.kheight+"px";
this.K.className=this.kclass
document.body.appendChild(this.K);
}
this.cb=function(){
for(var i=0;i<this.bnum;i++){
var el=document.createElement("div");
var reg=2*Math.random()*Math.PI;// ,
var bcolor=this.colors();
var sudu=this.sudu();
this.balls.push({el:el,reg:reg,x:this.kwidth/2,y:this.kheight/2,bcolor:bcolor,sudu:sudu});
el.style.width=this.bwidth+"px";
el.style.height=this.bheight+"px";
el.style.backgroundColor=bcolor;
el.className=this.bclass
this.K.appendChild(el);
}
}
this.colors=function(){
var bcolor="";
for(var j=0;j<3;j++){
bcolor+=parseInt(Math.random()*255)+",";
}
return "rgba("+bcolor+Math.random()+")";
}
this.sudu=function(){
return parseInt(Math.random()*10+5);
}
this.bmove=function(){
for(var i=0;i<this.balls.length;i++){
var sudu=this.balls[i].sudu;
this.balls[i].x=this.balls[i].x+sudu*Math.cos(this.balls[i].reg);
this.balls[i].y=this.balls[i].y+sudu*Math.sin(this.balls[i].reg);
this.balls[i].el.style.backgroundColor=this.balls[i].bcolor;
this.balls[i].el.style.top=this.balls[i].y+"px";
this.balls[i].el.style.left=this.balls[i].x+"px";
if(this.balls[i].y>this.kheight-this.bheight || this.balls[i].y<0){
this.balls[i].reg=-this.balls[i].reg;
this.balls[i].bcolor=this.colors();
}
if(this.balls[i].x>this.kwidth-this.bwidth || this.balls[i].x<0){
this.balls[i].reg=Math.PI-this.balls[i].reg;
this.balls[i].bcolor=this.colors();
}
}
//setTimeout(this.bmove.bind(this),400);
requestAnimationFrame(this.bmove.bind(this));
//console.log(this.balls[0].bcolor);
}
this.init=function(){
this.ck();
this.cb();
this.bmove();
}
}
var z=new PZ({
kwidth:1000,
kheight:800,
kclass:"main",
bclass:"ball",
bwidth:60,
bheight:60,
bnum:62});
z.init();
var z2=new PZ({kwidth:600,
kheight:400,
kclass:"main",
bclass:"ball",
bnum:22});
z2.init();
어려운 점은 한 공의 초기 운동 방향 알고리즘에 있다
var reg=2*Math.random()*Math.PI;//초기 각도
여기에 삼각 함수를 사용하여 0~2π의 각도(호도제)를 만들었다
this.balls[i].x=this.balls[i].x+8*Math.cos(this.balls[i].reg); this.balls[i].y=this.balls[i].y+8*Math.sin(this.balls[i].reg);
경계를 넘어 반등하는 것도 삼각함수의 특성을 사용해 수학적 기초의 중요성을 알 수 있다.
if(this.balls[i].y>this.kheight-this.bheight || this.balls[i].y<0){ this.balls[i].reg=-this.balls[i].reg; } if(this.balls[i].x>this.kwidth-this.bwidth || this.balls[i].x<0){ this.balls[i].reg=Math.PI-this.balls[i].reg; }
기존 setTimeout, setInterval 등과 비교할 수 있는 새로운 애니메이션 API
requestAnimationFrame(this.bmove.bind(this));
이곳의 구덩이는this다.bmove.bind(this)는 일반적으로 우리가 사용할 때 직접 쓰는 방법이지만 현재는 대상을 대상으로 하는this를 사용했기 때문에 일부 문제가 발생했다. 구체적인 문제와 분석은 setInterval과 setTimeout의this지향문제에 대한 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
개별 마크다운 블로그 페이지 만들기 - 13부이를 통해 개별 마크다운 기반 블로그 게시물 작성을 시작할 수 있습니다! 이 기사를 따르려면 을 시작점으로 사용하십시오. blog 페이지 디렉토리에 동적 페이지를 생성하여 시작할 수 있습니다. 이 파일[slug].j...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.