1

私はFlashゲームの作成を進めており、現在、衝突検出のコーディングを行っています。衝突検出は、プレイヤーが障害物にぶつかったかどうかを検出するためのものであり、プレイヤーが障害物にぶつかった場合、それは彼が障害物を通り抜けるのを防ぎます。

衝突検出に使用しているコードは次のとおりです。

createLevel関数

   private function createLevel():void
    {
        for (var i:int; i < numChildren; i++)
        {
            if (getChildAt(i) is Trees)
            {
                var j = getChildAt(i);
                treesArray.push(j);
                trace(treesArray.length);
            }
        }
    }

そして、衝突検出機能。

    private function checkCollisions():void
    {
        for each (var trees:Trees in treesArray)
        {
            if (player.hitTestObject(trees))
            {
                switch (true)
                {
                    case (player.x <= trees.x) :
                        player.setRightSpeed(0);
                        break;
                    case (player.x >= trees.x) :
                        player.setLeftSpeed(0);
                        break;
                }

                switch (true)
                {
                    case (player.y <= trees.y) :
                        player.setDownSpeed(0);
                        break;
                    case (player.y >= trees.y) :
                        player.setUpSpeed(0);
                        break;
                }
            }
            else
            {
                player.resetSpeeds();
            }
        }

FlashステージにドラッグしたすべてのTreesオブジェクトを配列に入れています。次に、ゲームループで、関数との衝突をチェックするようにしcheckCollision()ます。

プレイヤーがいずれかの樹木に当たった場合、どちらの側に当たったかを確認し、プレイヤーがその方向に移動するのを防ぐために、私はそれを持っています。また、プレーヤーが何もヒットしていない場合は、速度を通常にリセットして、任意の方向に移動できるようにします。

ただし、このコードは、treesArrayにある最初のTreeオブジェクトに対してのみ機能します。つまり、プレーヤーが停止するのは、アレイ内の他のツリーではなく、最初のツリーに移動している場合のみです。すべての木で機能するようにするにはどうすればよいですか?

また、自分の職務の位置が原因​​かもしれないと思っていplayer.resetSpeeds()ますが、正確にはわかりません。

4

1 に答える 1

2

resetSpeeds()が正確に何をするかは少しわかりませんが、提供したコードから、プレーヤーがゲーム内のすべてのツリーに同時にヒットしない限り、常に実行されることがわかります。

ゲームに4つのツリーがあり、プレーヤーが左側の2番目のツリーをヒットすると、プレーヤーオブジェクトに対して次の順序で実行されます。

  1. resetSpeeds()
  2. player.setRightSpeed(0)
  3. resetSpeeds()
  4. resetSpeeds()

最初にヒットしている木を見つけてから、プレーヤーの速度を1回だけ変更する必要があります(ゲーム内の木の数とは対照的に)。

/** Find the first Trees that was hit by the player.
  * Note that the loop will quit early once a collision is found. */
private function getHitTrees():Trees {
    for each (var trees:Trees in treesArray) {
        if (player.hitTestObject(trees)) {
            return trees;
        }
    }
    return null;
}

private function checkCollisions():void {
    var hitTrees:Trees = getHitTrees();

    if (hitTrees) { stopThePlayer(hitTrees); }
    else { letThePlayerMoveOn(); }
}

これにより、コードを関数名の付いた小さなチャンクに分割して、そこで何が起こっているのかを正確に伝えることで、コードを読みやすくすることもできます。ネストが多い1つの大きな関数とは対照的です。

ところで:そのトリックを教えてくれた人は誰でも:switch(true)彼を狂わせてください。それは完全に読めません。

于 2011-06-11T22:21:32.460 に答える