0

シンプルなフラッシュゲームを作っています。gotoAndStop() を使用した後、アニメーションが永遠にループするという問題があり、アニメーション中にキャラクターが地面またはステージと衝突した場合にラグが発生します (空中を飛んでいるキャラクターにラグがない場合)

衝突リストは次のとおりです。

var myCollisionList:CollisionList = new CollisionList(Hero);
myCollisionList.addItem(ground);
myCollisionList.addItem(ground3);
myCollisionList.addItem(ground5);
myCollisionList.addItem(ground4);

そして、これがアニメーションでジャンプするコードの私の部分です。

if(Hero.y_speed>0 && myCollisionList.checkCollisions().length > 0 )
{
    Hero.y_speed=0;
    Hero.x_speed=0;

    if(space)
    {
        if (ground.hitTestPoint(Hero.x + 28, Hero.y+20, true))
        {
            Hero.gotoAndStop("attack");
            stop();
            Hero.y_speed = -20;
        }
    }
}

更新: マップのスクリーンショット:

地図

更新 2:

これは、キャラクターを左側 (右側と同じ) 側に移動するためのコードの一部です。ひどいことはわかっていますが、改善する方法はわかりません。

pakopos - CollisionList の名前

fonas - 背景

    var pakopos:CollisionList = new CollisionList(Hero);
    pakopos.addItem(ground);
    pakopos.addItem(ground3);
    pakopos.addItem(ground5);
    pakopos.addItem(ground4);

if(left){

    Hero.x_speed = -walkspeed;

    setDirection(1);

    if(pakopos.checkCollisions().length > 0) {

    if (ground5.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {                  
        trace("Touching left side - ground5");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (Enemy.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching Enemy");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (ground3.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching left side - ground3");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
        }
    else if (ground4.hitTestPoint(Hero.x - 26, Hero.y-120, true)) {
        trace("Touching left side - ground4");
        ground5.x += 0;
        ground4.x += 0;
        ground3.x += 0;
        fonas.x += 0;
        Enemy.x += 0;
    }else
    {
        Hero.x_speed = 0; 
        ground5.x += 4;
        ground4.x += 4;
        ground3.x += 4;
        fonas.x += 4;
        Enemy.x += 4;

    }}
    else {
        ground5.x += 4;
        ground4.x += 4;
        ground3.x += 4;
        fonas.x += 4;
        Enemy.x += 4;

    }}
4

1 に答える 1

0

あなたのコードは非常に不可解なので、実際にデバッグしないと何が起こっているのかを言うのは難しいですが、投稿されたコードが実行されるたびに衝突を複数回チェックしていると思います。checkCollisions()結果の配列を返すように見えるため、使用する関数のドキュメントを確認する必要があります。hitTestPoint()衝突リスト内のオブジェクト間で見つかったすべての衝突が表示される可能性が高いため、後で直接呼び出す必要はありません。

編集

コードで使用している CDK には詳しくありませんが、衝突結果の配列を返します。各結果には、衝突するオブジェクト、それらの角度、およびそれらが重なっている場合があります。あなたがやろうとしていることはやり過ぎのように思えますが、私が言ったように、私はそれに慣れていませんhitTestPoint().

1 つのヒット テスト方法のみを使用することをお勧めします。CDK を使用するかhitTestPoint()、両方を使用することはできません。両方とも、ピクセル パーフェクトな検出結果が得られます。CDK を使用する場合は、仕組みに関するドキュメントをお読みくださいcheckCollisions()。次のようにする必要があります。

...
var oResults:Array = pakopos.checkCollisions();
var nCount:int = oResults.length;

if (nCount > 0)
{
    for ( var i:int = 0; i <nCount; i++ )
    {
        var oHit:Object = oResults[i];

        // TODO check `oHit.object1` and `oHit.object2` to see which objects
        // collided and do something based on that
        // You may have multiple results since your hero may collide with
        // 'ground' and 'ground4' at the same time.
    }
}

CDKの衝突グループ ( pakopos) の設定がオフになっているようです - グループ内のすべてのオブジェクト間に衝突があるかどうかを判断する必要はありません - がground衝突しても気にしないと思いground4ますが、衝突リストに両方を追加しました.

checkCollisions()グループ内のすべてのオブジェクトを他のすべてのオブジェクトに対してチェックしようとする(確かではありません)と思います。必要なのはHero、オブジェクトのリスト (さまざまな地上オブジェクト) に対して 1 つのオブジェクト ( ) をチェックすることです。これは、チェック数の大きな違いです。これと追加の への呼び出しによりhitTestPoint()、ラグは簡単に説明できます。

于 2013-09-18T23:24:50.357 に答える