Wie entwerfe ich einen separaten Tutorial-Modus?

7

Ich arbeite an einem "sozialen" Spiel, das zu 90% abgeschlossen ist. Eine der verbleibenden Funktionen ist der Lernmodus.

Grundsätzlich beschränkt der Lernmodus den Benutzer auf den Zugriff auf einige Teile der Benutzeroberfläche und auf die Funktionen (z. B. Speicherelemente). Das Lernprogramm wird nur fortgesetzt, wenn ein bestimmtes Ereignis ausgelöst wird, insbesondere nach dem Lernprogramm.

Der Code ist fertig und wir haben bereits ein "fast" funktionierendes Spiel. Das Problem ist, dass ich den Tutorial-Modus nicht vorausgesehen habe, während ich diese 90% gemacht habe. Meine Anforderung ist, dass es keinen Ladevorgang / Übergang vom Tutorial-Modus zum normalen Modus geben sollte. Dies bedeutet, dass ich den Fortschritt aus dem Tutorial aufgreifen muss (kein erneutes Rendern von Assets und anderen Dingen).

Wie soll ich das so gestalten, dass ich nichts von meinem alten Code anfasse? Ich möchte, dass es so einfach ist, wie es einfach anzuschließen. Ich möchte das Tutorial nicht in meinem alten Code blockieren, da dies zu vielen Fehlern führen wird.

Sylpheed
quelle
Sie sollten weitere Details angeben, z. B. ob Sie Unterstützung für Skripte haben und ob diese Skripte die GUI ändern können ... Vielleicht werfen Sie ein Diagramm mit Klassen ein. PS: Sie können nicht alles vorhersehen, daher sollte Ihr Code immer überarbeitbar sein.
Den
2
Ich sage das Offensichtliche: Wenn Sie GUI-Elemente im Spiel aktivieren oder deaktivieren möchten, müssen Sie Unterstützung dafür hinzufügen. Nur Sie können wissen, wie Sie dies umsetzen können (oder andere Personen in Ihrem Team).
Max
Welche Sprache (n) verwenden Sie?
John McDonald
Ziel C. Ich entwickle für iOS. Sieht so aus, als wäre das der sauberste Weg. Ich kann jetzt kein Diagramm mehr veröffentlichen, da ich es bei der Arbeit gelassen habe. Ich werde posten, wenn ich jemals stecken geblieben bin. Sieht so aus, als hätte es schon geklingelt.
Sylpheed

Antworten:

3

Weitere Informationen helfen Ihnen dabei, bessere Antworten zu erhalten. Ohne viel darüber zu wissen, welche Art von Spiel du hast oder wie deine Levelstruktur aussieht, kann ich nur im Dunkeln stechen.

Wenn ich jedoch mit meinem aktuellen Projekt etwas Ähnliches machen würde, würde ich eine spezielle Ebene erstellen, die den Benutzer durch die betreffenden Themen führt. Ihre NPCs können beispielsweise nur mit den Elementen erstellt werden, die im Tutorial verfügbar sein sollen.

Um den Zugriff auf bestimmte UI-Elemente zu verhindern, müssen Sie möglicherweise einen Filter in vorhandenen Code integrieren, um zu bestimmen, ob ein Element vorhanden sein soll, wenn Sie die Elemente, die Sie in Ihrem Lernprogramm tun / nicht möchten, nicht hinzufügen oder entfernen können oder nicht (denken Sie an "Zugriffsbeschränkungen").

notlesh
quelle
Nehmen wir an, es ist wie in Sims City. Ich weiß nicht viel über das Spiel, denke aber daran, dass es ein Tutorial gibt, das den Benutzer durch das Spielen des Spiels führt. Natürlich möchten Sie im Lernprogramm einige Elemente der Benutzeroberfläche deaktivieren und Einschränkungen festlegen. Der beste Weg ist also, eine Schnittstelle für meine Benutzeroberfläche bereitzustellen? So kann ich sie bei Bedarf deaktivieren und aktivieren.
Sylpheed
Sie müssen entweder in der Lage sein, Benutzeroberflächenelemente zu Ihrem Lernprogramm hinzuzufügen oder daraus zu entfernen, oder Sie müssen Ihre Benutzeroberfläche so erstellen, dass sie von "Zugriffsbeschränkungen" abhängig ist. Wenn Sie beispielsweise eine Schaltfläche "Spiel speichern" haben, die in Ihrem Lernprogramm nicht verfügbar sein soll, können Sie sie in eine Anweisung wie if (canSaveGame ()) {panel.add (saveButton) einschließen. } wobei canSaveGame () Teil Ihres Zugriffsbeschränkungssystems ist.
Notlesh
Sie müssen nicht entfernt werden. Ich muss sie nur deaktivieren. Ich werde versuchen, den Code so umzugestalten, dass er über eine Schnittstelle deaktiviert / aktiviert werden kann. Wie werden Sie jedes Tutorial-Ereignis behandeln? Schlagen Sie vor, dass ich für jedes Ereignis separate Objekte erstelle? Ich befürchte, dass meine Tutorial-Klasse aufblähen könnte.
Sylpheed
Ich bin mir nicht sicher, was Sie mit Tutorial-Ereignissen meinen. Warum brauchen sie eine Sonderbehandlung?
Notlesh
Angenommen, das Tutorial ist in verschiedene Phasen (Ereignisse) unterteilt. Der Benutzer kann nur dann mit der nächsten Phase fortfahren, wenn er die Anweisungen befolgt hat. Jedes "Tutorial-Event" wartet darauf, dass etwas Interessantes passiert. Nach dem Auslösen wird ein neues Tutorial-Ereignis instanziiert, das eine andere Ereignisbasis in der aktuellen "Tutorial-Phase" abhört. Ich mache mir Sorgen, dass das Tutorial ungefähr 20 Schritte enthält. Ich plane, jeden Schritt auf verschiedene Objekte aufzuteilen.
Sylpheed
2

