8

私は自分のゲームの衝突システムに取り組んでいます。これはトップダウンシューターであり、キャラクターは常に静的です-そして他のすべて(マップ/レベル)は彼の周りを動きます。

キャラクターも回転するので、常にマウスの位置を向いています。

そのことを念頭に置いて、キャラクターの回転を考慮する必要がある衝突システムに頭を悩ませることはできないようですよね?

基本的に、指定されたオブジェクトがキャラクター/スプライトに「触れている」かどうかを確認したいだけです。私が使用している数学が正しいかどうかはわかりません。

これは私の衝突検出です(すべての更新と呼ばれます):

function detectCollisions(){

    //Detect for game props
    if(collides(Map, TestProp)){
        console.debug("Touching...");
    }

}

function collides(a, b){

    //ctxMap.setTransform(1, 0, 0, 1, -Map.x + gameWidth/2, -Map.y + gameHeight/2);

    //var transX = -Map.x + gameWidth/2;
    //var transY = -Map.y + gameHeight/2;

    //need to take player rotation into account too!

    //console.debug(a.x + " " + b.x + " " + b.width + " " + Player.width); //A Width

    /*return  a.x < b.x + b.width && a.x + Player.width > b.x &&
            a.y < b.y + b.height && a.y + Player.height > b.y;*/

    var xOffset = Math.cos(Player.characterRotation); //+ Player.width;
    var yOffset = Math.sin(Player.characterRotation); //+ Player.height;

    return  Map.x + xOffset > b.x && Map.x + xOffset < b.x + b.width &&
            Map.y + yOffset > b.y && Map.y + yOffset < b.y + b.height;

}

また、これが適切かどうかはわかりませんが、これは私のマップキャンバスを移動するために使用される変換です。

ctxMap.setTransform(1, 0, 0, 1, -Map.x + gameWidth/2, -Map.y + gameHeight/2);

誰かがここで私を助けてくれたら幸いです:)ありがとう!

4

2 に答える 2

4

個人的には、キャラクターの衝突はあまり気になりません。私がそれを言う理由は単純です。

あなたが壁の近くを本当に歩いているのを見ましょう。次に、マウスを追いかけるように向きを変えると、スプライトが壁に重なります。これでどうしますか?回転を停止すると動きが台無しになるか、スプライトをオーバーラップさせて、プレーヤーが再び自由になるまで完全にスタックします。

私の好みは、衝突円を使用することです。プレーヤーが壁からRピクセルよりも近い場合は、衝突としてカウントし、プレーヤーの移動を停止します。このように、プレーヤーが向きを変えても、スプライトによってプレーヤーがスタックすることはなく、常に壁から離れることができます。

于 2013-01-28T00:46:48.727 に答える
2

今回はあえてludumに入り、ベースコードを説明するチュートリアルを行いました。チュートリアルはここで見つけることができます:http ://www.philjeffes.co.uk/wordpress/?p = 63

これは、円ベースの衝突検出の例を示しています。任意のコードを自由に使用してください。次のコードは、そのコードを一般的な使用法に適合させたものです。

function CollisionCheck(obj1,obj2){
    // If the two objects are less the sum of their collision radii apart then they have collided
    // Note that one obj is obj (with a loc and a size) and the other is this.
    // Returns true if the objects are touching

    var dist = obj2.size + obj1.size; // The distance they must be apart to be not touching
    if(obj1.x-obj2.x>dist || obj1.x-obj2.x<-dist)
       return false; // Too far apart in x plane
    if(obj1.y-obj2.y>dist || obj1.y-obj2.y<-dist)
       return false; // Too far apart in y plane

    var xDist = obj1.x-obj2.x;
    var yDist = obj1.y-obj2.y;

   var hyp = Math.sqrt((xDist*xDist)+(yDist*yDist));

   if(hyp<dist)
    return true;

   return false;

}

編集

コメントのvalsで指摘されているMath.abs呼び出しを削除しました。

于 2013-01-29T17:19:49.433 に答える