Ergebnis 1 bis 20 von 29

Thema: Notizbuch für Quests (Logbuch)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Hallo

    hatte mal kurz Zeit wieder am Logbuch zu arbeiten und bin mal die erste Methode durchgegangen. Die gute Nachricht: Habe das Prinzip soweit verstanden, zumindest was das anzeigen der Aufträge pro Seite betrifft. Diese "Fahrstuhl-Variable" mit der ersten freien Stelle macht ja vieles möglich

    Schlechte Nachricht:

    Ich komme noch nicht mit dem Cursormenü klar, wie ich es integrieren kann

    Der Cursor muss doch auf jeder Seite als letztes angezeigt werden (als höchstes Picture), damit man ihn auch über den ganzen Aufträgen sehen kann.

    Ich habe es bisher so verstanden:

    Aufruf des Logbuches
    Show Picture = Hintergrund
    Seitenende/anfang ermitteln
    Aufträge anzeigen (Call Event)

    Nun fehlt mir aber der Ansatz, wie ich den Cursor dort anbringe und dass bei drücken der Pfeiltasten oben/unten zwischen den Aufträgen gewählt wird, bei Enter angezeigt sowie links/rechts blättern zwischen den Seiten - schließen ESC, aber das wäre klar.

    Nun müsste ich das aber für jede Seite einstellen, wäre es dann nicht besser, für jede Seite ein CE zu machen oder klappt das mit einem einzeigen, wo alles drin passiert (inklusive anzeigen der aufträge, cursor usw?) ?

    Blicke da noch nicht ganz durch

  2. #2
    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:
    Zitat Zitat
    Cursor bewegen

    <>Change Variable "Cursor X", set 80
    <>Change Variable "Cursor Y", set "Menüposition"
    <>Change Variable "Cursor Y" * 12
    <>Change Variable "Cursor Y" + 90
    <>Move Picture '20' "Questlog Cursor" to ["Cursor X" | "Cursor Y"] in 0,1 secs
    <>
    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.
    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:
    Zitat Zitat
    Questlog (Auszug)

    <>Enter Passwort "QL Passwort" [1,2,3,4;5;6] [wait until key hit]
    <>Fork Variable "QL Passwort" = 1
    <><>Change Variable "Menüposition" + 1
    <><>Fork Variable "Menüposition" >= 6
    <><><>Change Variable "Menüposition", set 1
    <><>End:
    <><>Change Variable "Aktuell", set "Seite Anfange"
    <><>Change Variable "Aktuell" + "Menüposition"
    <><>Change Variable "Aktuell" - 1
    <><>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <><>Fork Variable "Kontrolle" != 0
    <><><>Play SE "Cursor"
    <><><>Call Event: "Cursor bewegen"
    <><>Else:
    <><><>Play SE "Buzzer"
    <><><>Change Variable "Menüposition" - 1
    <><>End:
    <>Else:
    <> // Hier nochmal für Pfeil-hoch
    <>End:
    <>
    Was genau wird hier gemacht?
    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:
    Zitat Zitat
    Umblättern (nur Kontrolle)

    <>Change Variable "Aktuell", set "Seite Ende"
    <>Change Variable "Aktuell" + 1
    <>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <>Fork Variable "Kontrolle" != 0
    <><> // wir dürfen umblättern
    <>Else:
    <><> // nächste Seite wäre leer. Umblättern nicht erlaubt
    <>End:
    <>
    Damit wäre das erledigt.
    Nun können wir uns dem umblättern zuwenden. Das sähe so aus:
    Zitat Zitat
    <>Change Variable "Seite Anfang", set "Seite Ende"
    <>Change Variable "Seite Anfang" + 1
    <>Change Variable "Seite Ende" + 5
    <>
    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.)
    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:
    Zitat Zitat
    <>!Lable 1!
    <>Change Variable "Aktuell", set "Seite Ende"
    <>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <>Fork Variable "Kontrolle" = 0
    <><>Change Variable "Seite Ende" - 1
    <><>!Goto Lable 1!
    <>End:
    <>
    Da durch das umblättern nun auch der Cursor in ein leeres Feld projiziert werden könnte müssen wir auch das kontrollieren:
    Zitat Zitat
    <>Change Variable "Cursor Kontrolle", set "Seite Ende"
    <>Change Variable "Cursor Kontrolle" - "Seite Anfang"
    <>Change Variable "Cursor Kontrolle" + 1
    <>Fork Variable "Menüposition" > "Cursor Kontrolle"
    <><>Change Variable "Menüposition", set "Cursor Kontrolle"
    <>End:
    <>
    Was wird hier nun wieder gerechnet?
    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:
    Zitat Zitat
    Questlog (Nur Cursorbewegung)

    <>Enter Passwort "QL Passwort" [1,2,3,4;5;6] [wait until key hit]
    <>Fork Variable "QL Passwort" = 1
    <><>Change Variable "Menüposition" + 1
    <><>Fork Variable "Menüposition" >= 6
    <><><>Change Variable "Menüposition", set 1
    <><>End:
    <><>Change Variable "Aktuell", set "Seite Anfange"
    <><>Change Variable "Aktuell" + "Menüposition"
    <><>Change Variable "Aktuell" - 1
    <><>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <><>Fork Variable "Kontrolle" != 0
    <><><>Play SE "Cursor"
    <><><>Call Event: "Cursor bewegen"
    <><>Else:
    <><><>Play SE "Buzzer"
    <><><>Change Variable "Menüposition" - 1
    <><>End:
    <>Else:
    <>Fork Variable "QL Passwort" = 4
    <><>Change Variable "Menüposition" - 1
    <><>Fork Variable "Menüposition" <= 0
    <><><>Change Variable "Menüposition", set 5
    <><>End:
    <><>Change Variable "Aktuell", set "Seite Anfange"
    <><>Change Variable "Aktuell" + "Menüposition"
    <><>Change Variable "Aktuell" - 1
    <><>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <><>Fork Variable "Kontrolle" != 0
    <><><>Play SE "Cursor"
    <><><>Call Event: "Cursor bewegen"
    <><>Else:
    <><><>Play SE "Buzzer"
    <><><>Change Variable "Menüposition" + 1
    <><>End:
    <>Else:
    <>Fork Variable "QL Passwort" = 2
    <><>Change Variable "Aktuell", set "Seite Anfang"
    <><>Fork Variable "Aktuell" > 1000 // Der Anfang deiner Liste (ANPASSEN!)
    <><><>Play SE "Cursor"
    <><><>Change Variable "Seite Ende", set "Seite Anfang"
    <><><>Change Variable "Seite Ende" - 1
    <><><>Change Variable "Seite Anfang" - 5
    <><>Else:
    <><><>Play SE "Buzzer"
    <><>End:
    <>Else:
    <>Fork Variable "QL Passwort" = 3
    <><>Change Variable "Aktuell", set "Seite Anfang"
    <><>Change Variable "Aktuell" + 1
    <><>Change Variable "Kontrolle", set [VarNr: "Aktuell"]
    <><>Fork Variable "Kontrolle" != 0
    <><><>Play SE "Cursor"
    <><><>Change Variable "Seite Anfang", set "Seite Ende"
    <><><>Change Variable "Seite Anfang" + 1
    <><><>Change Variable "Seite Ende" + 5
    <><>Else:
    <><><>Play SE "Buzzer"
    <><>End:
    <>Else:
    <>...
    <>End:
    <>
    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 fragen

    mfg
    Phönix Tear

    P.S:
    Wenn ich mal wieder mehr Zeit hab kann ich ja auch mal dazu nen Skript machen xD

  3. #3
    Vielen Dank

    Mal sehen ob ich nachher Zeit finde, das Ganze mal auszubauen (bin derzeit nicht Zuhause und bleib noch ca. eine Woche weg) - habe ja extra den Maker hierhin mitgenommen um an diesem Logbuch zu werkeln, bis ich wieder Zuhause bin. Hoffe ja, dass ich es eventuell schaffe, um es dann sobald ich zurück bin ins Hauptprojekt einzubauen Das einfache Logbuch (bestehend aus Text) habe ich ja geschafft, könnte dieses auch nehmen. Nur möchte ich das andere auch umsetzen können, kann doch nicht so schwer sein, menno! ()

    Edit:

    Bin jetzt schon so ziemlich weit, müsste noch den Cursor einbauen. Folgendes habe ich erstellt:

    Common Event: Zur Freien Stelle
    Common Event: Aufruf des Logbuches (zeigt hintergrund an und leitet an nächstes CE weiter)
    Common Event: Logbuch anzeigen
    Common Event: Aufträge anzeigen

    Nun habe ich folgendes Problem: Habe mal einen NPC hineingestellt und ihn den 1. Auftrag vergeben lassen (Call Event Zur Ersten freien Stelle + Set Var. Aktuell 1) - Aufgrund der Schleife in diesem CE wird aber das gesamte Spiel geblockt sobald ich den NPC anspreche.

    Also irgendwie weiß ich nicht so recht mit dem Fahrstuhl. Wäre dann zwar einfacher zu kopieren, aber ich komme besser damit klar, wenn ich für jeden Auftrag manuell eine Variable vergebe, und diese dann bei aktiviert auf 1 setze und wenn sie erledigt ist auf 2. Irgendwas scheint da nicht klappen zu wollen, >_<

    Geändert von Jadoo (16.04.2007 um 00:16 Uhr)

  4. #4
    Hallo,

    wollte nur eine Rückmeldung geben. Ich bedanke mich nochmal für die Hilfe. Habe mich allerdings anders entschieden: Ich werde eine einfache Version des Logbuches nehmen, habe es auch schon eingebaut. Ein paar schöne Grafiken gebastelt und: mir gefällts. Und es ist leichter zu verwalten.

    Habe mir aber die Tutorials ausgedruckt und werde sie mir bei Gelegenheit nochmal ansehen. Das Testprojekt ist ja auch noch da, wenn ich da mal Zeit und Lust für habe schau ichs mir wieder an.

    Ich habe noch einige Sachen mehr mit dem Menü vor, und da ich gerne am Spiel weiterarbeiten möchte, lass ichs mit dem aufwendigen Logbuch erstmal sein. Außerdem ist es ja mein erstes Spiel

  5. #5
    Ich hab den Thread leider erst jetzt gesehen

    Ich glaube nämlich das ich sowas was du haben willst in meinem Spiel eingebaut habe XD Und das sogar recht einfach...

    Ein neues Quest in mein Script einzufügen dauert keine 3 Minuten sofern man bereits die Bilder hat. Man muss eigentlich nur eine Abfrage kopieren, Variablen und Bilder anpassen und dann wars das Das Scripot enthält halt beliebig viele Quests, sowie beliebig viele Notizen pro Quest.

  6. #6
    Kannst das Skript ja trotzdem posten, es interessiert vllt noch jemand anderes als Jadoo!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •