2

私は Flash Actionscript 3.0 プログラミングの初心者です。ゲームでプレイヤーの動きを滑らかにするキーボード コントロールを作成しようとしています。

私は現在 addEventListener(KeyboardEvent.KEY_DOWN) を使用してキーボードのキーの押下をリッスンし、ハンドラー関数内で .x または .y プロパティに数値を追加してグラフィックを移動しています。

これにより、最初はゆっくりとした鈍いジャークが作成されます。これを行うためのよりスムーズで応答性の高い方法があることは知っていますが、どこから始めればよいかわかりません。どんな助けでも大歓迎です!

4

3 に答える 3

2

スムーズなキーの場合、Timer または onEnterFrame を使用して、スムーズなコントロールを得るのに十分な頻度でキーをポーリングすることをお勧めします。それは仕事を成し遂げますが、一定の費用がかかります。残りのロジックがすべてうまくいっている場合、これは問題なく収まるはずです。

var key:int = NaN;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true);
this.addEventListener(Event.ENTER_FRAME,update,false,0,true);

function onKeyPress(event:KeyboardEvent):void {
    key = event.keyCode;
    event.stopPropagation();
}
function onKeyRelease(event:KeyboardEvent):void {
    key = NaN;
    event.stopPropagation();
}
function update(event:Event):void{
    if(key) trace(key);
}

イベントの伝播を止めることでイベントが泡立たないようにし、イベントに関しては最上位レベルである必要があるステージに設定します。また、キーが押されているキーのみを使用しています。それ以外の場合は、enterFrame ハンドラーで無視します。

HTH、ジョージ

于 2010-02-12T22:32:29.767 に答える
0

リスナーをどこに配置しますか?それはアプリケーション内ですか、それとも移動するはずのスプライト内ですか? キーを押しているときにスプライトにフォーカスがありますか?

また、イベントリスナーを追加する際に、キャプチャを使用していますか? つまり、次のように 3 番目の引数を true に設定していますか?

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)

アプリ自体がイベントをリッスンしている場合に必要な方法であるキャプチャを使用すると、一定量の遅延が発生します。この遅延は、インターフェイスが複雑になるほど大きくなります。これらのイベントが膨大な階層を上っていく必要がある場合、これは目立つ可能性があります。スプライトが多数ある場合、問題が悪化する可能性があります。

できることは、フォーカスを持つスプライトに、コントローラ クラスが各スプライトをリッスンするカスタム イベントをディスパッチさせることです。コントローラー クラスには、event.currentTarget を移動するハンドラーがありますが、実行する予定です。

また、カスタム イベントと、SystemManager を使用してリスナーを動的に追加および削除する方法についてもお読みください: http://livedocs.adobe.com/flex/3/langref/index.html

于 2010-02-12T22:05:42.643 に答える
0

これに対する最も単純な例はこれです。
ここには、制御可能な Ship クラス (Ship.as) があります。

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

public class Ship extends MovieClip {

    private var speedX;
    private var speedY;

    public function Ship() {
        //constructor
        stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp);
        stage.addEventListener(Event.ENTER_FRAME, update);
    }

    public function keyDown(e:KeyboardEvent) {
        if(e.keyCode == 37) {
            speedX = -5;
        }
        if(e.keyCode == 38) {
            speedY = -5;
        }
        if(e.keyCode == 39) {
            speedX = 5;
        }
        if(e.keyCode == 40) {
            speedY = 5;
        }
    }

    public function keyUp(e:KeyboardEvent) {
        if(e.keyCode == 37 || e.keyCode == 39) {
            speedX = 0;
        }
        if(e.keyCode == 38 || e.keyCode == 40) {
            speedY = 0;
        }
    }

    public function update(e:Event) {
        x += speedX;
        y += speedY;
    }

}
于 2015-09-06T12:51:02.563 に答える