0

だから、私はこのゲームを持っていて、プレーヤーを動かしたいので、キーが押されたときに tick メソッドを使用して、2 つのイベント リスナー、keyup リスナーと tick を作成します。 tick には動きと、私がアニメーションを推定した場所が含まれています。これが私のコードです:

// For every frame //
import flash.events.Event;
import flash.events.TouchEvent;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
var gravity = 0.6;
var floor = 410;
jordan1.y = floor;
jordan1.speedY = floor;
jordan1.impulsion = 10;
var onFloor:Boolean = false;
var keyRight:Boolean = false;
stage.addChild(jordan1);
stage.addChild(leftwall1);
stage.addChild(finish1);
stage.addChildAt(abovedoor, 0);
stage.addChild(left);
stage.addChild(right);
stage.addChild(jump);
addEventListener(Event.ENTER_FRAME, enters);
function enters(e:Event) {
    jordan1.speedY += gravity;
    jordan1.y += jordan1.speedY
    if(jordan1.y > floor) {
        jordan1.speedY = 0;
        jordan1.y = floor;
        onFloor = true;
        if(keyRight == true) {
            jordan1.gotoAndPlay(7);
        }
        if(keyRight == false) {
        jordan1.gotoAndStop(1);
        }
    }
}

function stageup(e:MouseEvent) {
    removeEventListener(Event.ENTER_FRAME,tickleft);
    removeEventListener(Event.ENTER_FRAME,tickright);
    removeEventListener(MouseEvent.MOUSE_UP, stageup);
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, stagedown);
function stagedown(e:MouseEvent) {
    stage.addEventListener(MouseEvent.MOUSE_UP, stageup); 
}



stage.addEventListener(KeyboardEvent.KEY_DOWN, jumpkey);
function jumpkey(e:KeyboardEvent) {
    if(e.keyCode == Keyboard.SPACE) {
       if(onFloor == true)
       {
        jordan1.speedY=-jordan1.impulsion;
        onFloor = false;
        jordan1.gotoAndStop(2);
       }
       }
    }

stage.addEventListener(KeyboardEvent.KEY_DOWN, leftkey);
function leftkey(e:KeyboardEvent) {
if(e.keyCode == Keyboard.LEFT) {
    addEventListener(Event.ENTER_FRAME, leftkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, leftkeydown);



}
}
function leftkeydown(e:KeyboardEvent) {
    removeEventListener(Event.ENTER_FRAME, leftkeytick);
    stage.removeEventListener(KeyboardEvent.KEY_UP, leftkeydown);

}
function leftkeytick(e:Event) {
    jordan1.x-=10;
        if(onFloor == true) {
    jordan1.gotoAndStop(3);
    }
    if(onFloor == false) {
        jordan1.gotoAndStop(6);
    }

}





stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey);
function rightkey(e:KeyboardEvent) {
if(e.keyCode == Keyboard.RIGHT) {
    keyRight == true;
    addEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
}
function rightkeydown(e:KeyboardEvent) {
    removeEventListener(Event.ENTER_FRAME, rightkeytick);
    keyRight == false;
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
function rightkeytick(e:Event) {
    jordan1.x+=10;
    if(onFloor == true) {
    jordan1.gotoAndPlay(7);
    }
    if(onFloor == false) {
        jordan1.gotoAndStop(5);
    }
}

// Just for this frame //
leftwall1.addEventListener(Event.ENTER_FRAME, leftwall1hit);
function leftwall1hit(e:Event) {
    if(leftwall1.hitTestObject(jordan1)) {
        jordan1.x +=10;
    }
}

abovedoor.addEventListener(Event.ENTER_FRAME, abovedoorhit);
function abovedoorhit(e:Event) {
    if(abovedoor.hitTestObject(jordan1)) {
        jordan1.x-=10;
    }
}

jordan1.addEventListener(Event.ENTER_FRAME, finish1hit);
function finish1hit(e:Event) {
    if(jordan1.x > 960) {
        gotoAndStop(67);

    }
}

そのため、テストしてキーダウンすると、再生されずに 7 で停止します。助けてください! ありがとうございました!

4

1 に答える 1

0

gotoティックに含めないでください。そうしないと、フレームごとに実行されます。これは、フレーム 7 にとどまっている理由を説明しています。

代わりにそれらをKEY_DOWNリスナーに入れます:

animated = false;
stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey);
function rightkey(e:KeyboardEvent) {
  if(e.keyCode == Keyboard.RIGHT) {
    if(onFloor == true && !animated) {
       jordan1.gotoAndPlay(7);
    }
    if(onFloor == false && !animated) {
        jordan1.gotoAndStop(5);
    }
    animated = true;
    addEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown);
  }
}
function rightkeydown(e:KeyboardEvent) {
    animated = false;
    removeEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
function rightkeytick(e:Event) {
    jordan1.x+=10;
}

ただし、keydown イベントで tick 関数を使用しないでください。

KEY_DOWN/a キーを押している間、フレームごとに呼び出されます。

ロジックを変更できない場合 (達成したいことには適していません)、ハンドラーにフラグを立てることができます。聞いているキーごとにブール値を持つことによって。そして、ティックで、どのキーが押されているかに応じて必要なことを行います。

keyRight = false;
keyLeft = false;
//... same for all your keys.
// or you could store them in one object for a more dynamic solution.

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
stage.addEventListener(Event.ENTER_FRAME,tick);

function keyDown(e:KeyboardEvent){
    if(e.keyCode === Keyboard.RIGHT && !keyRight){
        keyRight = true;
    }
    else if(e.keyCode === Keyboard.LEFT && !keyLeft){
        keyLeft = true;
    }
    //... same for all your keys.
}

function keyUp(e:KeyboardEvent){
    if(e.keyCode === Keyboard.RIGHT){
        keyRight = false;
    }
    else if(e.keyCode === Keyboard.LEFT){
        keyLeft = false;
    }
    //... same for all your keys.
}

function tick(e:Event){
     if(keyRight) jordan1.x += 10;
     if(keyLeft) jordan1.x -= 10;
     //... etc for all your keys.
}

この他の質問KEY_DOWNは、複数の主題をかなりうまくカバーしています。

于 2013-02-10T20:18:23.017 に答える