私が取り組んでいるこのプロジェクトでは、キーボード入力に基づいてマップが動き回っている間、プレーヤーは画面の中央に静止したままです。-マップはタイルベースです。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つだけではなく、すべてのブロックを保持するムービークリップ全体のサイズです。Rectangle
Player/Ball
blockArray(i)
blockRect
blockArray
_Level
不思議なことに、衝突/移動スクリプトのforループ中にムービークリップに追加される一種のマーカームービークリップを作成しました。_Level
このムービークリップは、(0,0)の左上隅にあるムービークリップの登録ポイントではなく、常に最初に配置したブロックの登録ポイントにアタッチされ、getRect
コマンドのように見えます。参照。
だから、私の質問は、これは失われた原因なのか、それともこの仕事をするために出し入れできるものがあるのかということです。
そして、私がこのアプローチで時間を無駄にしている場合、これらのアプローチのどれが最も実行可能に聞こえますか?
- 通常の
Array
方法を使用します(newArray = [Block, Block, Block, Lavapit, Block, etc.]
-レベルの構築はGame/Constructor
クラスで完全に処理されます。 - ポイントコリジョンに戻ります。ただし、これが物理ベースのプロジェクトでどれほどうまく機能するかはわかりません。
- それとも、私が知らない別の方法がありますか?
とにかく; 非常に義務的です、すべて!おやすみ/朝/午後/夕方。