Voltofalle (Pokémon) | Grandrorials

  • i_RMMV


    !Ich möchte hier noch einmal erwähnen, dass meine Tutorials recht anspruchsvoll ausfallen werden!




    Hallo,


    ich wollte mich einmal an meinem ersten Tutorial wagen, da ich meine Eventkünste gerne mit euch teilen würde und ich denke, dass es der ein oder andere interessant bzw. hilfreich finden wird.

    Hierbei geht es um das Minispiel "Voltofalle", welches man vielleicht aus dem Pokémon Spielen HeartGold und SoulSilver kennt.

    Ich habe hierzu auch noch ein Youtube-Video, nur zur Veranschaulichung:




    Ganz unten findet ihr dann noch einen Downloadlink zu dem Projekt. Dann müsst ihr nicht alles mühsam abeventen, oder wie man es auch immer nennen mag :P

    Außerdem habe ich hier noch einen Screenshot von der Map, mit Beschriftung der Events. Damit ihr wisst was ich nacher mit "Event 1" oder "Event 2" meine.




    Okay, ich denke alles ist gesagt. Dann fangen wir doch mal an!


    1) (Notwendige) Plugins


    Ich habe in meinem Beispiel zwei Plugins verwendet.


    1) YEP_CoreEngine (Zum verändern der Bildschirmgröße auf 1152x864) Zu finden im DLC Ordner: \Steam\steamapps\common\RPG Maker MV\dlc\RPGmakerWeb_plugins\Yanfly\YEP_CoreEngine

    2) Ein beliebiges "Skip Title Screen" Plugin. Zu finden im DLC Ordner: \Steam\steamapps\common\RPG Maker MV\dlc\RPGmakerWeb_plugins\Yami\Yami_SkipTitle


    3) Außerdem kann ich jedem den "Preload Manager" an's Herz legen, da dieser alle Ressourcen die auf einer Map verwendet werden beim Spielbeginn läd, was besonders bei Bildern eine echte Abhilfe schafft. !Das gilt nicht bei Ressourcen die via Script aufgerufen werden!

    Zu finden im DLC Ordner: \Steam\steamapps\common\RPG Maker MV\dlc\RPGmakerWeb_plugins\Galenmereth\TDDP_PreloadManager


    2) Die maximale Anzahl verwendbarer Bilder ID's erhöhen.


    Da ziemlich viele Bilder verwendet werden und es auch zur Übersicht besser ist, wenn man bestimmte Bildtypen in eine gewissen Range von ID's einordnen kann, müssen wir etwas im "rpg_objects.js" verändern:


    www.bilder-upload.eu



    Nun haben wir statt den Voreingestellten 100 ID's eine maximale Anzahl von 200 ID's.



    3) Den 25 Karten einen Wert zwischen 1-4 geben


    Wieso den Werten 1-4? Das Spiel hat 4 Werte, die eine Karte haben kann: 1 Punkt, 2 Punkte, 3 Punkte oder eine Bombe. daher:


    Variable auf Wert 1: 1 Punkt

    Variable auf Wert 2: 2 Punkte

    Variable auf Wert 3: 3 Punkte

    Variable auf Wert 4: Bombe


    Außerdem muss man bedenken, dass es im ersten Level "nur" 6 Bomben geben soll. In jedem weiteren Level soll es dann eine Bombe mehr sein jeweils.



    Eventseite 1 (Event 1)





    Diese Eventseite wird immer aufgerufen, bevor ein neues Level beginnt. Hier werden Werte die in dem nächsten Level wieder auf 0 sein sollen zurückgesetzt.

    Ich habe die jeweiligen Befehle unterteilt und werde diese nun erklären:


    1) Die Bombenanzahl entspricht immer dem Level += 6. Eigentlich wäre es += 5, aber die Level-Variable wird erst am Schluss erhöht.


    2) Zurücksetzen der Variablen, die via Script erstellt wurden. Diese sind momentan unbedeutend, ich habe sie für das Markieren der Felder benutzt um Variablen in der Engine einzusparen. Außerdem wird der Score zurückgesetzt. (Nicht der eigentliche, dieser wird eigentlich für etwas anderes verwendet. Unzwar für das Ausgeben des Scores in die Konsole.)


    3) Eine kleine Schleife, die alle Bilder bis zur ID 200 löscht. Die Variable die hierbei verwendet wurde, ist nur ein Platzhalter. Der Name hat somit keine Bedeutung.

    Code
    1. Script: $gameScreen.erasePicture($gameVariables.value(33)); // Löscht das Bild mit der ID der Variable mit der ID 33. Da in der Schleife diese Variable immer um 1 erhöht wird, werden alle bis 200 gelöscht.


    4) Setzt alle Werte der Felder wieder zurück auf 0, da diese auf der nächsten Eventseite neu gesetzt werden.


    Eventseite 2 (Event 1)





    Diese Eventseite habe ich extra nicht unterteilt, da es schlichtweg nicht gescheit geht. Daher erkläre ich einfach jeden Befehl so gut wie ich es noch kann, da diese Eventseite die Kacke wirklich zum dampfen bringt.


    1. Label A wird dafür verwendet um zurück zum Eventanfang zu springen wenn eine gewisse Bedingung nicht erfüllt wurde

    2. Die Bedingung ob Feld25 nicht 0 ist, bestätigt, dass alle Felder von 1 - 25 bereits einen Wert zugewiesen bekommen haben, wenn sie mit Ja beantwortet werden kann.

    3. Die Bedingung ob Bomben = Bombenanzahl ist, fragt ob soviele Felder den Wert einer Bombe haben, wie in dem Level existieren sollen.

    4. Die Bedingung ob Feld24 nicht 0 ist (wenn Feld 25 nicht 0 ist), existiert eigentlich nur wegen einem Fehler den ich mir selbst nicht ganz erklären kann. Manchmal hat sich das System aufgehangen, aber dieser Befehl behebt dieses Problem.

    5. Die Variable "Zufall" wird einem zufälligen Wert von 1-4 zugewiesen. Du weißt nicht wieso? Dann würde ich aber nochmal den Überpunkt Schritt 3) lesen!

    6. Wenn ein Feld den Wert einer Bombe bekommen soll:


    - Dürfen noch nicht genügend Bomben für das Level existieren (Daher Bomben < Bomben Anzahl)

    - Die Variable mit der ID von dem Wert der Variable mit der ID 2 (Kartennummer) darf nicht bereits 4 sein (daher eine Bombe), da sonst das System die Variable der Bomben um 1 erhöhen wurden, obwohl keine Bombe hinzu käme.

    - Die Variable mit der ID von dem Wert der Variable mit der ID 2 (Kartennummer) wird auf 4 gesetzt, wenn die Bedingung darüber erfüllt wurde.

    - Wird die Variable "Bomben" um 1 erhöht, wenn die Bedingung darüber erfüllt wurde.


    7. Es wird nochmal abgefragt ob alle Felder einen Wert zugewiesen bekommen haben. Wenn Ja, geht es zurück an den Anfang (Label A).

    8. Je nach Level wird die Wahrscheinlichkeit verändert, eine hohe Zahl zu bekommen. (Je höher der Level, desto wahrscheinlicher ist es eine höhere Zahl zu bekommen, da es ja auch mehr Bomben gibt. Daher wird man für das Bewältigen der Schwierigkeiten belohnt.)

    Und wenn die Variable mit dem Wert der Variable mit der ID 2 keine Bombe ist (Also Wert 4) wird die Variable mit dem Wert der Variable mit der ID 2 auf den Wert der Variable mit der ID 1 gelegt (Karte bekommt den Wert von Zufall).

    9. Es wird überprüft, ob nun genügend Bomben existieren und wenn nicht geht es zurück an den Anfang (Label A).

    10. Wenn nun aber alles passt, sind die Einstellungen der Felder fertig und das neue Level kann beginnen... zumindest... theoretisch. Am Ende wird noch die Variable der Kartennummer, die einen Wert erhalten soll um 1 erhöht, damit jede Karte einen Wert erhält.


    Scripts:

    Code
    1. if ($gameVariables.value($gameVariables.value(2)) !== 4) { // Bedingung ist erfüllt, wenn der Wert der Variable mit der ID von dem Wert der Variable Kartennummer nicht 4 (Bombe) ist.
    2. $gameVariables.setValue($gameVariables.value(2), 4); // Die Variable mit der ID von dem Wert der Variable mit der ID 2 (Kartennummer) wird auf den Wert 4 (Bombe) gesetzt.
    3. $gameVariables.setValue(3, $gameVariables.value(3) + 1); // Die Variable, welche für die Anzahl der Bomben benutzt wird, wird um 1 erhöht.
    4. }

    Code
    1. if ($gameVariables.value($gameVariables.value(2)) !== 4) { // s. oben
    2. $gameVariables.setValue($gameVariables.value(2), $gameVariables.value(1)); // Die Variable mit der ID von dem Wert der Variable mit der ID 2 (Kartennummer) wird auf den Wert von der Variable mit der ID 1
    3. } (Zufall) gesetzt.


    Eventseite 3 (Event 1)




    Auf dieser Eventseite werden nur die Bilder zu den Karten angezeigt. Und diese immer in einem Abstand von 150 Pixeln X und 150 Pixeln Y. Die genauen Maße und Grafiken werde ich ganz am Ende noch einmal nennen.

    Ganz am Ende werden noch die Variablen auf 0 gesetzt, die dann die einzelnen Stellen des Scores repräsentieren werden.


    Eventseite 4 (Event 1)




    FeldZeiger: Diese Variable hat den Wert von der Karte, die der Spieler momentan ausgewählt hat. Dies geschieht über den folgenden Script:


    Code
    1. FeldZeiger = 0; // FeldZeiger wird wieder auf 0 gesetzt (Zugegebener Maßen in diesem Fall komplett unnötig xD)
    2. FeldZeiger = $gameVariables.value($gameVariables.value(29) + 3); // FeldZeiger wird auf den Wert von der Variable mit der ID von dem Wert von der Variable 29 gesetzt. Da aber Feld1 bei mir die Variablen ID 4
    3. hat und die Variable 29 (Welches Feld man auswählt) Feld1 meint, wenn es den Wert 1 hat, muss hier die ID von dem Wert der Variable 29 +3
    4. genommen werden.

    Damit könnte man in der Konsole (Welche man mit F8 öffnet) folgendes eingeben: console.log(FeldZeiger); Und ihr werdet erfahren welchen Wert das ausgewählte Feld hat!


    Doch wofür wird das denn nun verwendet? Ganz einfach! Woher soll das System denn sonst wissen, ob man nun eine Bombe aufgedeckt hat und verloren hat, oder alle Felder aufgedeckt hat und dadurch gewonnen hat?

    Deshalb wird dann auch abgefragt, ob das Feld welches man zuletzt aufgedeckt hat und das Spiel beendet hat, eine Bombe war. Wenn es eine Bombe war, wird einfach die Textbox mit "Du hat gewonnen übersprungen". (Der Rest wird wo anders geregelt).

    Zuletzt wird das Event wieder auf Anfang geschalten, dass heißt alle Self Switches werden wieder aus gemacht.


    4) Visualisierung und Steuerung


    Eventseite 1 (Event 2)




    Auf dieser Eventseite wird das Bild angezeigt, dass visualisiert, welches Feld der Spieler momentan ausgewählt hat.


    Eventseite 1 (Event 3)




    Auf dieser Eventseite ist die Steuerung für das was im vorherigem Event visualisiert wurde. Hierbei wird die Variable jeweils so verändert:


    Rechts: +1

    Links : -1

    Unten : +5 (Da genau 5 Felder in eine Reihe passen, ist ein Feld darunter genau 5 Felder weiter)

    Oben : -5 (Da genau 5 Felder in eine Reihe passen, ist ein Feld darüber genau 5 Felder weiter)


    Außerdem wird, wenn man die Aktionstaste drückt, der Schalter "Feld Triggered" ausgelöst, was wir aber gleich erst auf der nächsten Eventseite dieses Events sehen werden.

    Außerdem werden sich manche jetzt wahrscheinlich wundern, was denn jetzt passieren würde wenn die Variable z.B. = 1 ist und man nach links drückt. Das wird aber in einem anderen Event gehandhabt, also geduldet euch :p.


    Eventseite 2 (Event 3)




    Ich hoffe wirklich, dass ich euch damit keinen Schrecken eingejagt habe xD. Was auf den ersten Blick wie ziemlich viel aussieht, ist eigentlich ziemlich wenig. Man hatte dieses ganzen Befehle mit ein paar Scriptkenntnissen leicht komprimieren,

    allerdings finde ich das Ausführliche meist auch übersichtlicher und so ein bisschen Copy & Paste tut ja auch nicht weh.


    1) Als erstes wird abgefragt welches Feld momentan markiert ist.

    2) Wenn der Wert dieser Felder (Die auf 1-4 zugewiesen wurden) nicht 0 ist, sind diese Felder aufdeckbar. (Die Felder werden nacher 0 zugewiesen, und haben somit den Wert von "aufgedeckt")

    3) Es spielt die Kartenaufdeckanimation ab.

    4) $gameScreen.erasePicture(116); löscht das Bild mit der ID 116. In dem Fall die Markierung einer Karte. (Da diese ja nicht mehr braucht, wenn man das Feld aufgedeckt hat).

    5) Je nachdem welchen Wert die Karte hatte, wird ein anderes Bild angezeigt. 1,2,3 oder Bombe. Und wenn die Karte keine Bombe ist, werden die Punkte in den Score verrechnet.


    Ja, dass war eigentlich das ganze Event..., nur eben 25 mal kopiert für jede einzelne Karte.

    Ganz am Ende werden noch die Einstellungen getroffen, die bei Eventseite 4 (Event 1) noch nicht getroffen wurden.


    Code
    1. $gameScreen.erasePicture(116); // Löscht das Bild mit der ID 116


    Eventseite 1 (Event 4)




    Für den perfekten Kontrast, nun nicht das längste, sondern das wahrscheinlich kürzeste Event für dieses Tutorial. Dies habe ich nur in ein neues Event gemacht, damit es keine Verzögerung zwischen Steuerung und Zurücksetzung der Position gibt.

    Dieses Event ist eigentlich ziemlich Selbsterklärend.


    Da es keine 0te Karte gibt : ----> Kartenvariable auf 25 setzen.

    Da es keine 26te Karte gibt: ----> Kartenvariable auf 1 setzen.


    5) Anzeige von allerlei Werten


    Eventseite 1 (Event 5)




    Hier wieder dasselbe, wie bei dem früheren Event. Es sieht nach viel aus, ist es aber nicht.

    Dieses Event rechnet immer die Werte von den Feldern in einer Reihe zusammen und lässt dann dem entsprechend die Bilder mit den Zahlen anzeigen, die man dann in den grünen Kästen darunter sehen kann.

    Da es insgesamt 5 Reihen von unten gibt und 5 Reihen von rechts, ist der ganze Vorgang dort 10 mal, nur mit eben diesen Feldern die in der Reihe vorkommen.


    Beispiel:


    1 Reihe Unten: Wert Feld 1 + Wert Feld 6 + Wert Feld 11 + Wert Feld 16 + Wert Feld 21 = Reihe


    Ganz am Ende wird das Event wieder ausgeschalten, da man die Bilder ja nicht aktualisieren muss, weil sich ja nichts daran ändert bis zur nächsten Runde.


    Code
    1. console.log($gameVariables.value(30)); // Fügt den Wert der Variable 30 (Wert einer Reihe) in die Konsole ein. Dies dient nur zu Testzwecken.


    Eventseite 1 (Event 6)




    Dieses Event dient für die Markierungen die man an die Karte anbringen kann. Diese wird spielerisch am besten dafür verwendet, eine Bombe zu markieren, da man jede andere Zahl aufdecken kann.

    In dem Fall kann mit der Taste "A" eine Markierung anbringen.

    Könnt ihr euch erinnern, wie wir ganz am Anfang Variablen die wir mit Scripts erstellt wieder auf 0 gesetzt haben? Genau diese kommen jetzt zum Einsatz. z.B.:


    Feld1 = 0; // Feld ist nicht markiert (Markierung kann angebracht werden)

    Feld1 = 1; // Feld ist markiert (Markierung kann wieder entfernt werden)


    Wenn nun also A gedrückt wird, wird an der Stelle, wo sich der Cursor befindet, entweder eine Markierung angebracht und die Variable Feld[Cursorposition] auf 1 gesetzt, oder eine Markierung wird entfernt und die Variable Feld[Cursorposition] wird auf 0 gesetzt. Bedingung für diesen Vorgang ist natürlich, dass das Feld nicht den Wert 0 hat. Denn dann wurde es schon aufgedeckt und deshalb ist keine Markierung mehr von Nöten.


    Code
    1. z.B. <Feld1 = 0> // Feld wird auf 0 gesetzt = Feld ist markierbar , <Feld1 = 1> // Feld wird auf 1 gesetzt = von dem Feld kann die Markierung entfernt werden

    Code
    1. $gameScreen.showPicture(116, 'Karte_Mark', 0, 210, 60, 100, 100, 255, 0); // Scriptbefehl für das Anzeigen eines Bildes. (ID, Name, Ausrichtung, X, Y, Skalierung X, Skalierung Y, Deckkraft, BlendMode)


    6) Umrechnung des Scores


    Eventseite 1 (Event 7)




    In diesem Event wird der Score, welcher sich auf Variable 32 befindet, in 6 Variablen unterteilt, die jeweils die Stellen des ganzen Scores beinhalten sollen. Also, in diesem Fall heißen die Variablen: Score (1st Digit), ... usw. Also:


    133245 =


    1st Digit : 5

    2nd Digit : 4

    3rd Digit : 2

    4th Digit : 3

    5th Digit : 3

    6th Digit : 1


    Nur so als Beispiel.

    Dafür wird zuerst eine zweite Variable auf den Wert des Scores gesetzt, weil wir die eigentliche Score Variable nicht verändern dürfen und dann wird durch simple Mathematik die Zahl so dezimiert, dass man immer herauslesen kann, welchen Wert welche

    Stelle hat. Ich denke, wenn man sich das genauer anguckt, wird man von selbst verstehen wie das funktioniert.


    Code
    1. Score = 0; // Setzt die Variable Score auf 0 (nicht die von den Maker-Variablen).
    2. Score += $gameVariables.value(32); // Fügt den Score von den Maker-Variablen der Variable Score des Scripts hinzu
    3. console.log("Der Score beträgt" + " " + Score); // Fügt den Score in die Konsole : "Der Score beträgt [Score]". Dies dient nur zu Testzwecken.


    7) Anzeige des Scores und des Levels


    Eventseite 1 (Event '8)




    Dieses Event zeigt den Score an via Scriptbefehl und färbt die Bilder davon dann weiß [255,255,255].


    1st Digit ganz rechts und dann der Reihe nach links daneben.

    Code
    1. $gameScreen.tintPicture(111,[255,255,255],1); // Färbt das Bild mit der ID 111 weiß [255,255,255] in 1 Frame.


    Eventseite 1 (Event 9)




    Und zu guter Letzt, die Anzeige um anzuzeigen, in welchem Level man sich befindet. Auch hier werden wieder je nach Level Bilder via Scripts angezeigt und weiß gefärbt.


    8') Verwendete Bilder


    Wenn ihr euch das Projekt runterladet werdet ihr sowieso sehen, welche Bilder verwendet wurden. Hier trotzdem nochmal eine kleine Liste:


    - Die Zahlen 0-9

    - Bombengrafik

    - Kartengrafik (+ Umdrehanimation)

    - Kartenmarkierung

    - Level

    - Kasten zum Anzeigen der Bomben und Werte in einer Reihe

    - Roter Kasten zur Visualisierung welches Feld ausgewählt ist


    9) Downloadlink des Projektes


    http://www.mediafire.com/file/…alle+Tutorial+Grandro.zip


    In dem Projekt sind keine RTP-Dateien enthalten.


    10) Ende


    Wie hat euch das Tutorial gefallen? Gibt es irgendwelche Verbesserungsvorschläge? Irgendwelche Wünsche für ein Tutorial? Ich würde mich über Rückmeldung freuen.


    Das nächste Tutorial wird ein Event-Titelbildschirm mit Animationen und sowas ^^. Ich hoffe es besteht Interesse.



    - Grandro



    Dieser Beitrag wurde bereits 7 Mal editiert, zuletzt von Grandro ()

  • ^^ Ich muss bei meinem Tutorials auch öfter zwischen speichern. Kein Problem, hetz dich nicht und poste einfach noch mal darunter, wenn es vollendet ist, um es wieder hoch zu pushen.


    Und schon einmal vielen Dank für diese ausführliche Tutorial!

  • Wow, ein klasse Tutorial. Lang, ausführlich und klar gegliedert.:thumbup:

    Ich kannte das ganze noch nicht, da ich diese Pokemon-Teile nie gespielt habe.

    Es sieht ein bisschen aus, wie ein Mix zwischen Sudoku und Minesweeper.


    Ich freue mich schon auf das nächste Tutorial. Animierter, eventeter Startbildschirm ist ein Klassiker. Das kann man dann sicher ganz oft weiter empfehlen. :)

  • Also ich muss sagen... ein wahnsinnig geiles Tutorial / Projekt!!! ^^:thumbup::thumbup:

    Habe es eben probiert und bin prompt gescheitert xD

    Obwohl ich von der PKM Version schon noch Erfahrung haben sollte.


    Manchmal ist es auch gar nicht so einfach...

    Aber nichts desto trotz eine hammer Idee und ich freue mich ebenso auf weitere Tutorials von dir! :D

    Btw. die Demo ist sehr hilfreich.

    :s_info: Ehemalig in dieser Community als Toothless bekannt, habe ich nun meinen Künstlernamen angenommen: Cryptogene

    So manch einer kennt ja ohnehin schon meine 3D Szenen.


    ninja_pointright Ihr wollt euch für das Forum bedanken und dieses zu 100% unterstützen? Ihr könnt uns finanziell durch eine Schenkung unterstützen. Danke für euren Support!