Du hast also nur ein Problem dabei wie man den Cursor bewegen kann?
Das dürfte auch bei Methode 1 nicht so schwer sein. Allerdings müssen wir hierbei beachten, dass der Cursor nicht wie bei Methode 2 auch auf leere Felder zeigen darf. Schließlich soll man nicht weitergehen könnten wenn nichts mehr kommt.
Zuerst das einfachere, die hoch/runter Bewegung.
Wie oben gesagt müssen wir vor jeder Bewegung überprüfen, ob die nächste Stelle frei ist. Wenn du dich noch erinnerst ist in der Variable "Aktuell" gespeichert, an welcher Stelle der Liste wir uns gerade befinden. Mit der Variable "Kontrolle" schauen wir nach, was in der Schublade bei "Aktuell" drinn ist. Ist sie leer, ist die Liste zuende, daher dürfen wir dort nicht weitergehen.
Um die Cursorbewegung jedoch gut hinzubekommen sollten wir auch noch eine Variable "Menüposition" einführen die den Cursor steuert.
Der Cursor selbst ist völlig losgelöst vom Auftrag auf den er gerade Zeigt, d.h. wir können ihn - abgesehen von der obigen Einschränkung - völlig frei bewegen.
Die Berechnung der Cursorposition mache ich so:
In diesem Fall ständen deine Einträge jeweils 12 Pixel auseinander, hätten alle die X-Koordinate 80 und der erste Eintrag hätte die Y-Koordinate 102.Zitat
Anstatt jedes Mal bei einer Bewegung des Cursors die Variablen manuell anzupassen, callt man einfach dieses Event.
Damit können wir schonmal unseren Cursor bewegen, indem wir die Menüposition ändern.
Nun aber zur konkreten Bewegung:
Was genau wird hier gemacht?Zitat
Als erstes wieder ein Enter Passwort. Drückt der Spieler Pfeil-unten soll der Cursor abwärts bewegt werden. Makerintern tun wir das erstmal ohne Kontrolle. Die Menüposition wird um 1 erhöht. Sollten wir damit bereits über das Maximum von 5 geraten sein (es gibt schließlich nur 5 Einträge pro Seite) wird sie gleich wieder auf 1 gesetzt. Nun muss die entscheidende Abfrage getätigt werden. Dazu bewegen wir unseren Aktuell-Fahrstuhl zu jener Schublade auf die unser Cursor gerade zeigt. Der Cursor selbst weiß nicht auf welche Schublade er zeigt. Er weiß nur wie hoch diese in Relation zum Fahrstuhl "Seiten Anfang" steht. Der Fahrstuhl "Aktuell" muss also erstmal auf die Höhe von "Seite Anfang" fahren und dann nochmal um das höher was der Fahrstuhl "Cursor" höher ist. Es muss daraufhin noch - 1 gerechnet werden, da die Menüposition des Cursors bei 1 startet. 1 bedeutet aber bildlich, dass die Fahrstühle "Cursor" und "Seite Anfang" auf einer Höhe sind. Wenn ich einfach rechnen würde:
Aktuell = Seite Anfang + Menüposition
wäre der Aktuell Fahrstuhl immer eine Etage zu hoch. Daher das - 1.
So, nun zeigt Aktuell auf die Schulbade zu der der Spieler den Cursor bewegen will. Also öffnen wir sie (durch die Variable "Kontrolle") und schauen nach was drinn ist. Ist ihr Inhalt != (ungleich) 0, sie beinhaltet also einen Auftrag, können wir den Sound zur Cursorbewegung abspielen und den Cursor nachrücken. Mission erfolgreich.
Sollte sie aber leer sein, ist das Ende der Liste erreicht. Wir spielen einen Verweigerungs-Sound und setzen die Menüposition wieder zurück (wir haben sie erst um 1 erhöht, danach müssen wir sie wieder um 1 senken).
Fertig ist die vertikale Bewegung.
Nun zum umblättern der Seite. Dazu müssen wir wieder erstmal wissen ob es überhaupt noch Einträge auf der nächsten Seite gibt.
Dazu bemühen wir wieder den selben Code wie oben, diesmal setzen wir nur den Aktuell-Fahrstuhl auf das Ende der Seite und schicken ihn dann eins weiter hoch. Damit hat er automatisch den theoretisch ersten Eintrag der nächsten Seite erreicht. Ist diese Schublade nicht leer, dürfen wir umblättern.
Der Code lautet also:
Damit wäre das erledigt.Zitat
Nun können wir uns dem umblättern zuwenden. Das sähe so aus:
Da wir 5 Einträge pro Seite haben muss "Seite Ende" um 5 erhöht werden. zuvor können wir aber noch "Seite Anfang" anpassen, indem wir den Fahrstuhl eine Etage höher fahren als "Seite Ende" vorher war. (Natürlich wird dieser Code nur dann ausgeführt wenn die oben angegebene Kontrolle positiv war.)Zitat
Allerdings kann es nun noch sein, dass zwar der erste Eintrag der Seite belegt ist, der Rest aber nicht. Daher müssen wir nun eine Schleife bauen, die das Seitenende so lange zurückzieht, bis es auf eine volle Schublade zeigt:
Da durch das umblättern nun auch der Cursor in ein leeres Feld projiziert werden könnte müssen wir auch das kontrollieren:Zitat
Was wird hier nun wieder gerechnet?Zitat
Die Frage ist ja, ob der Cursor in ein leeres Feld zeigt. Leere Felder gibt es nur hinter dem Seitenende. Faktisch müssen wir also kontrollieren, ob der Cursor hinter das Seitenende zeigt. Da aber beide Variablen völlig unterschiedliche Werte haben ("Seite Ende" zeigt irgendwo in die Liste und kann leicht einen Wert wie 2356 haben, wärend der Cursor über die Menüposition gesteuert wird, die sich strikt im Rahmen von 1-5 erstreckt) müssen wir irgendwie umrechnen. Das geht am besten mit der Variable "Seite Anfang". Letztendlich darf der "Cursor"-Fahrstuhl einfach nicht mehr Etagen höher als der "Seite Anfang"-Fahrstuhl sein, wie es der "Seite Ende"-Fahrstuhl ist. Daher errechne ich, wie viele Etagen der "Seite Ende"-Fahrstuhl höher als der "Seite Anfang"-Fahrstuhl ist. Das geht einfach mit:
"Seite Ende" - "Seite Anfang"
Das Ergebnis wäre theoretisch die Menüposition von "Seite Ende" - 1.
Daher rechne ich noch + 1 und habe die tatsächliche Menüposition von "Seite Ende".
Nun noch schnell kontrollieren ob die echte Menüposition (die des Cursors) über dem errechneten Wert liegt und sie in diesem Fall anpassen.
Fertig!
Noch ein kurzes Beispiel dazu:
Seite Anfang liegt bei 1321, Seite Ende bei 1324. Der Cursor hat die Menüposition 5.
Rechnung:
1324 - 1321 = 3
3 + 1 = 4
Menüposition = 5
5 > 4 => Cursor ist zu hoch
Menüposition -> 4
Stimmt
Um einmal einen Überblich über den Code zu bekommen, hier der komplette Cursor-Steuerungs Code:
Das müsste es eigentlich sein. Den Code hab ich nicht getestet, d.h. es wird wohl hier und da noch ein paar kleine Bugs geben, aber in dem Fall kannst du ja wieder fragenZitat
mfg
Phönix Tear
P.S:
Wenn ich mal wieder mehr Zeit hab kann ich ja auch mal dazu nen Skript machen xD