2011-10-12 88 views
0

我正在尝试在javascript和html5画布中执行一些简单的碰撞。到目前为止,我有这样的:Javascript停止在画布中重复碰撞检测

checkCollision = (function(){ 
     var l, i, ni,dis = 0; 
     var ob1,ob2 = {}; 

     return function(){ 
      //collisions is the array holding all the objects 
      l = collisions.length; 
      i = 0; 
      ni = 1; 
      while(i<l){ 
       //grab the first object 
       ob1 = collisions[i]; 

       while(ni<l){ 
        //get the object to check against 
        ob2 = collisions[ni]; 
        //find the distance between the two 
        dis = Math.sqrt(Math.pow((ob1.pos[0]-ob2.pos[0]),2)+Math.pow((ob1.pos[1]-ob2.pos[1]),2)); 
        //rad is the radius 
        if(ob1.rad+ob2.rad >= dis){ 
         console.log("collision") 
        } 

        //move forward second increment 
        ni++; 
       } 

       i++; 
       //keep one place ahead 
       ni=i+1; 
      } 
     }; 

    })(); 

我这样做是没有任何形式的帮助,但现在我想我的大脑实在是太多了玉米粥推测这个最后一部分了。碰撞发生在每一帧,我不想要。当碰撞第一次发生时,我只想让它发射一次。我试着给每个对象一个碰撞变量,如果已经发生了碰撞,但它不能很好地工作。有些它会发生一次,有些会不断发射。 有没有人有任何指针?

+0

顺便说一句,这只是简单的圆形碰撞 – Isaiah

回答

1

你是什么意思“发生每一帧”?算法似乎没问题,但似乎没有碰撞的任何内容,它只是被记录下来。你想跳出循环吗?

什么都没有做您的问题,但可能使你的代码有点更具可读性和简洁的一些评论:

> checkCollision = (function(){ 
>   var l, i, ni,dis = 0; 
>   var ob1,ob2 = {}; 

我不知道你为什么初始化DISOB2,他们稍后分配值。使用这样的闭包意味着这些值将持续到次级调用,直到分配新值。关闭是否真的需要?对于这样的动画可能会有性能提升。

>    ni = 1; 
>    while(i<l){ 

你可以把了一段时间后,类似这样的:

 while(i < l){ 
      ni = i + 1; 

,摆脱过去的ni = i + 1的。你也可以这样做:

>    ob1 = collisions[i++]; 

,摆脱过去的i++;的,一个分配给OB2这样做。

通过这样做,减少了代码行的数量,因此它更易消化,例如,

function checkCollision() { 
    var ni, dis, ob1, ob2; 
    //collisions is the array holding all the objects 
    var l = collisions.length; 
    var i = 0; 

    while (i < l) { 
     ni = i + 1; 
     //grab the first object 
     ob1 = collisions[i++]; 

     while (ni < l) { 
      //get the object to check against 
      ob2 = collisions[ni++]; 
      //find the distance between the two 
      dis = Math.sqrt(Math.pow((ob1.pos[0] - ob2.pos[0]), 2) + 
          Math.pow((ob1.pos[1] - ob2.pos[1]), 2)); 
      //rad is the radius 
      if (ob1.rad + ob2.rad >= dis) { 
       console.log("collision"); 

       // And what else? 

      } 
     } 
    } 
} 
+0

非常感谢,这真是法草案,我还设置这些变量持续下去,因此他们不会重新创建游戏的每一帧。这是运行的频率。它每秒运行25次,我不希望每次碰撞都会发生。假设我颠倒ob1的xvelocity,它将会弹跳,因为碰撞每次都会发生,而不仅仅是第一次。 – Isaiah

+0

让我试着更好地解释它哈哈,我希望它为每个*独特*的碰撞点燃一次。否则,如果物体太靠近在一起并且说我实现了反弹,那么这两个物体会晃动并卡在一起,因为它会不断地使它们反弹 – Isaiah

+0

@Isaiah:但是不会弹起使它们分开,因此阻止它们在下一个相互碰撞帧?我认为你的问题是你还没有实现反弹。 – slebetman