[9] Der permanente Highscore

Hey there.
Wow. Das ist jetzt schon der neunte Blogeintrag zur KopfTrainer App. Wie schnell die Zeit vergeht…
Die App kann bisher temporär Dinge speichern.
Das heißt leider dass Dinge eigentlich nicht wirklich gespeichert werden…
Dazu müsste man einen persistenten Highscore programmieren.
beachMountains
Wie programmiert man einen persistenten Highscore?
Persistent? Was bedeutet das eigentlich?
Persistent bedeutet eigentlich nichts anderes als dauerhaft. Dinge werden dauerhaft in deiner App gespeichert und sind von einem Neustart oder Absturz der App nicht mehr betroffen.

Als ich mir das zum ersten Mal in der API angesehen habe war ich überwältigt…
Ich dachte mir: „Mensch ist das viel“
Aber eigentlich war es gar nicht so schwer. So hab ich dann verstanden wie das UserPersistence Objekt funktioniert:

userScaled
Das ist ein User. Zum Beispiel du, oder jede andere Person die du auf Knuddels kennst.


channelScaled
Hier haben wir einen Channel. Darin chattest du immer.


appScaled
Sag hallo zu deiner App. Die sieht nämlich so aus.


memory
Und last but not least: Das Persistence Objekt. Wozu man das braucht erfährst du gleich.


user_channelScaled

Das bist du. Du bist gerade in deinem eigenen Channel und hast dort noch keine App installiert.


app_user_channelScaled

Das war dir natürlich nicht genug. Also hast du dir eine erste App programmiert. Vielleicht hast du auch einfach den KopfTrainer oder die HeyThere App ausprobiert?


app2_user_channelScaled

Du musst wissen, dass du in einem Channel mehr als eine App installieren kannst. Die können auch gleichzeitig laufen.
In deinem Channel hast du jetzt zwei Apps. Die Blaue und die Gelbe.


persistence_app2_user_channelScaled
Jetzt wird’s spannend. Du als User hast für jede App genau ein Persistence Objekt. Das heißt du kannst in der gelben und der blauen App zwei Dinge unter dem gleichen Key (Schlüssel) speichern.
Zum Beispiel könntest du in der blauen App unter dem Key „Name“ : Johannes speichern. Und in der gelben etwas ganz anderes. Zum Beispiel „Name“ : Lukas.
Was ein Key ist haben wir ja schon in meinem 6. Blog Eintrag gelernt. Falls du dich nicht mehr genau daran erinnerst, schau doch kurz hier nach.


persistence_app2_user2_channelScaled

Was ist jetzt passiert?
Für mich war das hier der schwierigste Part.
Wenn nämlich einer deiner Freunde, oder überhaupt ein anderer User, in deinen Channel kommt. Naja dann hat der neue User auch in jeder App sein eigenes Persistence Objekt. Wie du siehst zeigen die roten Pfeile des neuen Users beide zu ganz anderen Persistence Objekten.

Wie programmiert man das jetzt?
Als ich das alles verstanden hatte war das Programmieren an sich gar nicht mehr so schwer.
Zuerst wollte ich eine Funktion schreiben, die gleichzeitig den temporäre und den globalen also persistenten Highscore speichern kann:

function addScore(user, amount)
{
addTempScore(user, amount);
addPermScore(user, amount);
}

An der Funktion addTempScore(user, amount) hat sich nichts geändert. Anstatt sie direkt aufzurufen, rufe ich jetzt einfach zuerst die Funktion addScore(user, amount) auf. AddScore(user, amount) übernimmt quasi alles, was mit dem Hinzufügen des Highscores eines Users zutun hat.

Wie sieht die Funktion addPermScore(user, amount) aus?
Hier passiert eigentlich die ganze Magie. Hier speichere ich Daten in der UserPersistence.

function addPermScore(user, amount)
{
var persistence = user.getPersistence();
persistence.addNumber(PERM_SCORE, amount);
}

[1] Um Daten in einem UserPersistence Objekt zu speichern (Das war die kleine Diskette von oben) muss man sich das UserPersistence Objekt erst einmal für jeden User holen. Puh, was für ein Satz 😀
Wenn du das Objekt nicht über user.getPersistence() „holst“ kannst du darauf nicht zugreifen.
[2] In der Variable persistence ist jetzt das UserPersistence Objekt für den User gespeichert. Juhuu! 🙂 Jetzt kann ich endlich Dinge darin abspeichern.
[3] Das Abspeichern funktionert eigentlich wieder wie mit dem temporären Highscore. Wir speichern unter einem bestimmten Key eine Zahl. Hier den Highscore des Users.

Wieso ist der Key so komisch groß geschrieben?
Das liegt daran, dass PERM_SCORE eine Konstante ist.
Konstante? Man hat mir erklärt, dass man eine Konstante, wenn sie mal initialisiert wurde, nicht mehr ändern kann. Was sehr gut ist.
Stell dir vor irgendjemand ändert den Key für die gespeicherten Daten. Dann wären sie für immer verloren.
Wenn du den Schlüssel zu deiner Haustür verlierst kommst du ja auch nicht mehr rein stimmt’s?
Den Key habe ich genau deshalb ganz oben in der App definiert:

const PERM_SCORE = "perm_score";

Wo liegt jetzt der Unterschied zum temporären Highscore?
Das habe ich mich auch zu allererst gefragt.
Wie du vielleicht bemerkt hast, musste ich um den permanenten Highscore zu implementieren viel weniger Code schreiben als beim temporären Highscore.
Das liegt daran, dass die Knuddels API sehr viel Arbeit im Hintergrund übernimmt.
Ich musste für den permanenten Highscore nicht erst ein „Telefonbuch“ erstellen. Und dann einen „Eintrag“ schreiben. Nein. Ich konnte sofort etwas für den User hineinschreiben.
Falls du nicht mehr weißt was ich mit Telefonbuch oder Eintrag meine, schau dir doch nochmal den 6. Blogeintrag an.

Wie gibt man den permanenten Highscore wieder aus?
Gut dass du frägst.
Du hast ganz Recht. Im Moment sieht noch keiner den permanenten Highscore. Also die Rangliste die selbst dann bleibt wenn der User den Channel verlässt.
Darum möchte ich mich aber im nächsten Blog Eintrag kümmern.

Du kommst doch wieder vorbei oder?
Achja: Vergiss bitte nicht. Wenn du Fragen oder Vorschläge zur KopfTrainer App oder diesem Blog hast. Schreib mir doch einfach :).
Liebe Grüße, MarvinDerPraktikant.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s