我的碰撞检测有问题

时间:2013-12-09 00:07:45

标签: javascript collision detection tiles

我创建了一个瓦片和粒子游戏(在代码中称为单元),在它们创建的边界内弹跳。粒子随机移动并改变。当他们遇到0块(看起来是黑色)时,它们会反弹。

代码:http://jsfiddle.net/kgkdb/

然而,有时我的碰撞检测失败并且它们卡在0块中。发生这种情况时,粒子会被传送到屏幕中间。对于单个粒子来说,它很少发生,但如果有足够的粒子,你可以经常看到它。

重现步骤:http://imgur.com/a/7w6wl

  1. 按z清除任何粒子

  2. 使用鼠标左键单击制作一个空的4x4盒子。

  3. 将光标置于制作框内。

  4. 等待f。这将创建新的粒子。由于碰撞检测失败,你很快就会看到其中一些传送到中间。

  5. 检测与0块冲突的代码位于函数unitlogic:

    if(insidemap(num)){
        // 0 tile below unit
        if(ontile.ytile+1<mapArray.length && mapArray[ontile.ytile+1][ontile.xtile]==0 && units[num].y>ontile.ytile*20+16-units[num].yspeed){
            units[num].yspeed = -units[num].yspeed;
            units[num].direction = 0;
            }
        // 0 tile left to unit
        else if(mapArray[ontile.ytile][ontile.xtile-1]==0 && units[num].x<ontile.xtile*20+4-units[num].xspeed){
            units[num].xspeed = -units[num].xspeed;
            units[num].direction = 1.8;
            }
        // 0 tile right to unit
        else if(mapArray[ontile.ytile][ontile.xtile+1]==0 && units[num].x>ontile.xtile*20+16-units[num].xspeed){
            units[num].xspeed = -units[num].xspeed;
            units[num].direction = -1.8;
            }
        // 0 tile above unit
        else if(ontile.ytile-1>=0 && mapArray[ontile.ytile-1][ontile.xtile]==0 && units[num].y<ontile.ytile*20+4-units[num].yspeed){
            units[num].yspeed = -units[num].yspeed;
            units[num].direction = 3.6;
            }
        // unit is where it is not supposed to be and is put in the center
        else if(mapArray[ontile.ytile][ontile.xtile]==0){
            units[num].x=400;
            units[num].y=400;
        }
    

0 个答案:

没有答案