Ich arbeite gerade an einem Tutorial für mein C # -Spiel. Ich trenne das Tutorial durch Ereignisse vom Spiel. In meinem Spiel gibt es eine Reihe von Ereignissen, die ausgelöst werden, wenn sich der Spielstatus auf verschiedene Weise ändert: Objekte, die sich bewegen, zerstört werden, gebaut werden, ein Upgrade abschließen usw. Mein Tutorial hört auf die Ereignisse von Interesse und hat die Fähigkeit das HUD zu manipulieren. Das ist alles was du brauchst. Um es ganz klar zu machen, hat das Spiel keine Ahnung, dass das Tutorial stattfindet.

Dies kann auch wichtig sein: Mein Tutorial ist eine Unterklasse von Szenario, in der das Spiel immer ein Szenario ausführt. Da ich C # verwende, könnte ich jedes meiner Szenarien in eine C # -Skriptdatei werfen, aber im Moment werden alle meine Szenarien direkt im Spiel kompiliert.

Die Klasse ist noch in Arbeit, aber hier ist eine etwas veraltete Version, die Sie sich ansehen können: http://asteroidoutpost.svn.sourceforge.net/viewvc/asteroidoutpost/trunk/Scenarios/TutorialScenario.cs? view = markup

John McDonald
quelle
0

Ich arbeite auch an einem Tutorial für mein Flash-Spiel und so habe ich es eingerichtet. Jeder Teil des Spiels überprüft ein Tutorial-Objekt, um festzustellen, ob eine Aktion für den Spieler verfügbar ist. Wenn das Tutorial-Modul nicht existiert oder inaktiv ist, können wir davon ausgehen, dass der Player alles kann.

Nehmen wir zum Beispiel an, Sie möchten zu Beginn Ihres Tutorials nicht, dass der Spieler bis zum richtigen Zeitpunkt etwas tun kann. In Ihrem Lernprogrammobjekt können Flags wie PLAYER_CAN_USE_TOOLBAR, PLAYER_CAN_SWITCH_VIEWS oder PLAYER_CAN_DESIGNATE_ZONE usw. auf FALSE gesetzt sein. Wenn der Player Ihr Tutorial durchläuft, können Sie diese Flags auf true setzen.

Blockieren Sie für Ihren UI-Teil das Signal an das Modell oder den Controller, der die Aktion tatsächlich ausführt, wenn Ihre Tutorial-Flags nicht gesetzt sind:

// If our tutorial module/tracker exists, but the action flag is set to false
// then leave our method early
if (mTutorial.isActive() && !mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
  return false;
}
//Do the rest of the action here

Um auf bestimmte Ereignisse zu warten, können Sie das Ereignis an Ihr Lernprogrammobjekt zurückgeben, um zu überprüfen, ob der Spieler dies tun muss, um diesen Lernschritt fortzusetzen. Wenn Sie beispielsweise den Player zum Erstellen einer Wohnzone an einem bestimmten X, Y benötigen:

var evt:GameEvent = new GameEvent(EVENT_CREATE_ZONE, ZONE_TYPE_RESIDENTIAL, startX, startY, endX, endY);
if (mTutorial.isActive()) {
  if (!mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
    return false;
  }
  //Check to see if this event is okay
  if (!mTutorial.validateEvent(evt)) {
    //Show why the player can't do this via popup
    return false;
  }
}
//Do the rest of the action here

Ich hoffe das hat geholfen. Leider müssen Sie die Tutorial-Checks in Ihren alten Code einfügen, damit dies funktioniert. Wenn Sie jedoch davon ausgehen, dass alle Aktionen gültig sind, sofern das Lernprogrammobjekt nicht vorhanden ist, sollten Sie diesen Integrationsprozess vereinfachen und Ihre Fehler minimieren.

Jelani Harris
quelle
Ich werde in Betracht ziehen, jedes Tutorial-Ereignis als separate Objekte zu behandeln. Ich werde versuchen, den Code für das Tutorial von hier aus zu entwerfen. Vielen Dank.
Sylpheed