1

垂直 2D シューティング ゲームのチュートリアルに従って、学んだことでゲームを拡張しています。

キーボードコントロールはすでに提供されていましたが、説明が不足しているため、いくつかの問題があります。

解決済み (2 番目の回答を参照) 1-船の制御は矢印キーで行い、SPACE を使用して弾丸を発射しました (X/fps に制限)

船を上/下/左/右および斜め上/右に制御することは、スペースが同時に押されている (または保持されている) 場合を除き、正常に機能します。

この問題は、SHIFT や CONTROL などの SPACE を変更することで回避できます。これにより、ファイアキーが押されたときにすべての方向に斜めに移動できるようになります。

なぜこれが起こっているのか、そして通常の射撃にスペースを使用してこれを解決できるかどうかを本当に知りたいです

解決済みこの投稿の最後に編集を参照してください2-ゲーム内でアップグレードを追加して、ミサイルを船に追加しました。通常の弾丸とは発射速度が異なるため、ミサイルを発射するために別のキーを使用したいと考えています。

弾丸(現在はSHIFT)とミサイル(現在はCONTROL)を同時に発射できないことを除いて、別のキーでミサイルを追加すると(以下のコード例のように)機能しました

両方を起動するために異なるキーを押し続ける方法はありますか?

3-サンプルコードでキーの定数名をキーコードに変更できますか?

下手な英語でごめんなさい

私のキークラス AS3:

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

public class Key {

    private static var initialized:Boolean = false;
    private static var keysDown:Object = new Object();  // stores key codes of all keys pressed

    public static function initialize(stage:Stage) {
        if (!initialized) {
            // assign listeners for key presses and deactivation of the player
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
            stage.addEventListener(Event.DEACTIVATE, clearKeys);

            // mark initialization as true so redundant
            // calls do not reassign the event handlers
            initialized = true;
        }
    }


    public static function isDown(keyCode:uint):Boolean 
    {
        return Boolean(keyCode in keysDown);
    }


    private static function keyPressed(event:KeyboardEvent):void {
        keysDown[event.keyCode] = true;
    }


    private static function keyReleased(event:KeyboardEvent):void {
        if (event.keyCode in keysDown) {
            delete keysDown[event.keyCode];
        }
    }


    private static function clearKeys(event:Event):void {
        // clear all keys in keysDown since the player cannot detect keys being pressed or released when not focused
        keysDown = new Object();
    }
}

}

移動と射撃を処理する私の船のクラスのコードの部分:

    function move(e:Event) {


        if (Key.isDown(Keyboard.RIGHT)) {
            this.x = this.x + velocity;
        }
        if (Key.isDown(Keyboard.LEFT)) {
            this.x = this.x - velocity;
        }
        if (Key.isDown(Keyboard.UP)) {
            this.y = this.y - velocity;
        }
        if (Key.isDown(Keyboard.DOWN)) {
            this.y = this.y + velocity;
        }
        if (Key.isDown(Keyboard.CONTROL)&& shootLimiter > 50 ) {
            {
                            shootLimiter = 0;
            var b = new Missile();
            stage.addChild(b);
            b.x = this.x;
            b.y = this.y -28;
            }

        }
        if (Key.isDown(Keyboard.SHIFT)&& shootLimiter > 20 ) {
            shootLimiter = 0;               
            var a = new Bullet();
            stage.addChild(a);
            a.x = this.x;
            a.y = this.y -28;
        }

    }

編集: Sjeesh私は今、自分の質問を何日もいじくり回してここに投稿した後、自分で最大の問題(No.2)の解決策を見つけました:

ENTERFRAME イベントで、shootlimiter 変数 +1 に追加する 1 行のコードを見落としているようです。

Bullet と Missile の MOVE イベントで異なる値でこの shotlimiter 変数を試すと、そのうちの 1 つだけが一度に機能しました。

私は基本的に、シュートリミッター変数のロジック全体をコピーし、現在ミサイルに使用されているミサイルリミッターとして追加しました

CONTROL と SHIFT を同時に押すと、両方を発射できるようになりましたが、弾丸とミサイルの両方が SHIFT を押すと一緒に発射するように変更しましたが、レートは異なります

SPACE に関する問題と、それを押したときの対角線の動きの制限は小さな問題であり、定数名の代わりにキーコードを使用することについても、良い情報を見つけましたが、答えはそれほど重要ではないようですが、2 つの質問を開いたままにしますもう

4

2 に答える 2

0

キー イベント処理コードを書き直す必要があります。必要なキーイベントを取得したら、フラグ(変数)を設定するだけです。たとえば、isUp = true です。フレームのすべてのキー イベントを取得したら、これらすべてのフラグを 1 か所で処理できます。つまり、プレーヤーが上と左を押した場合、isUp=true と isLeft=true に設定します。さらにエンター フレームで、船を上下左右に動かすことができます (斜め移動)。

于 2013-09-06T13:38:54.283 に答える