1

マップ内を歩くことができないキャラクター、敵、オブジェクトを含むゲームで hitTestPoint を実行する最善の方法を見つけようとしています。

ここで見ることができる動作するバージョンを作成しました: http://www.hosted101.net/hit/mapHitTest.html (移動する矢印キー、あなたは正方形です)。

以前に提案された方法を使用して、マップ上のすべてのオブジェクトのセカンダリ バージョンを作成し、プレーヤーのサイズを半分にして、プレーヤーの centerX と centerY から hitTestPoint を実行しています。

これは素晴らしく、うまく機能します。

ただし、ユーザーがそれらを見ることができなくても、これらすべての余分な「境界ボックス」を作成することは最適ではなく、不要になる可能性があると思います。

ということで、第二弾を作りました。今回は境界ボックスなし: http://www.hosted101.net/hit/mapHitTestNew.html (矢印キーで移動)。

これはまだプレーヤーの centerX と centerY から実行されているため、オブジェクトに近づいても centerX/Y より下にある場合は、そのオブジェクトを通り抜けることができます。

私の質問は次のとおりです。このようなゲームで、オブジェクトとプレイヤー/敵/何かをテストするのに最適な方法は何ですか? (この単純なプロジェクトの固定例があれば素晴らしいでしょう)

追加のバウンディング ボックスを使用してマップ レイヤーの複製を本当に作成しているのか、それともよりクリーンな方法で実行できるのか?

mapHitTestNew の私のコードは以下のとおりです。

ありがとう。

var moveL:Boolean = new Boolean
var moveR:Boolean = new Boolean
var moveU:Boolean = new Boolean
var moveD:Boolean = new Boolean
var moveSpeed:int = 2

stage.addEventListener(KeyboardEvent.KEY_DOWN, updateKeysDown)
stage.addEventListener(KeyboardEvent.KEY_UP, updateKeysUp)

function updateKeysDown(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
    case 37:
    moveL = true;
    break;

    case 38:
    moveU = true;
    break;

    case 39:
    moveR = true;
    break;

    case 40:
    moveD = true;
    break;
}
collisionCheck()
}

function updateKeysUp(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
    case 37:
    moveL = false;
    break;

    case 38:
    moveU = false;
    break;

    case 39:
    moveR = false;
    break;

    case 40:
    moveD = false;
    break;
}   
}

/**
***
*** Hit Test
***
***
**/

function collisionCheck():void{
var _MC:MovieClip = new MovieClip;
_MC.x = player.x
_MC.y = player.y
_MC.mouseEnabled = false

var centerX:Number = _MC.x + (player.width/2)
var centerY:Number = _MC.y + (player.height/2)

if(moveL){
    trace("Stage 1 Move")
    centerX -= moveSpeed
    if(map.hitTestPoint((centerX-player.width/2), centerY, true)){
        trace("Stage 1 HIT TEST!")
        moveL = false
    }
}
if(moveR){
    trace("Stage 2 Move")
    centerX += moveSpeed
    if(map.hitTestPoint((centerX+player.width/2), centerY, true)){
        trace("Stage 2 HIT TEST!")
        moveR = false
    }
}
if(moveU){
    trace("Stage 3 Move")
    centerY -= moveSpeed
    if(map.hitTestPoint(centerX, (centerY-player.height/2), true)){
        trace("Stage 3 HIT TEST!")
        moveU = false
    }
}
if(moveD){
    trace("Stage 4 Move")
    centerY += moveSpeed
    if(map.hitTestPoint(centerX, (centerY+player.height/2), true)){
        trace("Stage 4 HIT TEST!")
        moveD = false
    }
}
refreshMovement()
}

function refreshMovement():void{
if(moveL){
    player.x -= moveSpeed
}
if(moveR){
    player.x += moveSpeed
}
if(moveU){
    player.y -= moveSpeed
}
if(moveD){
    player.y += moveSpeed
}
}
4

1 に答える 1

0

ある種のオーバーヘッドビューを実行しているように聞こえます(ボックスがXとYで移動していることを考慮して)。0と1が含まれる2D配列(true / false)があります。キャラクターが動き回るとき、キャラクターのヒットボックスを調べて、キャラクターが占めるタイルを探します。タイルは通常1〜4タイルです。

それらのスポットのいずれかにTRUEがある場合、彼は何かを打っています。このように、アクティブなオブジェクト(移動するなど)のヒットボックスのみが必要です。

また、この記事をチェックして、あなたに最適と思われるソリューションを実装します。

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

于 2012-07-08T08:54:17.180 に答える