私はこの答えを広く探していましたが、オブジェクトが配列ではなく、ステージ上のムービークリップにあるため、質問に対する答えが見つかりませんでした。オブジェクトを使用してキャラクターの動きを制限するために、衝突を引き起こしたオブジェクトを検出しようとしています。下の画像を見ると、すべての茂み、家、その他数十個のオブジェクトがブロック オブジェクトとして使用されます。
ムービークリップの子オブジェクトとの衝突を検出する方法を見つけましたが、どのオブジェクトがこの衝突を起こしているかはわかりません。動きが発生するたびに各オブジェクトをループして、衝突があったかどうかをテストしようとしましたが、ヒットを記録することはありません。
ヒットを登録している現在のコードは次のとおりです。
var background = bGround; // Make reference to the BG in the mainActions
var bgObjects = bGround.bgElements;
//trace(bgObjects.numChildren);
if(bgObjects.hitTestPoint(character.x,character.y,true)) {
trace("character: " + character.x + "," + character.y);
trace("position of hit " + bgObjects.x + "," + bgObjects.y);
}
これは、キーの押下を監視するイベントリスナー内にネストされているため、ボタンを押すたびに、またはユーザーがキャラクターを動かすたびに再テストされます。ヒット テストが発生した後にオブジェクトをループするのが最良のアイデアであると考えました。または、各移動中にループしてそのオブジェクトを特にテストしましたが、どちらも機能しませんでした。ここに 1 つの試みがあります。
for (var i : Number = 0; i < bgObjects.numChildren; i++) {
var instBgElem = bgObjects.getChildAt(i);
if(character.hitTestPoint(instBgElem.x, instBgElem.y, true)) {
// Check X Left
if (character.x < bgObjects.getChildAt(i)).x {
trace("hit left");
}
// Check X right
if ( character.x > bgObjects.getChildAt(i)).x {
trace("hit right");
}
// Check Y top
if ( character.y < bgObjects.getChildAt(i)).y {
trace("hit top");
}
// Check Y Bottom
if ( character.y > bgObjects.getChildAt(i)).y {
trace("hit bottom");
}
}
}
編集: 1 つのコードをある程度機能させることができましたが、実際には、バックグラウンド オブジェクトでヒット テストが発生する場所をテストしていません。各オブジェクトのバウンディング ボックスを見つけて、バウンディング ボックスのどちら側がヒットしているかを把握し、ここですべてのヘルプを受け入れる必要がある場合があります。
for (var i : Number = 0; i < bgObjects.numChildren; i++) {
var instBgElem = bgObjects.getChildAt(i);
if(instBgElem.hitTestPoint(character.x,character.y,true)){
if(instBgElem.x > character.x) {
trace("right");
} else if(instBgElem.x < character.x) {
trace("left");
}
if(instBgElem.y > character.y) {
trace("up");
} else if(instBgElem.y < character.y) {
trace("down");
}
}
}
編集 2:問題は、ヒット テストがキャラクターと接触する場所を特定して、その動きを制限できるようにすることです。その方法がわかりません。バウンディングボックスを試しています。
var charBounding = character.getBounds(this);
trace("character bounding box" + charBounding);
trace("character bottom: " + charBounding.bottom);
trace("character top:" + charBounding.top);
trace("character left:" + charBounding.left);
trace("character right:" + charBounding.right);
それはキャラクターを出力し、キャラクターが動くたびにそれを更新しますが、これをどのように活用するのかわかりません。
文字境界ボックス(x=85.95, y=79.05, w=72.2, h=72.2) 文字下:151.25 文字上:79.05 文字左:85.95 文字右:158.15