【发布时间】:2016-12-19 05:14:21
【问题描述】:
我是画布动画的初学者,我尝试了一个简单的示例代码来进行圆形碰撞测试。在此之前,我曾尝试在互联网上搜索,但我不明白背后的逻辑是什么。下面是我到目前为止得到的代码,问题是他们发生碰撞的一些圆圈,但之后它们粘在一起或相互重叠,不确定我在背后的逻辑是否遗漏或错误?
window.requestAnimationFrame= (function(){
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60);
};
})();
(function(){
var c= document.getElementsByTagName('canvas')[0],
can= c.getContext('2d'),
ppl= [],
count= 20;
function resize(){
c.width= window.innerWidth,
c.height= window.innerHeight,
can.fillStyle='#000000',
can.fillRect(0,0,c.width,c.height)
}
function pplD(){
var tf,pplnew={
x: Math.floor(Math.random()*c.width),
y: Math.floor(Math.random()*c.height),
size: 20,//Math.random()*4+8,
vx: (Math.random()-0.5)*4+2,
vy: (Math.random()-0.5)*4+2
}
for(var i=0;i<ppl.length;i++){
tf= coli(pplnew,ppl[i]);
if(tf){
pplD();
return
}
}
return pplnew;
}
function canF(){
for(var i=0;i<count;i++){
ppl.push(new pplD)
}
requestAnimationFrame(render)
}
function coli(a,b){
var dis= a.size+b.size,
disx= (a.x-b.x), disy= (a.y-b.y),
disxy= Math.sqrt((disx*disx)+(disy*disy)),
c;
if(disxy<dis){
if((a.vx>0 && b.vx>0) || (a.vx<0 && b.vx<0)){
c= a.vx, a.vx= b.vx, b.vx= c
}else{
a.vx*= -1, b.vx*= -1
}
if((a.vy>0 && b.vy>0) || (a.vy<0 && b.vy<0)){
c= a.vy, a.vy= b.vy, b.vy= c
}else{
a.vy*= -1, b.vy*= -1
}
return true;
}
return false;
}
function drawppl(d,p){
var tf;
for(var i=0;i<ppl.length;i++){
if(i==p) continue;
tf= coli(d,ppl[i]);
}
if(d.x+d.size>c.width || d.x-d.size<0) d.vx=d.vx*-1;
if(d.y+d.size>c.height || d.y-d.size<0) d.vy=d.vy*-1;
d.x+= d.vx,
d.y+= d.vy;
can.fillStyle= '#a6e22e';
can.beginPath();
can.arc(d.x, d.y, d.size, 0, Math.PI*2, true);
can.closePath();
can.fill()
}
function render(){
can.fillStyle='rgba(0,0,0,0.2)',
can.fillRect(0,0,c.width,c.height)
for(var i=0;i<ppl.length;i++){
drawppl(ppl[i],i)
}
requestAnimationFrame(render)
}
window.onresize= resize;
resize();
canF()
})();
html,body {
width:100%;
height:100%;
margin:0;
padding:0;
border:0;
}
<canvas></canvas>
【问题讨论】:
-
代码已准备好通过复制粘贴到另一个 html 文件中。
-
尝试缩小球的大小或将其与球浮动的矩形尺寸相对应
标签: javascript canvas collision