0

たくさんのボックスをアニメーション化して衝突を検出し、それに応じて移動する練習スクリプトを書いています。問題は、衝突を見つけましたが、衝突が発生した側をチェックして、それらを適切に移動できるようにする方法です。

これは私が書いた方法です.それを行うより良い方法はありますか?

this.ballCollide = function(){
for(var i = 0; i < ball.length; i++){
  for(var j = i+1 ; j < ball.length; j++){
    if( ((ballX[i] + 50) >= ballX[j]) && (ballX[i] <= (ballX[j] + 50)) && ((ballY[i] + 50) >= ballY[j]) && (ballY[i] <= (ballY[j] + 50))){
       movePosX[i] = -movePosX[i];
       movePosY[i] = -movePosY[i];
       movePosX[j] = -movePosX[j];
       movePosY[j] = -movePosY[j];
    }
  }
}

}

4

1 に答える 1

0

少しリファクタリングが必要だと思います。以下は、正しい方向を示すのに役立つ場合があります。

注: 私はコードを検証しなかったので、すべての文字を読んでください。さらに、左と右は設定されていると思いますが、元のロジックを理解していなかったと思うため (または、少なくとも私には意味が分からなくなってきたので)、上下と最終的な移動ロジックは機能しませんでした。 -- どこかで || が欠落しているようです)。

this.ballCollide = function() {

    for (var i = 0; i < ball.length; i++) {

        var ax = ballX[i];
        var ay = ballY[i];

        for (var j = i + 1; j < ball.length; j++) {

            var bx = ballX[j];
            var by = ballY[j];

            var left    = ( ax <= bx + 50 );
            var right   = ( ax + 50 >= bx );
            var top     = ( ay + 50 >= by );
            var bottom  = ( ay <= by + 50 );

            if( (left && right) && (top && bottom) ){

                movePosX[i] = -movePosX[i];
                movePosY[i] = -movePosY[i];
                movePosX[j] = -movePosX[j];
                movePosY[j] = -movePosY[j];

            }

        }
    }
}

役に立つかもしれない「contains」関数を次に示します。

function contains (big, small){

    if( ! big || ! small ){
        return false;
    }

    var Oresult = {};

    var Obig    = {x:big.x,     y:big.y,    w:big.width,    h:big.height};
    var Osmall  = {x:small.x,   y:small.y,  w:small.width,  h:small.height};

    Obig.xMax   = Obig.x    + Obig.w;
    Obig.yMax   = Obig.y    + Obig.h;

    Osmall.xMax = Osmall.x  + Osmall.w;
    Osmall.yMax = Osmall.y  + Osmall.h;

    for (var p in Obig) {

        Oresult[p] = ( Obig[p] >= Osmall[p] ) ? true : false;

    }

    var retval = (!Oresult.x && !Oresult.y && Oresult.xMax && Oresult.yMax) ? true : false;

    return retval;
}
于 2015-12-04T03:29:34.900 に答える