3

Actionscript コードに問題があります。私は Flash と AS3 にかなり慣れていないので、私のコードが粗野で初歩的なものに見える場合は申し訳ありませんが、できる限り最善を尽くしています。

さて、このプロジェクトでは、弾丸を壁に 1 回跳ね返させようとしています。跳ね返った後、再び壁にぶつかると弾丸は消えます。

箇条書きを配列で移動する for ループを作成しました。同時に、各弾丸の個々の跳弾数を追跡するようにしています。これは、最初の弾丸を撃ったときにうまく機能します。弾丸は跳ね返り、別の壁にぶつかると消えます。ただし、その後に発射するすべての弾丸は、跳ね返る前に、最初にぶつかった壁で消えます。これを機能させようとしましたが、できないようです。

誰かが私に問題を示してくれたり、コードの変更を提案してくれたりするとありがたいです。 これが私のコードへのリンクです。

助けてくれた人に感謝します。

4

2 に答える 2

1

あなたのコードには少なくともいくつかの問題があります。

  1. あなたricochetcountは明らかに同期していません。つまり、その配列からも要素を削除する必要があります。
  2. bulletholder配列から要素を ( 経由で)削除すると、clearBulletまだインクリメントiされているため、うっかり要素をスキップしてしまうことになります。

また、なぜ必要なのかわかりませんclearBullet()iメイン ループのすぐそこに、弾丸オブジェクトへのインデックスと参照が既にあります。

于 2012-02-28T11:08:13.367 に答える
1

ここに私が持っているいくつかの提案があります:

1:Bullet壁に対する独自の衝突を追跡するクラスを作成します。clearBullet()また、メソッドを bullet クラス自体に移動します。

public class Bullet extends Sprite
{

    public var collisions:int = 0;
    public var xv:Number = 0;
    public var yv:Number = 0;


    public function clear():void
    {
        if(parent)
            parent.removeChild(this);
    }

}

2:この新しい情報に対処するためにループを更新します。

for each(var i:Bullet in bulletholder)
{
    // Move bullet.
    // Check for collision.

    // When there is a collision, do this:
    i.collisions ++;

    if(i.collisions >= 2)
    {
        var n:int = bulletholder.indexOf(i);
        bulletholder.splice(n, 1);

        i.clear();
    }
    else
    {
        // Deal with changing bullet position.
    }
}
于 2012-02-28T06:09:42.010 に答える