0

私が取り組んでいるこのプロジェクトでは、キーボード入力に基づいてマップが動き回っている間、プレーヤーは画面の中央に静止したままです。-マップはタイルベースです。1280x896ピクセルのムービークリップに手動で配置したすべてのタイルは、スクリプトによってこれらの各タイルを配列(blockArray)に配置します。歴史的に、私は常に、ポイントコリジョンを使用するのにそれほど問題なく、親スクリプトと子スクリプト(ムービークリップタイルホルダー)の間でコリジョン情報を渡すことにかなり成功してきました。

-より多くの物理ベースのプロジェクトでは、長方形の衝突(getRectなど)でより多くの成功を収めました。ただし、これらの場合、上記のタイルホルダー/ムービークリップと組み合わせて使用​​したことはありません。

次のコードは、フレームごとに更新されるMoveBall/Playerスクリプトの一部として実行されます。これをテストウィンドウで実行すると、常にプログラムがクラッシュします。おそらく、「for」ループから抜け出せないのでしょうか。

public function moveBall (event:Event)
{
    if (lastTime == 0) lastTime = getTimer();
    var timePassed:int = getTimer() -lastTime;
    lastTime += timePassed;

    var newBallX = _Level.x +ballDX*timePassed; //ballDX = ball direction x
    var newBallY = _Level.x+ballDY*timePassed; //ballDY = ball direction y

    var oldBallRect = new Rectangle(_ball.x-ballRadius, _ball.y-ballRadius, ballRadius*2, ballRadius*2);
    var newBallRect = new Rectangle(newBallX-ballRadius, newBallY-ballRadius, ballRadius*2, ballRadius*2); // These correspond to the actual player, which is stationary and 64x64 pixels.

    for(var i:int=blockArray.length-1;i>=0;i--)
    {
            var theBlock = blockArray[i];
            var blockRect:Rectangle = getRect(theBlock);
            if (blockRect.intersects (newBallRect))
            {
                  //collision treatment here
            }
    }
}

以下は、コンストラクター関数でレベルを構築するために使用しているメソッドです。

public function startGame()
{
         //constructor code
         stage.focus = stage;
        
         if (_Level == null)
         {
                  _Level = new level_obj(); // this Movie Clip, "level_obj",  is where the blocks that are loaded into the blockArray reside.
                  addChild (_Level);
                
                 for (var i:int = _Level.numChildren-1;i>=0;i--) // this "for" Loop loads the blocks from inside the _Level Movieclip into the blockArray
                 {
                           if (_Level.getChildAt(i) is block_obj)
                           {
                                        blockArray.push(_Level.getChildAt(i));
                           }
                 }
}

ここで私が遭遇した主な問題は、が衝突していると思われる特定のブロックのをgetRect(theBlock)取得していないことです- 。私のトレースによると、のサイズは1280x896であり、64x64のブロック「(i)」の1つだけではなく、すべてのブロックを保持するムービークリップ全体のサイズです。RectanglePlayer/BallblockArray(i)blockRectblockArray

_Level不思議なことに、衝突/移動スクリプトのforループ中にムービークリップに追加される一種のマーカームービークリップを作成しました。_Levelこのムービークリップは、(0,0)の左上隅にあるムービークリップの登録ポイントではなく、常に最初に配置したブロックの登録ポイントにアタッチされ、getRectコマンドのように見えます。参照。

だから、私の質問は、これは失われた原因なのか、それともこの仕事をするために出し入れできるものがあるのか​​ということです。

そして、私がこのアプローチで時間を無駄にしている場合、これらのアプローチのどれが最も実行可能に聞こえますか?

  1. 通常のArray方法を使用します(newArray = [Block, Block, Block, Lavapit, Block, etc.]-レベルの構築はGame/Constructorクラスで完全に処理されます。
  2. ポイントコリジョンに戻ります。ただし、これが物理ベースのプロジェクトでどれほどうまく機能するかはわかりません。
  3. それとも、私が知らない別の方法がありますか?

とにかく; 非常に義務的です、すべて!おやすみ/朝/午後/夕方。

4

2 に答える 2

0

Box2d の使用を検討できます。

ボールが飛び回っている場合、タイルベースのゲームとは呼びません。タイルベースは、チェスのように、すべてのオブジェクトの動きが直線と特定の場所にあることを意味します。

于 2012-08-20T09:27:28.473 に答える
0

いくつかの調査を行い、SAT理論からインスピレーションを得て、基本的な衝突システムをゼロから構築しました。

于 2012-08-23T16:04:06.353 に答える