Frage

Edit: Das macht viel mehr Sinn für mich jetzt, dass ich weg für die Hilfe aus dem Code, durch einen Schritt gemacht habe

.

Just Stapelüberlauf gefunden den anderen Tag durch Coding Horror und es sieht fantastisch. Figur, die ich die Gemeinschaft über ein Problem fragen würde ich zur Zeit bin versucht zu erarbeiten.

Ich entwickle ein roguelike sortof Spiel J2ME MIDP 2.0 Telefone. Das Projekt ist noch in den grundlegenden Phasen der Entwicklung, wie ich herausfinden, wie es funktionieren wird. Der Teil i auf derzeit bin stecken hat mit einem Gewinde zu tun.

Das Spiel hat eine benutzerdefinierte HaxCanvas Klasse, die Gamecanvas und Implementiert runnable erstreckt. Es lief Methodenaufrufe repaint () und schlafen dann für 50 ms, in einer Bildrate von 20 FPS führen. Dies ermöglicht es mir, den Rest des Spiels zu schreiben, ohne repaint überall setzen zu müssen und soll später machen Animationen und Effekte leichter zu tun. (Zumindest theoretisch).

Der Fluss des Spiels wird durch eine GameManager Klasse gesteuert, die durch alle NPCs auf der Karte Loops, deren abwechselnd, bis er die Spieler an der Reihe ist. An dieser Stelle muss ich Eingang bekommen die Spieler zu ermöglichen, um und / oder Angriff Dinge zu bewegen. Ich ursprünglich rief gameManager.runUntilHeroTurn() in der keyPressed Methode meiner HaxCanvas. Doch nach auf J2ME System-Threads lesen bis ich erkennen, dass ein Verfahren mit dem Potenzial setzt für eine Weile in einem Rückruf führt eine schlechte Idee ist. Allerdings muß ich keyPressed verwendet tun handeling Eingang, da ich Zugang zu den Zifferntasten benötigen, und getKeyStates() dies nicht unterstützt.

Sofar meine Versuche mein gameloop zu setzen in einem eigenen Thread haben in einer Katastrophe geführt. Eine seltsame „abgefangene ArrayIndexOutOfBoundsException“ ohne Stack-Trace zeigt sich nach dem Spiel für mehrere Umdrehungen ausgeführt wurde.

So nehme ich meine Frage ist:

Für ein „turn based“ Spiel in J2ME, was ist der beste Weg, um das Spiel Schleife zu implementieren, für die Eingabe erlaubt nur handeling, wenn es die Umdrehung des Spielers?

War es hilfreich?

Lösung

würde ich Threading für die Spiellogik als J2ME Einfädeln vermeiden, auf Hersteller natürlich abhängig, macht keine große Aufgabe, die begrenzte Ressourcen zu teilen. Sie werden oft Pausen sehen, während ein Thread schwere Verarbeitung der Fall ist. Ich würde nur Fäden für das Laden oder Netzwerk-Connectivity-Features wie in diesem Fall empfehlen werden Sie nur den Benutzer werden geben basic „Loading ...“ Feedback.

Um dies zu umgehen, habe ich nicht Unterschleifen jeden der AI in einem Rahmen zu aktualisieren. Ich würde etwas tun, wie folgt in der Flucht Funktion:

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
    }
}

Sie wollen alles zu vermeiden, in einem Rahmen als 1 aktualisiert haben) die Aktualisierung langsam sein könnte, für den Benutzer nicht in unmittelbarem visuellen Feedback resultierenden 2) Sie nicht jede einzelne NPC animieren können, wie sie ihre Aktion zu machen. Mit diesem Setup können Sie NPC Staaten haben, NPC_DECIDE_MOVE und NPC_ANIMATING, dass Sie weitere Kontrolle dessen, was der NPC tut erlauben würde. NPC_ANIMATING setzen würde im Grunde das Spiel in einem Wartezustand für die Animation stattfinden soll, eine weitere Verarbeitung zu vermeiden, bis die Animation abgeschlossen ist. Dann könnte es zur nächsten NPC an der Reihe weitergehen.

Auch ich würde nur eine gameManager.update habe () und gameManager.paint (g) (Farbe würde von der Farbe genannt werden), die alles behandeln würde und die run-Methode dünn halten.

Schließlich sah man in flushGraphics ()? Mit dem in der Regel Gamecanvas Sie ein Graphics-Objekt erstellen, alles, dass zeichnen und dann rufen flushGraphics (), dann warten. Die Methode, die Sie erwähnen, ist so, wie es für die Canvas-Klasse von Angriff zu nehmen. Ich dachte, ich würde dies erwähnen und einen Link: Spiel Canvas Basics

Andere Tipps

Obwohl es nicht J2ME speziell sollten Sie Benutzereingaben erfassen, die allgemeine Strategie ist es, den Eingang es bis zu seiner Zeit in der Warteschlange um die Eingabe zu verarbeiten.

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

Auf diese Weise können Sie sogar Skript-Eingang für Debug-Zwecke.

Sie brauchen also keinen neuen Thread benötigen. Jedes Mal, wenn die Benutzer-Taste drücken Sie speichern sie in einem Puffer, und dann verarbeitet die Inhalte des Puffers, wenn notwendig. Wenn der Spieler Puffer keinen Eingang hat, sollte der Manager alle Gameplay überspringen, Animationen machen und dann von vorne beginnen (da das Spiel nicht ein Action-Spiel ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top