0

プラットフォームゲームを作っています。現時点では、重力とプラットフォームを作成しようとしています。グラビティ ダウン パットを取得しましたが、私のキャラクター (プレイヤー) がプラットフォームに衝突すると、すぐに画面上部に戻って再び落下し、プレイヤーがプラットフォームに触れるたびに繰り返されます。これが私のコードです:

package  {

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.ui.Keyboard;


public class GameCode extends MovieClip {

    var upKey:Boolean;
    var leftKey:Boolean;
    var rightKey:Boolean;
    var jump:Boolean = false;

    var xvelocity:int = 10;
    var yvelocity:int = 0;
    var gravity:Number = 7;

    var startPosY:int;
    var startPosX:int;
    var lastPosY:int;
    var lastPosX:int;

    public function GameCode() {
        // constructor code
    }

    public function startGame(){
        stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyUp);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);
        stage.addEventListener(Event.ENTER_FRAME, update);
    }

    function update(evt:Event){
        moveCharacter();
        yvelocity += gravity;

        for (var i:int = 0; i < 10; i++){
            if (!platform.hitTestObject(player)){
                player.y = yvelocity;
            }
            if (platform.hitTestObject(player)){
                yvelocity = 0;
                player.y--;
            }
        }
    }

    function moveCharacter(){
        lastPosY = player.y;
        lastPosX = player.x;

        if (leftKey == true){
            player.x -= xvelocity;
        }
        if (rightKey == true){
            player.x += xvelocity;
        }
        if (upKey == true){
            if (jump == true){
                player.y
            }
        }
    }

    function checkKeyDown(evt:KeyboardEvent){
        if (evt.keyCode == Keyboard.LEFT){
            leftKey = true;
        }
        else if (evt.keyCode == Keyboard.RIGHT){
            rightKey = true;
        }
        else if (evt.keyCode == Keyboard.UP){
            upKey = true;
        }
    }

    function checkKeyUp(evt:KeyboardEvent){
        if (evt.keyCode == Keyboard.LEFT){
            leftKey = false;
        }
        else if (evt.keyCode == Keyboard.RIGHT){
            rightKey = false;
        }
        else if (evt.keyCode == Keyboard.UP){
            upKey = false;
        }
    }
}

}

キャラクターのインスタンス名は player で、プラットフォームのインスタンスは単なる platform です。明らかに、これを変更する方法について助けが必要です。私が望むのは、キャラクターが重力で落下し、プラットフォームに着陸し、動き回ることができ、落下するとキャラクターが底に落ちることです.

4

1 に答える 1

0

問題はここにあると思います:

for (var i:int = 0; i < 10; i++){
    if (!platform.hitTestObject(player)){
        player.y = yvelocity;  // if yvelocity == 0, then so will the player's y
    }
    if (platform.hitTestObject(player)){
        yvelocity = 0;
        player.y--;
    }
}

各プラットフォームで衝突をチェックし、衝突が発生した場合はそれに応じて処理し、ループから抜け出す必要があります。

ループの前に、yvelocity によって player.y をインクリメントする必要があります。

player.y += yvelocity;

衝突の場合、プレーヤーの足がプラットフォームに立つように player.y を設定する必要があります。プラットフォームの原点がプラットフォームの左上にあり、player.y がプレーヤーの足のレベルであると仮定すると、次のようになります。

player.y = platform.y - 1;

これをコード化することはしませんが、ロジックが役立つはずです。

また、この実装では、身体のどの部分がプラットフォームと衝突しているかを考慮していないことにも注意してください。そのため、プレーヤーがジャンプして頭がプラットフォームに衝突した場合、彼はプラットフォームの上部に飛び出します.

また、プレーヤーが落下中に左右に移動でき、体の両側でブロックに移動できる場合、プラットフォームの上部に飛び出します。

これらの概念のいくつかは、解決策を含めてより詳細に議論される可能性が高いため、「as3プラットフォームゲームチュートリアル」またはその性質のものをグーグルで検索する必要があります.

于 2013-11-11T04:05:19.090 に答える