0

ここに私の問題があります。説明するのに少し時間がかかります。

クラスでは、AS3でアーケードゲームを開発していました。大学にはアーケードマシンがあり、マシン上のOSは教師によって開発され、ソフトウェア開発者キットを提供しています。クレイジーなことは何もないので、ほとんどはかなり単純です。主に、ENTER_FRAMEイベントとループ関数Imの代わりに、SDKがフレームごとに更新を実行するために提供するupdate()と呼ばれるオーバーライド関数を使用しているため、これを指摘したいと思います。

さて、これが私の問題です。GameStateというドキュメントクラスがあり、これは基本的にその状態でゲームを処理します。このクラスでは、世界とキャラクターを設定します。現在、その山は2つ、城は2つ、島は3つ、そしてキャラクターです。

private function initWorld():void
    {
        trace("World has initiated");
        addChild(hazardArea)
        positionElement(hazardArea, 0, 560);

        addChild(mountainSideRight);
        positionElement(mountainSideRight, 730, 200)

        addChild(mountainSideLeft);
        positionElement(mountainSideLeft, 0, 200);

        addChild(castleOne);
        positionElement(castleOne, 5, 160);

        addChild(castleTwo);
        positionElement(castleTwo, 765, 160);

        addIslands();
    }

位置要素は、ステージに追加されたMCiのx座標とy座標を設定する関数です。また、AddChildにオーバーライドを作成して、ステージに子を追加するたびに、後でアクセスできる配列に子を保存できるようにしました。

override public function addChild(object:*):void
    {
        super.addChild(object);
        worldObjects.push(object);
    }

OKと3つの島は、次のようなaddIslandを介して追加されます。

private function addIslands():void
    {
        var island:Array = Islands.getIslandCords();
        for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++) 
        {
            addChild(island[x].mc);
            positionElement(island[x].mc, island[x].x, island[x].y);

        }
    }

島は、数学などを使って3つの島の位置を見つけるクラスです...返される配列は、moveclipのインスタンスとxおよびy座標を含む3つのオブジェクトだけです。それのための。

また、ドワーフ(ゲーム内のキャラクター)を表す別のキャラクタークラスもあります。私がこのような重力システムを持っていることを除いて、クラスには何も奇妙なことはありません:

var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;

次に、前述のupdate()関数はEVENT_FRAMEループのように機能し、次のようになります。

public function update():void
{
    xSpeed *= friction;
    moveX += xSpeed;
    moveY += ySpeed
    theDwarf.y += gravity;

    this.x = moveX;
    this.y = moveY;

    updateControls();
}

theDwarfは私のドワーフムービークリップのインスタンスであり、updateControlsは私のドワーフが動き回る機能を提供します。

わかりました...最後に、update()関数の下のGameStateクラスで、衝突クラスを呼び出し、シーンからのすべてのオブジェクトを含む配列をそのクラスに渡します。このクラスでは、衝突をチェックします。

public function checkCollision(listOfObjects:Vector.<MovieClip>):void
    {   

        for (var i:int = 0; i < worldObjects.length; i++) {
            if(worldObjects[i] is Player){

                var objOne:MovieClip = worldObjects[i];             
                for (var j:int = 0; j < worldObjects.length; j++){
                    if (j == i){
                        // elimates self comparisons.
                    }
                    else{
                        var objTwo:MovieClip = worldObjects[j];
                        checkIntersect(objOne, objTwo )
                    }
                }
            }
        }
    }

private function checkIntersect(player:MovieClip, objTwo:MovieClip):void
    {
        if(player.hitTestObject(objTwo)){
            player.ySpeed = -1;
        }
        else{
            player.ySpeed = 2;
        }
    }

そして私の問題はこれです:この関数はステージ上のすべてのオブジェクトに対して私のプレーヤーをチェックします。したがって、私のドワーフが1つの島に着陸したとしても、他の2つの島に当たらないため、ySpeedは2にリセットされ続けます。elseステートメントを削除すると、ドワーフの重力が2に戻されることはなく、彼は再び落下することはありません。私はこれに対する解決策を見つけることができません...私はこれを回避する方法を見つけるために一生懸命努力しました、そして私はとても困惑しています...私は私の島の1つまたは山にいない限り私の小人を倒したいと思います。私の問題を説明するのに十分明確になったことを願っています。これは今や巨大な投稿になっています...:Dありがとうございます!

4

1 に答える 1

0

以前からの私のコメントをよりよく説明するために、これらの最後の2つの関数を次のように変更する必要があります。

public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{   

   OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
        if(worldObjects[i] is Player){

            var objOne:MovieClip = worldObjects[i];             
            for (var j:int = 0; j < worldObjects.length; j++){
                if (j == i){
                    // elimates self comparisons.
                }
                else{
                    var objTwo:MovieClip = worldObjects[j];
                    player.ySpeed = checkIntersect(objOne, objTwo )
                    if (player.ySpeed == -1)
                        break OuterLoop;
                }
            }
        }
    }
}

private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
    if(player.hitTestObject(objTwo)){
        return -1;
    }
    else{
        return 2;
    }
}

これは、より良い方法で行うこともできます。しかし、これはあなたの問題に対する最も速い解決策です。

于 2013-02-21T10:52:15.260 に答える