Question

Edit: Cela fait beaucoup plus de sens pour moi maintenant que j'ai pris un pas du code, merci pour l'aide

.

Je viens de trouver un débordement de pile l'autre jour par Coding Horror et il semble impressionnant. Figure que je vais demander à la communauté au sujet d'un problème que je suis en train d'essayer de travailler.

Je développe un roguelike sortof jeu en utilisant J2ME pour les téléphones MIDP 2.0. Le projet est encore au stade de base du développement que je figure sur la façon dont il va travailler. La partie que je suis actuellement coincé sur a à voir avec le filetage.

Le jeu a une classe HaxCanvas personnalisée qui étend GameCanvas et implements Runnable. Il est dirigé des appels de méthode repeindre () et dort ensuite pendant 50 ms, ce qui entraîne un taux de trame de 20 FPS. Cela me permet d'écrire le reste du jeu sans avoir à mettre repeindre partout et devrait faire des animations et des effets plus facile à faire par la suite. (Du moins en théorie).

Le déroulement du jeu est contrôlé par une classe GameManager, qui fait une boucle à travers tous les PNJ sur la carte, en prenant leur tour, jusqu'à ce qu'il soit le tour du joueur. A ce stade, je dois obtenir l'entrée pour permettre au joueur de se déplacer et / ou des choses d'attaque. Au départ, j'appelle gameManager.runUntilHeroTurn() dans la méthode keyPressed de mon HaxCanvas. Cependant, après avoir lu sur les threads système J2ME j'ai réalisé que mettre une méthode avec le potentiel de fonctionner pendant un certain temps dans un rappel est une mauvaise idée. Cependant, je dois utiliser keyPressed faire entrée handeling, puisque je besoin d'accéder aux touches numériques et getKeyStates() ne supporte pas cela.

Sofar mes tentatives de mettre mon gameloop dans son propre fil ont donné lieu à une catastrophe. Un étrange « uncaught ArrayIndexOutOfBoundsException » sans trace de la pile apparaît après le match a fonctionné pendant plusieurs tours.

Donc je suppose que ma question est la suivante:

Pour un jeu « tour par tour » dans J2ME, ce qui est la meilleure façon de mettre en œuvre la boucle de jeu, ce qui permet pour l'entrée handeling seulement quand il est au tour du joueur?

Était-ce utile?

La solution

Je voudrais éviter le filetage pour la logique de jeu comme filetage J2ME, selon le fabricant bien sûr, ne fait pas un bon travail de partager les ressources limitées. Vous verrez souvent des pauses alors qu'un fil ne traitement lourd. Je ne recommande fils pour les fonctions de chargement ou de connectivité réseau comme dans ce cas, vous serez juste donner à l'utilisateur des commentaires de base « Chargement ... ».

Pour gérer cela, je ne voudrais pas sous-boucles pour mettre à jour chacun des AI dans un cadre. Je ferais quelque chose comme suit dans la fonction d'exécution:

public void run() {
    while(true) {
        // Update the Game
        if(gameManager.isUsersTurn()) {
            // Collect User Input
            // Process User Input
            // Update User's State
        }
        else {
            // Update the active NPC based on their current state
            gameManager.updateCurrentNPC();
        }

        // Do your drawing
    }
}

Vous voulez éviter d'avoir tout mis à jour dans un cadre comme 1) la mise à jour peut être lent, ce qui ne retour visuel immédiat pour l'utilisateur 2) vous ne pouvez pas animer chaque PNJ individuel comme ils font leur action. Avec cette configuration, vous pourriez avoir des états PNJ, NPC_DECIDE_MOVE et NPC_ANIMATING, qui vous permettent de contrôler plus de ce que le NPC est en train de faire. NPC_ANIMATING serait essentiellement mettre le jeu dans un état d'attente pour l'animation doit avoir lieu, en évitant tout traitement ultérieur jusqu'à ce que l'animation soit terminée. Ensuite, il pourrait passer au prochain tour de l'APN.

En outre, je voudrais juste un gameManager.update () et gameManager.paint (g) (peinture serait appelé de la peinture) qui traiterait tout et garder la méthode d'exécution mince.

Enfin, avez-vous regardé dans flushGraphics ()? Avec le GameCanvas vous créez généralement un objet graphique, dessiner tout à cela et puis appelez flushGraphics (), puis attendez. La méthode que vous mentionnez est la façon de l'aborder pour la classe Canvas. Juste pensé que je voudrais mentionner cela et envoyer un lien: jeu Canvas Notions de base

Autres conseils

Bien que J2ME Plus précisément, vous devez saisir les entrées utilisateur, la stratégie générale est à la file d'attente de l'entrée jusqu'à ce que son temps de traiter l'entrée.

input ---> queue <---> Manager(loop)

De cette façon, vous pouvez même l'entrée de script à des fins de débogage.

Vous n'avez pas besoin d'un nouveau fil. Chaque fois que l'utilisateur appuie-clés que vous les stocker dans une mémoire tampon, puis traiter le contenu du tampon en cas de besoin. Si la mémoire tampon de joueur n'a pas d'entrée, le gestionnaire doit sauter toutes gameplay, faire des animations puis recommencer (puisque le jeu n'est pas un jeu d'action).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top