高度なJavaゲームでキー/マウス入力をどのようにすべきですか?


9

私は独学のプログラマなので、適切な方法がわかりません。小惑星やヘビのような単純なゲームを作成しましたが、これらのゲームでは、キーイベント関数内の変数を簡単に変更できます。ここに私が私の簡単な小惑星ゲームでそれをした方法があります:

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

より高度なゲーム(メインメニュー、オプション、メインゲームなど)を作成する場合、キー/マウス入力をどのように行う必要がありますか?

また、シングルプレイヤーに入る場合、すべてのゲームプレイコードを1つのクラスに入れる必要がありますか?シングルプレーヤーのコードを別のクラスに配置し、キー入力で変数などを変更する方法はありますか?


+1あなたの答えにより、bearcdpの答えから何か新しいことを学ぶことができました。質問してくれてありがとう!=)
Marcouiller氏、2011年

回答:


3

私は専門家ではありませんが、コントロールとビジネス/ゲーム/メニュー(名前を付ける)ロジックの両方を分離することをお勧めします。

クラスで設計されたゲームでヘビに指示を与えることに関して、私はすでに同様の質問に答えました。Javaはオブジェクト指向言語なので、適切なクラスやものを書くことができると思います。次に、オブジェクトクラスを記述したときに、オブジェクトがいくつかのキーとマウスクリックに反応する必要がある場合は、現在画面に表示されているものを認識しているコントローラークラスを使用して、このオブジェクトに何をすべきかを伝えます押されたキーまたはクリックされた領域に応じて行います。

これは、オブジェクトロジックからコントロールを分離することについて私が答えた、あなたへの質問へのリンクです。また、私の考えを示すコードサンプルも含まれています。

クラスを使用してXNAでスプライトを移動する

残念ながら、OPはまだ回答を受け入れていないため、彼の懸念が解決されたかどうかはわかりません。さらに、私は常にこの方法で設計しており、これまでのところ問題はありませんでした。

XNAとタグ付けされています。アイデアまたはデザインは、使用されるテクノロジーよりも高いアーキテクチャレベルであるため、このデザインはJava構文に単純に適合させることができます。一般的な考え方は変わりません。=)

これが役に立てば幸いです!できる限りサポートさせていただきますので、お気軽にお問い合わせください。=)


5

ウィルの答えは、おそらく最も柔軟で簡単なものを示しているので、必要なものが直接的な入力ポーリングである場合は、これをお勧めします。

ただし、大量のスイッチとifステートメントを避けながら、ボタンを押すさまざまな組み合わせを簡単に確認する方法が必要な場合は、ビットフラグ列挙型を使用できます。

私はビットベクトルについて知っていることは知りません。そのため、ここで概要を説明します。基本的に、すべての可能なキーを表す列挙型クラスがあります。各列挙型には、整数のビットに対応する値が必要です。(例:0x0001、0x0002、0x0004、0x0008、0x0010、0x0011、0x0012、0x0014など)。(Javaでこれを行うためのリンク)。

これで、最大32個(longを使用する場合は64個)のキーに関する情報を渡すことができるため、ビットベクトル(intまたはlong)を何らかのオブジェクトを含むオブジェクトに関連付けられたハッシュテーブルを作成できます。関連付けられているキーの組み合わせが押されたときに呼び出される単一のメソッド呼び出しDo()。

これで、プレーヤーオブジェクトまたはメニューオブジェクトをインスタンス化/初期化するときに、ある種の入力マネージャーを呼び出し、必要なすべてのキーの組み合わせのビットベクトルを渡して、匿名の内部クラスに関連付けることができます。

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(), 
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

これはC ++とC#では非常に迅速で便利ですが、Java列挙型は特別なので、列挙型を気にせずにKeyCombinationクラスなどの情報をすべて格納できるものを作成すると便利です。しかし、考え方は同じです。私はこれをXNAゲームで使用していますが、この機能はとても気に入っています。また、入力領域を分離するために使用することもできます。これは、キーボードまたはゲームパッドの異なる部分を個別に比較するのに役立ちます(1つのキーボードで2人のプレーヤーが演奏する場合に役立つことがあります)。


私はあなたの投稿、特に「this.DoCrazyAwesomeComboAttack();」が気に入っています。XD。あなたの道は複雑なもののためのより良い方法のようですので、私はより簡単なものに固執するつもりです。ご協力ありがとうございました!
Steven Rogers

+1非常に興味深い回答です。私はこの答えから学んだので、趣味のゲーム開発にもっと時間を費やす時間があれば、それを見ていきましょう。そして、私がGDの初心者なので、私が論じることはない、より単純なものに対するものですが、私の答えは良いと言ってくれてありがとう。=)ありがとう!
Marcouiller氏、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.