Wie soll ich die Schlüssel- / Mauseingabe in einem fortgeschrittenen Java-Spiel haben?

9

Ich bin ein autodidaktischer Programmierer, daher kenne ich die richtigen Methoden nicht. Ich habe einfache Spiele wie Asteroiden und Schlange gemacht, aber in diesen Spielen können Sie die Variablen innerhalb der Keyevent-Funktionen leicht ändern. So habe ich es in meinem einfachen Asteroids-Spiel gemacht:

/*
* 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;
    }
}

Wie sollte ich die Tasten- / Mauseingabe vornehmen, wenn ich ein fortgeschritteneres Spiel erstellen möchte (mit einem Hauptmenü, Optionen, Hauptspiel usw.)?

Wenn ich in den Einzelspieler-Modus wechseln sollte, sollte ich dann den gesamten Gameplay-Code in eine Klasse einteilen? Gibt es eine Möglichkeit, den Einzelspieler-Code in eine separate Klasse einzuteilen und die Schlüsseleingabe die Variablen und dergleichen noch zu ändern?

Steven Rogers
quelle
+1 Ihre Antwort hat es mir ermöglicht, etwas Neues aus der Antwort von bearcdp zu lernen. Danke für die Frage! =)
Will Marcouiller

Antworten:

3

Ich bin kein Experte und schlage dennoch vor, sowohl die Steuerelemente als auch die Logik für Geschäft / Spiel / Menü (Name it) zu trennen.

Ich habe bereits eine ähnliche Frage in Bezug auf die Anweisung einer Schlange in einem Spiel mit Klassen beantwortet. Da Java eine objektorientierte Sprache ist, können Sie wahrscheinlich angemessene Klassen und Dinge schreiben. Wenn Sie dann Ihre Objektklasse geschrieben haben und Ihr Objekt auf einige Tasten und Mausklicks reagieren muss, würde ich eine Controller-Klasse verwenden, die weiß, was aktuell auf dem Bildschirm angezeigt wird, und diesem Objekt dann mitteilen, was es soll Dies hängt von der Taste ab, die gedrückt wurde, oder von der Region, auf die geklickt wurde.

Hier ist der Link zu der Frage, die ich Ihnen zum Trennen der Steuerelemente von der Objektlogik beantwortet habe. Es enthält auch ein Codebeispiel, das meine Gedanken veranschaulicht.

Verschieben meines Sprites in XNA mithilfe von Klassen

( Leider wurde noch keine Antwort vom OP akzeptiert, daher wissen wir nicht genau, ob es seine Bedenken gelöst hat. Außerdem entwerfe ich immer so und habe bisher keine Probleme damit gefunden. )

Jetzt weiß ich, dass es mit XNA markiert ist. Die Idee oder das Design hat eine höhere Architekturstufe als die verwendete Technologie, sodass dieses Design einfach an die Java-Syntax angepasst werden kann. Die allgemeine Idee bleibt dieselbe. =)

Ich hoffe das hilft! Ich helfe Ihnen gerne weiter, wenn ich kann, fragen Sie einfach! =)

Will Marcouiller
quelle
5

Wills Antwort zeigt Ihnen, was wahrscheinlich am flexibelsten und unkompliziertesten ist, und ich würde es empfehlen, wenn Sie eine direkte Eingabeabfrage benötigen.

Wenn Sie jedoch eine einfache Möglichkeit benötigen, nach verschiedenen Kombinationen von Tastendrücken zu suchen und dabei große Mengen an Schaltern und if-Anweisungen zu vermeiden, können Sie Bit-Flag-Aufzählungen verwenden.

Ich weiß nicht, was Sie über Bitvektoren wissen, daher hier eine Übersicht: Grundsätzlich haben Sie eine Aufzählungsklasse, die alle möglichen Schlüssel darstellt. Jede Aufzählung sollte einen Wert haben, der einem Bit in einer Ganzzahl entspricht. (dh: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014 usw.). ( Link dazu in Java).

Da Sie jetzt Informationen über bis zu 32 (oder 64, wenn Sie Longs-Schlüssel verwenden) weitergeben können, können Sie eine Hash-Tabelle haben, die Bitvektoren (int oder long) mit Objekten verknüpft, die auf eine Art KeyComboCallback-Schnittstelle fallen, die nur eine enthält einzelner Methodenaufruf Do (), der aufgerufen wird, wenn die zugehörige Tastenkombination gedrückt wird.

Wenn Sie nun Ihr Player-Objekt oder Ihr Menüobjekt instanziieren / initialisieren, können Sie eine Art Eingabemanager aufrufen und alle gewünschten Schlüsselkombinationsbitvektoren übergeben und diesen anonymen inneren Klassen zuordnen.

// ... 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

Dies ist in C ++ und C # sehr schnell und bequem, aber Java-Aufzählungen sind etwas Besonderes. Daher ist es möglicherweise bequemer, eine KeyCombination-Klasse oder etwas zu erstellen, in dem alle diese Informationen gespeichert werden, ohne sich um Aufzählungen kümmern zu müssen. Aber die Idee ist immer noch dieselbe. Ich benutze dies in einem XNA-Spiel und ich mag die Einrichtung sehr. Sie können es auch verwenden, um Eingabebereiche zu trennen. Dies ist nützlich, um verschiedene Teile der Tastatur oder des Gamepads unabhängig voneinander zu vergleichen (möglicherweise nützlich für zwei Spieler auf einer Tastatur).

michael.bartnett
quelle
Ich mag deinen Beitrag, besonders den "this.DoCrazyAwesomeComboAttack ();" XD. Dein Weg scheint der bessere Weg für komplizierte Dinge zu sein, also bleibe ich bei einfacheren Sachen. Danke für deine Hilfe!
Steven Rogers
+1 Sehr interessante Antwort! Ich habe aus dieser Antwort gelernt und werde ein Auge darauf werfen, wenn ich mehr Zeit für meine Hobby-Spiele-Entwicklung habe. Und danke, dass Sie mir gesagt haben, dass meine Antwort gut ist, obwohl es sich um einfachere Dinge handelt, über die ich nicht streiten würde, da ich ein Anfänger in GD bin. =) Danke!
Will Marcouiller