Comment dois-je avoir la saisie clé / souris dans un jeu java avancé?

9

Je suis un programmeur autodidacte, donc je ne connais pas les bonnes façons de faire les choses. J'ai créé des jeux simples comme les astéroïdes et les serpents, mais dans ces jeux, vous pouvez facilement modifier les variables dans les fonctions d'événement clé. Voici comment je l'ai fait dans mon jeu simple Asteroids:

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

Si je devais faire un jeu plus avancé (avec un menu principal, des options, un jeu principal, etc.), comment dois-je faire la saisie clé / souris?

De plus, si je devais entrer en solo, devrais-je mettre tout le code de gameplay dans une classe? Existe-t-il un moyen de mettre le code solo dans une classe distincte et de faire en sorte que l'entrée clé modifie toujours les variables et autres?

Steven Rogers
la source
+1 Votre réponse m'a permis d'apprendre quelque chose de nouveau à partir de la réponse de bearcdp. Merci d'avoir posé la question! =)
Will Marcouiller

Réponses:

3

Je ne suis pas un expert et je suggère néanmoins de séparer à la fois les contrôles et la logique métier / jeu / menu (nommez-le).

J'ai déjà répondu à une question similaire concernant les instructions à donner à un serpent dans un jeu conçu avec des classes. Java étant un langage orienté objet, je suppose que vous êtes capable d'écrire des classes et des trucs adéquats. Ensuite, lorsque vous avez écrit votre classe d'objets, si c'est pour que votre objet doive réagir à certaines touches et clics de souris, j'irais avec une classe Controller qui sait ce qui est actuellement affiché à l'écran, puis je dirais à cet objet ce qu'il devrait faire selon la touche qui a été enfoncée ou la région qui a été cliquée.

Voici le lien vers la question dont je vous ai parlé et à laquelle j'ai répondu sur la séparation des contrôles de la logique d'objet. Il comprend également un exemple de code qui illustre ma pensée.

Déplacer mon sprite dans XNA à l'aide de classes

( Malheureusement, aucune des réponses n'a encore été acceptée par le PO, donc nous ne savons pas avec certitude si cela a résolu ses préoccupations. En outre, je conçois toujours de cette façon et je n'ai trouvé aucun problème en le faisant jusqu'à présent. )

Maintenant je sais, c'est tagué XNA. L'idée ou la conception est un niveau d'architecture plus élevé que la technologie utilisée, donc cette conception pourrait être simplement adaptée à la syntaxe Java. L'idée générale reste la même. =)

J'espère que cela aide! Je serai heureux de vous aider davantage quand je le pourrai, il suffit de demander! =)

Will Marcouiller
la source
5

La réponse de Will vous montre ce qui est probablement le plus flexible et le plus simple, et je le recommanderais si vous avez besoin d'une interrogation directe.

Mais, si vous avez besoin d'un moyen facile de vérifier les différentes combinaisons d'appuis sur les boutons tout en évitant des quantités massives de commutateurs et d'instructions if, vous pouvez utiliser des énumérations d'indicateurs de bits.

Je ne sais pas ce que vous savez sur les vecteurs de bits, alors voici un aperçu: Fondamentalement, vous avez une classe enum qui représente toutes les clés possibles. Chaque énumération doit avoir une valeur qui correspond à un bit dans un entier. (par exemple: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014, etc.). ( Lien pour faire cela en Java).

Maintenant, puisque vous pouvez transmettre des informations sur jusqu'à 32 (ou 64 si vous utilisez des clés longues), vous pouvez avoir une table de hachage qui associe des vecteurs de bits (int ou longs) à des objets tombant sur une sorte d'interface KeyComboCallback, qui contient juste un appel de méthode unique, Do (), qui est appelé lorsque la combinaison de touches associée est enfoncée.

Maintenant, lorsque vous instanciez / initialisez votre objet joueur ou votre objet menu, vous pouvez appeler une sorte de gestionnaire d'entrée et lui passer tous les vecteurs de bits de combinaison de touches que vous souhaitez et les associer à des classes internes anonymes.

// ... 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'est vraiment rapide et pratique en C ++ et C #, mais les énumérations Java sont spéciales, vous pouvez donc trouver plus pratique de créer une classe KeyCombination ou quelque chose qui stockera toutes ces informations sans se soucier des énumérations. Mais l'idée est toujours la même. J'utilise cela dans un jeu XNA, et j'aime beaucoup l'installation. Vous pouvez également l'utiliser pour séparer les régions d'entrée, ce qui est utile pour comparer différentes parties du clavier ou de la manette de jeu indépendamment (peut être utile pour deux joueurs sur un même clavier).

michael.bartnett
la source
J'aime votre message, en particulier le "this.DoCrazyAwesomeComboAttack ();" XD. Votre chemin semble être le meilleur moyen pour les choses compliquées, donc je vais m'en tenir à des choses plus faciles. Merci de votre aide!
Steven Rogers
+1 Réponse très intéressante! J'ai appris de cette réponse et je vais y jeter un œil lorsque j'aurai plus de temps à consacrer à mon développement de jeux de loisir. Et merci d'avoir dit que ma réponse est bonne, mais c'est pour des choses plus simples, ce que je ne contesterais pas, car je suis un débutant en GD. =) Merci!
Will Marcouiller