Bester Weg, um ein Leistungssystem zu implementieren?

7

Ich versuche derzeit, ein Leistungssystem für mein Spiel zu implementieren. Ich kann jedoch keinen besseren Weg finden, um einige komplexe zu realisieren, wie: Der Spieler hat x Münzen gesammelt, das Level mit einer Zeit von weniger als x Sekunden abgeschlossen, über x Feinde getötet usw. Können Sie bitte Ihre Erfahrungen teilen?

Zweitens, warum implementieren wir das Leistungssystem nicht einfach nur als lokales System, anstatt Server wie Scoreloop oder OpenFeint zu verwenden? Oder anders ausgedrückt: Was sind die Vorteile der Verwendung eines Servers zur Verwaltung der Spielerleistung?

wollen252
quelle
Stellen Sie nicht viele Fragen gleichzeitig, sondern konzentrieren Sie sich auf eine.
Matsemann

Antworten:

9

Ein Leistungssystem kann ziemlich komplex sein. Viele der Erfolge sind Sonderfälle, auf die geachtet werden muss. Das bedeutet speziellen Code, nur für diesen Erfolg. Einige sind leicht zu codieren, z. B. das Beenden eines Levels unter einer bestimmten Zeit oder die Gesamtzahl der gesammelten Münzen. So einfach wie ein Timer oder ein globaler Zähler. Die komplexeren Errungenschaften erfordern offensichtlich komplexeren Code. Das Töten von x Feindtypen über x Sekunden könnte einen rollierenden Zähler oder eine detaillierte Protokollierung mit regelmäßiger Analyse erfordern.

Wenn Sie Erfolge erzielen möchten, müssen Sie diese grundsätzlich codieren. Genau wie bei jeder anderen Funktion. Als Entwickler haben Sie Zugriff auf alle Informationen zum Spiel. Sie müssen nur protokollieren, was passiert, und prüfen, ob es Ihren Leistungsanforderungen entspricht.

Ich plane, mein Leistungssystem in das Ereignissystem zu implementieren. Da ich bereits wichtige Ereignisse zur Protokollierung sende, kann ich das Leistungssystem genauso gut abhören lassen. Das ist schön, weil sich dann der gesamte Code für Erfolge an einem Ort befindet. So können Sie beispielsweise jedes Mal ein Ereignis auslösen, wenn ein Level endet. Das Ereignis würde alle Informationen über die Leistung des Spielers auf dieser Ebene enthalten, einschließlich seiner Punktzahl, der Zeit bis zur Fertigstellung, der Anzahl der gesammelten Münzen und so weiter. Diese Ereignisse werden vom Ereignissystem gelesen und protokolliert. Sie können dann die Gesamtzahl der gesammelten Münzen weiter ausführen und die Endzeiten mit früheren Bestleistungen vergleichen.

Wie für den Server zum Verwalten von Erfolgen. Ich glaube, einer der großen Vorteile von Erfolgen besteht darin, sie mit anderen zu teilen oder Ihre Erfolge mit denen Ihrer Freunde zu vergleichen. Wenn die Erfolge öffentlich gehostet werden, werden die sozialen Merkmale implementiert, die für viele Arten von Spielern attraktiv sind.

BEARBEITEN

Auf jeden Fall können Sie fest codierte Regeln vermeiden! Das System, das ich beschreibe, dient hauptsächlich dazu, Informationen zu sammeln und alles an einem Ort zusammenzuführen. Das wäre am besten fest codiert, und Sie müssen den Erfassungscode für zusätzliche Regeln fest codieren. Sie versuchen, so viele wichtige Daten wie möglich zu sammeln, damit Sie später mehr damit arbeiten können.

Wie Sie die Daten analysieren, liegt bei Ihnen. Eingehende Ereignisse können nach in JSON oder Lua definierten Regeln gefiltert werden. Was die Implementierung von Lua angeht, habe ich das nicht getan, daher weiß ich nicht, ob es einfach ist. Ich stelle es mir vor. Lua ist eine sehr mächtige Skriptsprache mit vielen Ressourcen, die Ihnen helfen, wenn Sie nicht weiterkommen. Scheint mir eine gute Wahl zu sein.

MichaelHouse
quelle
0

Normalerweise beschränken sich Leistungssysteme auf ein einfaches Muster von:

Werte -> Bedingungen -> Erfolge

  1. Definieren Sie eine Liste von Werten, die Erfolge beeinflussen können (z. B. Highscore, Highest-Completed-Level, Anzahl der Stunden-Spieler, Cash-Earned).
  2. Jedes Mal, wenn einer dieser Werte geändert wird, sendet der "Eigentümer" des Werts (z. B. die "Spielerklasse" für "Cash-Earned") ein valueChanged-Ereignis (value_id, new_value), das an den AchievementManager weitergeleitet wird.
  3. Der AchievementManager überprüft seine Liste der Bedingungen (auf unvollständige Erfolge in Abhängigkeit von diesem Wert) und aktualisiert die Erfolge (Senden eines Ereignisses, falls erforderlich).

Vergessen Sie nicht das Laden / Speichern / Zurücksetzen von Edge-Cases, aber das war's.

Meine aktuelle Implementierung enthält ungefähr 70 Codezeilen, ohne den Konverter "Achievement.config to success.cfg".

Die Konfiguration sieht derzeit folgendermaßen aus:

ACHIEVEMENT_PLAYED_VERY_LONG_AND_EARNED_LOTS_OF_CASH: [
  VALUE_PLAY_TIME_IN_MINUTES > 3600,
  VALUE_CASH > 10k
]

Die erstellte .cfg, die vom Spiel geladen wird, sieht dann ungefähr so ​​aus

[Number of Achievements]
for each achievement
[CRC32 of the achievement string, e.g. ACHIEVEMENT_PLAYED_VERY_LONG_AND_EARNED_LOTS_OF_CASH]
[Number of Conditions]
for each condition
[CRC32 of the value name string, e.g. VALUE_CASH]
[condition type, e.g. 0 => less than, 1 => greater than]
[value, e.g. 10000]

Der Konverter ist tatsächlich etwas intelligenter. Er erweitert "10K" auf "10000", warnt vor Duplikaten, erkennt, dass Bedingungen in Konflikt stehen usw.

Nebenbemerkungen: Sie könnten eine Aufzählung für die Erfolgs- und Wert-ID verwenden, aber ich bevorzuge CRC32s, da Sie keine Liste für neue Werte aktualisieren müssen und dennoch die Vorteile von Zifferntasten erhalten und diese sogar dem ursprünglichen Namen zuordnen können in Debug-Builds. (Aber IDs sind ein ganz anderes Thema;))

Das System hatte einmal eine ziemlich komplexe boolesche Logik für Bedingungen, aber am Ende haben wir nur "und" verwendet, also haben wir sie entfernt.

Andreas
quelle