Beiträge von Grandro

    Stimmt nicht, das würde Eier und besiegte Pokémon miteinbeziehen.

    Ich hatte oben einen Schnipsel bereits erwähnt

    Code
    1. $Trainer.ablePokemonCount >= 3

    wäre die zu erfüllende Bedingung

    Stimmt, habe ich leider nicht drüber nachgedacht. Mein Fehler.

    Ich werde das Projekt wieder runternehmen, mehr kann ich sowieso nicht tun um die Frage zu beantworten...


    Du kannst die Texte natürlich löschen, auch Variablen Indexe musst du gegebenenfalls anpassen.

    Da es keine wirkliche Funktion gibt um n Pokémon aus seinem Team auszuwählen (geschweige denn mit n Pokémon aus dem Team einen Kampf zu starten), wird das ganze etwas komplizierter, als du vielleicht denkst :S


    Es gibt eine Dokumentation und dort einen Eintrag wie man aus seiner Party 1 Pokémon auswählt: Link

    Wir müssen also:

    1) Überprüfen ob der Spieler überhaupt 3 Pokémon hat. $Trainer.ablePokemonCount >= 3

    2) In einer Schleife den Spieler ein Pokémon auswählen lassen. pbChooseAblePokemon(var1, var2)

    var1 ist die ID der Variable in welcher der Index des ausgewählten Pokémon gespeichert wird

    var2 ist der (Nick-)Name des ausgewählten Pokémon

    3) Überprüfen ob der Spieler die Auswahl abgebrochen hat. var1 < 0

    4) Überprüfen ob der Spieler ein bereits ausgewähltes Pokémon erneut ausgewählt hat.


    Nun haben wir zwar 3 Pokémon ausgewählt, allerdings müssen wir ja auch noch einen Kampf, nur mit den 3 starten.

    Da es keinen Befehl gibt um einen Kampf nur mit n Pokémon aus der Party zu starten, müssen wir die nicht ausgewählten Pokémon

    1) Speichern

    2) Entfernen

    3) Nach dem Kampf wieder hinzufügen


    Dazu müssen wir erstmal herausfiltern, welche wir überhaupt entfernen müssen. Das kann man mit den 3 Indexen, die beim Auswählen gespeichert wurden.

    Vorzugsweise sind diese 3 Indexe in einem Array, wodurch man eine Schleife durch die gesamte Party ziehen kann und alle Pokémon, die nicht als Index in dem Array gespeichert wurden, speichern und entfernen kann.

    Dazu erstellen wir ein neues Array, in welchem dann die Referenzen zu den Pokémon gespeichert werden. In derselben Schleife können die Pokémon auch direkt entfernt werden, allerdings muss sie rückwärts ablaufen,

    da sich sonst die Indexe ungewollt verschieben. Nun haben wir in unserer Party nur noch die ausgewählten Pokémon.


    Der Kampf startet, egal ob gewonnen oder verloren, müssen die Pokémon nach dem Kampf wieder hinzugefügt werden. Wir erstellen also noch eine Schleife, diesmal durch das Array mit den Referenzen

    und benutzen pbAddPokemonSilent um sie wieder hinzuzufügen (Zum Glück nimmt die Funktion Referenzen...)


    Das hat zwar wieder ziemlich lang gedauert, aber irgendjemand muss es ja machen :/

    Kannst du vielleicht deine Version von dem Script YEP_CoreEngine posten? (Denke das ist ok, da es auf seiner Hompage ja kostenlos ist)... In der aktuellsten Version kommt tilesetNames nicht einmal vor :/

    Ansonsten vielleicht einfach mal versuchen die Version zu updaten.

    Das Plugin von SRD benutzt eine Funktion die in SRD_GameUpgrade definiert ist. Diese sieht wie folgt aus:

    Code
    1. SRD.openLink = function(url) {
    2. if(Utils.isNwjs()) {
    3. require('nw.gui').Shell.openExternal(url);
    4. } else if(window && window.open) {
    5. window.open(url);
    6. }
    7. };

    da Utils.isNwjs() wahr ist, wird require('nw.gui').Shell.openExternal(url) ausgeführt, welches den Standard-Browser öffnet, anonsten würde durch window.open(url) ein neuer Tab geöffnet werden, da man dann im Browser spielt (Nicht sicher ob das so genau stimmt).


    Die beiden Funktionen die bei Yanfly zu sehen sind sind jeweils wenn du im Titelbildschirm den Punkt Credits anwählst oder wenn du ihn im Menü auf einer Karte anwählst.

    Der Code wurde einfach 1:1 kopiert, da hätte man auch eine weitere Funktion erstellen können, die jeweils von beiden aufgerufen wird.


    Somit sollte folgender Edit im Yanfly-Plugin funktionieren (Nicht getestet)

    Wenn es nicht funktioniert, importiere ich die Plugins tatsächlich mal und probier nochmal ein bisschen rum ^^

    Ein Tag vor Weihnachten wünschen sich die Kinder trotzdem noch dasselbe, obwohl die Einkäufe bereits getätigt wurden. Es weiß ja keiner, was der neue Maker alles kann.

    Sie hoffen also darauf, dass ihre Wünsche bereits bedacht wurden und nicht, dass sie noch bedacht werden. Darauf zu hoffen, dass die Macher aufgrund eines Posts von einem im Forum

    ein Feature implementieren ist sowieso ziemlich unrealistisch.

    I think ownCloud hosted for this forum hasn't been updated in a long time and is now outdated to most browsers' standards.


    Zitat

    You are currently running 2.7.31.

    Are you sure you didn't swap the 2 and the 7? Seems odd to me.

    Ja, in dem Fall wäre das tatsächlich einfacher. Als ich das Tutorial erstellt hatte, wusste ich noch nicht wirklich viel vom Programmieren (mit dem Maker).

    Ich würde heute auch niemals eine globale Variable I deklarieren und die Spielerbewegung könnte man auch mit weniger Befehlen lösen.

    Ich hab es mal aktualisiert und die Bilder neu hochgeladen. Danke.

    Die Eventseite läuft nicht bis zum Ende durch, nur die Bewegungsroute. Am einfachsten wäre es, wenn du die Bewegungsroute einfach mit einem Warten Befehl in einer Bewegungsroute überschreiben würdest (Du musst ja das Tempo zum Beispiel sowieso wieder zurücksetzen), am besten auf Seite 2 der Kamerafahrt.

    Mach am besten auch noch ein Wait 1 ans Ende in die Schleife, das ist sonst sehr performance-raubend.

    Ja... SceneManager.exit() hält quasi noch die Szene an und ruft dann SceneManager.terminate() auf was wiederum window.close() aufruft und das Spiel beendet.

    Theoretisch wäre SceneManager.exit() sogar die korrektere Variante, praktisch zweifle ich stark daran, dass man da irgendeinen Unterschied merkt. Selbst wenn das Spiel deswegen abstürzen würde...

    Code
    1. SceneManager.push(Scene_Load); // Öffnet das "Spielstand Laden"- Menü
    2. SceneManager.push(Scene_Options); // Öffnet das "Optionen"- Menü
    3. window.close(); // Beendet das Spiel

    Für Neues Spiel gibt es natürlich keinen Script-Befehl, da das dasselbe ist als würdest du den Spieler auf eine bestimmte Karte teleportieren.


    Ich hatte die Sachen hier mal in einem Tutorial aufgeführt.

    Ich habe vor einiger Zeit jemandem auf Discord mit Godot geholfen, und wollte das Endprodukt einmal mit euch Godot-Begeisterten teilen.

    Es geht darum zu berechnen wie ein 2D-Node mit anderen Nodes kollidiert und dann weiterfliegt:


    Ich habe 2 Versionen gemacht: Eine bei der die Linie insgesamt immer dieselbe Länge hat und ein bei der die Linie n-mal an anderen Nodes abprallt.

    Der SceneTree ist relativ simpel, es ist eine Main Scene mit dem Pool-Node und eine Szene für die Objekte mit denen die Linie kollidieren soll welche dann mehrfach in die Hauptszene instanziiert wurden.


    Der einzige Code liegt bei dem Pool-Node.


    Gucken wir uns einmal die Variante an, bei denen die Länge der Linie immer gleich bleibt:


    Da bei der anderen Version das meiste ähnlich ist, werde ich da nur den Code posten:


    Vielleicht bringt es ja irgendjemandem etwas.

    Ich weiß nicht genau wie man das mit den Tags macht, allerdings wäre der Code dahinter etwa so:


    Man hat seinen Pool, und filtert raus, welche Zustände der Gegner davon hat. Wenn man dann n > 0 Zustände hat, generiert man eine Zufallszahl rndm von 0 bis (n-1) und erhält den Zustand mit der ID real_pool[rndm], welchen man dann von dem Ziel entfernt. In der Theorie...


    Ich weiß leider nicht genau was sich hinter der target Instanz verbirgt... Ich bin davon ausgegangen, dass es sich um eine Instanz der Klasse Game_Enemy handelt.

    Wie ihr vielleicht wisst, benutzt der RPG Maker MV PIXI.js, welches durch OpenGL in der Lage ist Sachen auf den Bildschirm zu rendern.

    Nun ist es so, dass Icons anfangen schwarz angezeigt zu werden, sobald das IconSet eine bestimmte Größe erreicht hat. Aber auch nur bei den Zuständen in Kämpfen:


    Wieso ist das so?

    Der Unterschied liegt darin, wie die Icons auf den Bildschirm gebracht werden. Wenn man sich anguckt, wie in dem Fall die Kettensäge dargestellt wird, findet man folgendes:


    Code
    1. Window_Base.prototype.drawIcon = function(iconIndex, x, y) {
    2. var bitmap = ImageManager.loadSystem('IconSet'); // IconSet wird als Bitmap geladen
    3. var pw = Window_Base._iconWidth; // Breite des Icons
    4. var ph = Window_Base._iconHeight; // Höhe des Icons
    5. var sx = iconIndex % 16 * pw; // X-Koordinate im Sheet
    6. var sy = Math.floor(iconIndex / 16) * ph; // Y-Koordinate im Sheet
    7. this.contents.blt(bitmap, sx, sy, pw, ph, x, y); // Auf der Bitmap des Text-Fensters werden Teile durch einen Ausschnitt der IconSet-Bitmap ausgetauscht. (Block transfer)
    8. };

    Zum Vergleich die Zustände im Kampf:



    Es sieht alles ziemlich gleich aus, nur dass das Endergebnis anders ist:

    Dadurch, dass das Icon direkt in die Bitmap der TextBox eingefügt wird, bleibt die Größe der Bitmap gleich. Bei dem Icon für die Zustände beinhaltet eine Sprite-Instanz die gesamte Bitmap und zeigt nur einen festgelegten Ausschnitt an. Und es ist auch die Größe der Bitmap, die letztenendlich Probleme macht:


    http://webglstats.com/webgl2/parameter/MAX_TEXTURE_SIZE



    Es ist garantiert, dass ein IconSet, welches eine größere Höhe als 16384 (13-Bit) Pixel hat, im Kampfsystem nicht korrekt angezeigt wird. Die unterstütze Textur-Größe ist aber variabel und kann für Benutzer zu Benutzer unterschiedlich sein. Für Android-Export könnte eine größere Höhe als 4096 Pixel bereits ein Problem sein...


    Viele Plugins, die Icons verwenden, haben da vom Maker-Code der Zustände adaptiert und benutzen genau dieselbe Technik. Wodurch zum Beispiel YEP_IconsOnEvents oder MOG_TreasurePopup an genau demselben Problem leiden.


    Um das Problem zu umgehen müsste man also die Bitmap der Sprite-Instanz verkleinern, am besten nur den Ausschnitt des tatsächlich gebrauchten Icons als Bitmap mitgeben. Allerdings weiß ich (noch?) nicht inwiefern das möglich ist, ich wollte euch nur auf diese Problematik hinweisen.

    Kannst du vielleicht mal zeigen, wie deine Klassen in der Datenbank aussehen?

    Und vielleicht ein Screenshot nach dem Titelbildschirm (also auf der Karte) was kommt wenn du in die Konsole (F8)

    Code
    1. $dataClasses[1]

    eingibst?

    Das Problem ist, dass die Eigenschaft 'expParams' einer Instanz abgefragt wird, diese Instanz aber undefined ist, daher nicht existiert. Ich habe den Code mal zurückverfolgt, und bin auf folgende Abschnitte gelandet:

    Code
    1. Game_Actor.prototype.expForLevel = function(level) {
    2. var c = this.currentClass(); // Diese Instanz c ist undefined
    3. var basis = c.expParams[0]; // Hier wird versucht auf c.expParams zuzugreifen
    4. var extra = c.expParams[1];
    5. var acc_a = c.expParams[2];
    6. var acc_b = c.expParams[3];
    7. return Math.round(basis*(Math.pow(level-1, 0.9+acc_a/250))*level*
    8. (level+1)/(6+Math.pow(level,2)/50/acc_b)+(level-1)*extra);
    9. };

    und dadurch dann auch auf

    Code
    1. Game_Actor.prototype.currentClass = function() {
    2. return $dataClasses[this._classId]; // Dieses return liefert undefined zurück
    3. };

    Wenn man sich $dataClasses genauer anschaut, sieht man, dass dort alle Klassen der Database gespeichert sind:



    Daher gehe ich davon aus, dass du keine einzige Klasse in der Database festgelegt hast, dieses Plugin scheint das nicht zu berücksichtigen.

    Die Lösung wäre also mindestens eine Klasse zu haben, auch wenn du sie nicht verwendest.


    Verdammt. Ich hab es nochmal neu hochgeladen.
    Es lag daran, dass ich das Plugin umbenannt habe, um auf meinen Edit hinzuweisen. Leider hat der Autor des Plugins keine Sicherung programmiert falls das Plugin umbenannt werden sollte, wodurch die Parameter nicht gelesen werden konnten und alle Einstellungen auf "Default" gesetzt wurden.