Hi, ich hatte gerade gestern einen Einfall für ein eigenes Item-Menü (kann man auch einfach für Skills umschreiben, einfach die Fork Condition: If Item owning ersetzen), das ich schnell umgesetzt habe. Ich finde, dass ich daraus ein Tutorial für euch erstelle muss.
Das Tutorial setzt voraus, dass man sich mit den RPG-Maker-Befehlen genaustens auskennt.
Wer sich damit nicht auskennt, sollte entweder die Eventbefehle ausprobieren (learning by doing) oder sich die Eventbefehle im E-Book anschauen.
Der Schweregrad des Tutorials ist hoch - also nichts für "blutige Anfänger".
Da ich das ganze nicht auf einmal erklären kann, werde ich den Post hier einfach weiter führen. Über Kommentare und Anmerkungen (bitte konstruktiv) wäre ich natürlich froh.
Wofür braucht man so ein eigenes Menü?
Man braucht es z.B. für eigene Kampfsysteme (wenn man nicht das Standart-RM2K/3-Kampfsystem nutzt) oder Pausenmenüs.
Die Struktur des Menüs sieht so aus:
Ob man nun 3 CommonEvents oder Ein Map-Event mit 3 Seiten erstellt, ist abhängig davon, ob ich es nur auf einer Map nutzen will oder auf vielen Maps.
Eine Map, wo das Menü genutzt werden soll -> MapEvent mit 3 Seiten
Mehrere Maps, wo das Menü genutzt werden soll -> 3 CommonEvents
Ich baue hier ein Menü für 20 Items.
I: Item-Abfrage:
Okay, am Anfang sieht der Plan so aus:
Man muss einen Skript entwerfen, der die Items abfragt und das Ergebnis in Variablen packt.
Das Skript sollte auch sehr einfach anwendbar sein, relativ klein sein und die Variablen durchsuchen und setzen können.
Na gut, das sollte genug über den Plan sein,
nun erkläre ich euch Schritt für Schritt wie ich zu dem Skript gekommen bin.
Zuerst erstelle ich das CommonEvent bzw. MapEvent (erste Seite) ItemMenü.
Dann melde ich 20 Variablen für die Items (ItemVars) an, die heißen 0001:ItemVar01 bis 0020:ItemVar20,
und 5 Variablen - 0021:Durchlauf, 0022:Wert(Durchlauf), 0023:ItemID, 0024:DurchlaufZähler und 0025:ItemZähler.
Was ich mit den Variabeln mache, erkläre ich im Laufe des Tutorials.
Nicht zu vergessen, ich vergebe den Items auch IDs (ItemID), beginnend mit 1. Die ItemID 0 steht für "kein Item da".
Ich trage bei CommonEvent bzw. MapEvent (erste Seite) ItemMenü folgendes ein: I-1. Ich erstelle ein CommonEvent "ID-Setzer" oder nutze die zweite Seite des MapEvents ItemMenü.
Das Grundgerüst des Skript bildet einen Schleife (heißt im Maker Loop bzw. Cycle), die die Variabel 0021:Durchlauf um 1 erhöht.
0021:Durchlauf enthält die ID (gemeint ist die Nummer vor dem Namen der Variablen) der ItemVars.
I-2. Man brauch natürlich eine Abbruch-Bedingung, sonst würde das Skript bis in die Unendlichkeit zählen:
Ihr fragt euch bestimmt, warum ich bei 0021:Durchlauf größer als 20 den Schleife abbrechen lasse.
Die Antwort ist ganz einfach, 20 ist die letzte ID der ItemVars.
I-3. Jetzt kommt ein Teil, wo man viel Vorstellungskraft braucht:
Man stelle sich die Variablen als nummerierte Felder vor. Kann man denn nicht über die Nummer des Feldes (ID) auf seinen
Inhalt zugreifen? Klar kann man!
Bei dem Maker gibt es bei "Choose Variable" die dritte Option "Variable [Auswahl] Variable No." und bei "Operand" gibt es diese auch.
Die Grundstruktur des Skripts sind die ItemVars (hier 20 Variablen für 20 Items), die mit der ID der Items gesetzt werden.
Wenn man diese Erkenntnisse nutzt, erhält man folgenden Code:
Was neu dazu gekommen ist, die Variabel 0022:Wert(Durchlauf), die mit dem Inhalt der Variable von 0021:Durchlauf gefüllt wird,
ein Fork Condition, die schaut ob 0022:Wert(Durchlauf) 0 (= leer) ist, wenn ja wird die Variabel von 0021:Durchlauf gleich der ItemID gesetzt. Das Skript scheint schon fast fertig zu sein, 2 Kleinigkeiten fehlen jedoch noch.
I-4. Wenn man das Skript von 3. laufen lässt, kommt man zu einem ernüchterndem Ergebnis:
Es setzt alle ItemVars die 0 sind mit der selben ItemID. Es fehlt noch eine Abbruch nach dem Setzen der ItemID.
Zusätzlich habe ich noch einen Itemzähler eingebaut, der zum Schluss sagt wie viele Items da sind,
und 0021:Durchlauf um eins erhöht, warum komm ich später noch mal drauf zurück. I-5. Wenn man 0021:Durchlauf größer als 20 setzt, kann ja mal passieren, funktioniert das Skript nicht.
Er braucht noch etwas damit 0021:Durchlauf wieder auf 1 zurück gesetzt wird.
Das Sktipt sieht dann so aus:
Das Zurücksetzen soll er nur 1 mal machen.
I-6. Ich komme nun auf das CommonEvent bzw. MapEvent (erste Seite) ItemMenü zurück.
Bis jetzt ist die Item-Abfrage noch nicht vollständig, es fehlt noch die Abfrage der anderen 19 Items.
Für jedes der 19 verbleibenden Items muss noch folgender Code hinzugefügt werden:
(Das X durch die Zahl ersetzen).
Das CommonEvent bzw. MapEvent (erste Seite) ItemMenü sollte dann so etwa aussehen: II: Bilder anzeigen:
"Bilder? Moment, welche Bilder?" kommt bei dem ein oder anderen bestimmt als Frage auf.
Ja, man braucht für das Menü Bilder.
Ich habe mir 20 152x16-Pixel-große Bilder mit einem Rahmen und dem Text, wie das Item heißt, erstellt.
(Die sind dann im Beispielmenü, das ich noch hochladen werde, drin.)
Ich habe mich hier für das Tutorial für ein 5-zeiliges Menü entschieden.
Es kann z.B. so aussehen:
II-1. Ich erstelle ein CommonEvent "Bild-Zeigen" oder nutze die dritte Seite des MapEvents ItemMenü.
Aber erst mal wieder zurück zu dem CommonEvent bzw. MapEvent (erste Seite) ItemMenü:
Ich erstelle die Variablen 0030:ItemMenü-X, 0031:ItemMenü-Y, 0032:Item-Anzeig1-Y, 0033:Item-Anzeig2-Y, 0034:Item-Anzeig4-Y, 0035:Item-Anzeig5-Y,
0036:Anzeig1-ID, 0037:Anzeig2-ID, 0038:Anzeig3-ID, 0039:Anzeig4-ID und 0040:Anzeig5-ID.
II-2. Ich hab mir folgenden Code geschrieben (Ohne den Pic-Pointer-Patch geht das nicht anders),
der die gerade in 0036:Anzeig1-ID bis 0040:Anzeig5-ID mit dem passenden Bild anzeigt.
PS: Falls jemand da einen andere Idee hat, wie man die ganzen Fork-Conditions vermeidet (ohne Pic-Pointer-Patch), immer her damit!
Ohne große Erklärung das CommonEvent "Bild-Zeigen" oder nutze die dritte Seite des MapEvents ItemMenü: III: Tasten abfragen:
Das ganze Skript kann jetzt schon die Items abfragen und die ersten 5 Items als Bilder anzeigen.
Es fehlt aber die Menü-Steuerung über die Tastatur.
III-1. Bevor man Hals-über-Kopf anfängt Code zu schreiben, erstmal die Festlegung, wie das Menü sich verhalten soll.
(Wer drauf steht, kann sich da ein Stück Papier und einen Bleistift nehmen.)
Das Menü ist wie ein Buch mit Seiten aufgebaut, je 5 angezeigte Items sind eine Seite.
Da wird dann so gesteuert:
- Hoch/Runter -> Auswahl der 5 Zeilen des Menüs ändern (von letztem<->ersten Zeile)
- Links/Rechts -> Die vorigen/nächsten 5 Items anzeigen (vorigen/nächsten Seite)
- Enter -> Item auswählen
- ESC -> Item-Menü schließen
III-2. Wie bereits in III-1 beschrieben ist das Menü aus Seiten à 5 Items aufgebaut.
Wieviele Seiten hab ich bei x Items?
Die Seiten, die ich im Gedächtnis habe, gebe ich Nummern, beginnend mit 0.
(Also erste Seite -> 0, zweite Seite -> 1, dritte Seite -> 2, usw.)
Wieder zurück zu dem CommonEvent bzw. MapEvent (erste Seite) ItemMenü:
Ich erstelle wieder ein zwei Variablen: 0041:ItemMaxSeite und 0042:Mod5-Test.
Folgender Code füge ich bei CommonEvent bzw. MapEvent (erste Seite) ItemMenü hinten hinzu: III-3. Das Item-Menü weiß wie viele Seiten ich habe, aber ich weiß es nicht.
Also habe ich mir eine kleine Scrollbar gemacht, die sich mir das anzeigt.
Ich nenne das mal Seitenanzeiger. (Das Bild ITEM-SeitenAnzeiger wird im Beispielprojekt drin sein)
Ich erstelle mal wieder ein paar Variablen: 0043:SeitenAnzeigerX, 0044:SeitenAnzeigerY und 0045:SeitenAnzeigerX-vers.
Diesen Code füge ich bei CommonEvent bzw. MapEvent (erste Seite) ItemMenü hinten hinzu:
Positiv
Du baust das ganze so auf, das du den Code Stückchen für Stückchen erklärst. Du erklärst recht ausführlich was deinen Code selbst angeht. Du bemühst dich sichtbar die Zusammenhänge zu erklären die zu dem Menü führen sollen.
Negativ
Da fehlt eine Menge Vorerklärung. Die meisten Nutzer die mit dem Maker arbeiten können mit einer Schleife oder einem Array nicht das geringste anfangen. Auch ein Pointer ist alles andere als geläufig. Du solltest diese Begriffe genauer erklären als du es im Text tust. Selbst ein Fortgeschrittener dürfte sich schwer tun ohne jede Erklärung diese Elemente zu verstehen.
Du kommentierst deinen Quellcode nicht. Das sollte man in einem Tutorial tun, um hierbei mit gutem Beispiel voran zu gehen. Außerdem würde dein Code dadurch wesentlich lesbarer werden.
Zum dritten solltest du bevor den Code einwirfst erstmal genau die Struktur deiner Menükonstruktion erklären. Fang doch erstmal mit einer Arrayerklärung an. Und das dieses Array das Inventar darstehen soll. Nimm ein wenig das abstrakte raus. Das ist verständlich. Danach erkläre mal welche CE / Mapevents nötig sind. Was ihre Funktion ist. In Kurzform natürlich. Dann hat man schonmal einen groben Überblick was man da vor sich hat.
Mein vierter Einwand bezieht sich auf deine Erklärungen an sich teilweise. Da fehlt stellenweise etwas was deinem Leser hilft deine Gedankengänge nach zu vollziehen. Bsp.:
Zitat
Den Skript packe ich in eine CommonEvent oder MapEvent und nenne es "Item-ID-Setzer". Die Startbedingung lasse ich so wie sie ist.
Der Skript alleine funktioniert nicht, man braucht noch ein Event, dass den Skript nutzt.
...
Dieser Abschnitt wirkt ein wenig so als würden da Informationen fehlen. Warum ist es egal ob es ein CE oder ein ME ist? Du lässt die Startbedingungen auf Standard ok. Warum tust du das? Wohl weil du den Inhalt per "Call" nutzen willst. Nur sowas weiß dein Leser in dem Moment nicht. Das verunsichert jemanden der gerade erst lernt zusätzlich.
Das fünfte und letzte ist die sprachliche Seite. Es ist das Skript. Nicht der Skript. Kleinere Rechtschreibfehler sind auch drin gewesen. Wenn auch nichts gravierendes.
Wichtiger wäre es das du ein wenig "Textdesign" betreibst. Du hast BB Codes zur Verfügung, nutze sie um dein Texttutorial etwas ansehnlicher zu gestalten. Der Event Exportierer von Cherry stellt einen farbigen Style für deine Codes zur Verfügung. Nutze ihn, das ist gleich viel besser lesbar. Staffel deinen Text in klar erkennbare Abschnitte mit Überschriften. Auch das ein oder andere Bild lockert auf. Besonders beim erklären z.B. von Arrays bietet sich das an.
Schlussendlich
Hoffe du fühlst dich nun nicht "gebügelt". Aber das sind die Dinge die mir persönlich dort gefehlt haben. Vielleicht nützt dir ja einiges was und du führst das Tutorial zuende.
Positiv
Du baust das ganze so auf, das du den Code Stückchen für Stückchen erklärst. Du erklärst recht ausführlich was deinen Code selbst angeht. Du bemühst dich sichtbar die Zusammenhänge zu erklären die zu dem Menü führen sollen.
...
Oja, da hat mich ein Sortier-Skript inspiriert (und laute Musik), den ich für den Item-Menü geschrieben habe. Davor war alles voller Fork-Conditions, die unglaublich riesig waren. Ich finde den Skript so genial, dass ich den einfach mit anderen teilen muss.
Zitat von makenshi
Negativ
Da fehlt eine Menge Vorerklärung. Die meisten Nutzer die mit dem Maker arbeiten können mit einer Schleife oder einem Array nicht das geringste anfangen. Auch ein Pointer ist alles andere als geläufig. Du solltest diese Begriffe genauer erklären als du es im Text tust. Selbst ein Fortgeschrittener dürfte sich schwer tun ohne jede Erklärung diese Elemente zu verstehen.
Du kommentierst deinen Quellcode nicht. Das sollte man in einem Tutorial tun, um hierbei mit gutem Beispiel voran zu gehen. Außerdem würde dein Code dadurch wesentlich lesbarer werden.
Zum dritten solltest du bevor den Code einwirfst erstmal genau die Struktur deiner Menükonstruktion erklären. Fang doch erstmal mit einer Arrayerklärung an. Und das dieses Array das Inventar darstehen soll. Nimm ein wenig das abstrakte raus. Das ist verständlich. Danach erkläre mal welche CE / Mapevents nötig sind. Was ihre Funktion ist. In Kurzform natürlich. Dann hat man schonmal einen groben Überblick was man da vor sich hat.
Mein vierter Einwand bezieht sich auf deine Erklärungen an sich teilweise. Da fehlt stellenweise etwas was deinem Leser hilft deine Gedankengänge nach zu vollziehen. Bsp.:
Dieser Abschnitt wirkt ein wenig so als würden da Informationen fehlen. Warum ist es egal ob es ein CE oder ein ME ist? Du lässt die Startbedingungen auf Standard ok. Warum tust du das? Wohl weil du den Inhalt per "Call" nutzen willst. Nur sowas weiß dein Leser in dem Moment nicht. Das verunsichert jemanden der gerade erst lernt zusätzlich.
Das fünfte und letzte ist die sprachliche Seite. Es ist das Skript. Nicht der Skript. Kleinere Rechtschreibfehler sind auch drin gewesen. Wenn auch nichts gravierendes.
Wichtiger wäre es das du ein wenig "Textdesign" betreibst. Du hast BB Codes zur Verfügung, nutze sie um dein Texttutorial etwas ansehnlicher zu gestalten. Der Event Exportierer von Cherry stellt einen farbigen Style für deine Codes zur Verfügung. Nutze ihn, das ist gleich viel besser lesbar. Staffel deinen Text in klar erkennbare Abschnitte mit Überschriften. Auch das ein oder andere Bild lockert auf. Besonders beim erklären z.B. von Arrays bietet sich das an.
...
Leider hat es den Nachteil das man bei dem farbigen Style nach meinem Wissen keine Code-Tags mehr nutzen kann. Ich habe übrigens extra nicht rein geschrieben, ob man ein CE oder ME nutzen soll.
"Das" Skript, aha - naja selbst andere die ich kenne sagen "der" Skript - da scheint es wohl eine Dialekt-mäßige Sache sein.
Ich denke, dass ich die Fachbegriffe einfach verlinke (Wikipedia lässt grüßen) oder entferne, die im Text zu erklären, würde den Rahmen des Tutorials sprengen. Das Skript habe ich komplett umgeschrieben, da ich ihn aus meinem Projekt herausziehen musste.
Zitat von makenshi
Schlussendlich
Hoffe du fühlst dich nun nicht "gebügelt". Aber das sind die Dinge die mir persönlich dort gefehlt haben. Vielleicht nützt dir ja einiges was und du führst das Tutorial zuende.
~Makenshi
...
Ich war auf wesentlich härtere Kritik eingestellt. Das ist mein erstes Tutorial, ich bin bereit aus meinen Fehler zu lernen.
Man kann das übrigens den Code von 5. auch für "Zauberei"/Technik-Menüs nutzen.
Schlussendlich werde ich einfach mal das Menü hochladen, mit Beispiel-Pictures, usw.
PS: Da die meisten Spiele ja auf Maus-Steuerung verzichten oder diese nicht unterstützen werde ich das mit Tastatur-Steuerung schreiben.
Die Begriffe ausführlich zu erklären ist sicherlich falsch. In Fachbüchern wird es gerne so gehandhabt das man sie erklärenderweise anreißt. Und dann auf weiterführende Tutorials verweißt. Wikidpedia Links würde ich vermeiden, meist erklären sie solche Begriffe nicht sehr verständlich.
Hm, welchen Zweck verfolgst du damit das du eine, doch nicht unwichtige Sache, nicht erklärst?
Die Code-Tags sind auch nicht notwendig, weil der EventExporter mit einem anderen Trick für Einrückungen sorgt und das ganze auch in einen Quote packt, damit es sich vom anderen Text abhebt.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
~PUSH~ Es gibt wieder was neues, das Tutorial wird so langsam fertig.
Zitat von Cherry
Die Code-Tags sind auch nicht notwendig, weil der EventExporter mit einem anderen Trick für Einrückungen sorgt und das ganze auch in einen Quote packt, damit es sich vom anderen Text abhebt.
...
Das Problem ist bloß, dass es das Beispielprojekt noch gar nicht gibt.
Ich kopiere mir den Code aus meinem Projekt heraus und ändere ihn per Hand, so dass es mit den Variablen passt.
Ich werde das über den EEE mit einem Template machen, wenn das Beispielprojekt fertig ist.