Archiv verlassen und diese Seite im Standarddesign anzeigen : [XP/ Ruby] Fragensammelthread (1.12.)
Da ich ungern für jede kleine Frage einen neuen Thread eröffne, mach ich einfach einen Sammelthread hier draus. Das Datum im Titel soll angeben wann die letzte Frage gepostet wurde falls es irgendjemandem was bringt ^_^
Alte Fragen:
Beantwortet - Implementation Ruby Methoden aus neueren Ruby Versionen
Frage:
Der XP verwendet ja eine anscheinend recht alte Version von Ruby. Einige Methoden, die ich gerne benutzen würde, sind nicht vorhanden. Es ist zwar möglich, diese selbst nachzudefinieren, aber auf Dauer kann da doch einiges zusammenkommen an unnötiger zusätzlicher Arbeit.
Das Problem ist, dass ich nicht wüsste, wo ich mir den Code besorgen könnte für die ganzen neuen Methoden. Auf der ruby-doc ist zwar ein Kasten mit Source, der Inhalt sieht aber für mein bisheriges Ruby-Verständnis noch recht kryptisch aus und wenn ich ihn in den XP reinkopiere, krieg ich nur eine Fehlermeldung.
Frage ist also, gibt es irgendwo den Code von Ruby Methoden aus neueren Versionen frei zugänglich, sodass man ihn in den RPGXP Skript Bereich kopieren könnte? Oder zumindest eine Sammlung von viel verwendeten Methoden?
Antwort:
hier (http://www.multimediaxis.de/threads/133781-XP-Ruby-Fragensammelthread-%2812.12%29?p=2887892&viewfull=1#post2887892)
Offen - Move Picture mit Zoom ruckelt
Frage:
Ich hab ein kleines Problem mit dem normalen Move Picture Befehl vom RPGXP.
Ich will ein Bild mit Origin Center vergrößern. An sich ist das auch kein Problem, allerdings ruckelt das Picture extrem beim Move-Befehl.
Das Problem scheint zu sein, dass es sich um ein extrem kleines Bild (16x20) handelt und der XP dabei Probleme hat bei Origin Center die Koordinate beim Zoomen richtig beizubehalten.
Bei größeren Bildern sowie dem kleinen Bild mit Origin Upper Left funktioniert es problemlos, bei Origin Center ist aber das Resultat folgendes:
http://250kb.de/u/111210/g/qBjAkLs1CBPt.gif
Es liegt definitiv am Move Picture Befehl, das Problem tritt auch auf wenn ich für ein Bild isoliert Move Picture aufrufe. Die Animation sollte auch schneller ablaufen, habe es etwas verlangsamt um den Fehler herauszufinden, bei schnellerer Animation fiel das Ruckeln genauso auf.
Frage ist, gibt es irgendeinen Fix, wie man das Ruckeln verhindert? Ich nehme an, dass die Berechnung der Koordinaten vom internen Skript nicht ganz optimal gecoded ist, allerdings wüsste ich nicht, was ich dagegen tun könnte.
Edit: Bevor die Frage auftritt, ich will Origin Center verwenden, damit sich das Bild beim Zoomen aus der Mitte ausbreitet, bei Origin Upper left würde es sich quasi von links aufklappen, würde in der Animation nicht besonders toll aussehen.
Antwort
-
Shining Advances
10.12.2011, 16:52
ich bin mir nicht 100%ig sicher, ob das hilft, aber änder die größe deines bildes mal auf 17x20 pixel
im moment ist die mitte deines bildes nämlich zwischen der 8. und der 9. pixelspalte. durch rundungsfehler springt dein bild nun zwischen diesen beiden spalten hin und her.
wenn du 17 pixel breite bilder benutzt, liegt die mitte genau auf der 9. spalte (es liegen dann nämlich 8 spalten links und 8 spalten rechts davon -> 8 + 1 + 8 = 17)
vermutlich bringt das aber nix weil sich die breite des bildes ohnehin durch den zoom ständig verändert.
da wird aus der ungeraden zahl an spalten schnell eine gerade :/
Gute Idee, ändert leider in der Tat nichts :(
Hast du verschieden-Breite Animation-Schritte? liegts evtl. daran? Ich bezweifel es, aber ist das einzige, was mir um die Zeit einfällt^^.
Nein, die einzigen Aufrufe sind show picture mit zoomx=20, move picture zu zoomx=100 und nach kurzer Verzögerung (nachdem das erste move picture abgeschlossen ist) move picture zu zoomx=125, das Ruckeln tritt ja schon beim ersten move picture auf.
Ich hab mir auch testweise von move picture alle aufrufe mit den Parametern ausgeben lasse, da ist auch alles so, wie es sein sollte.
Ich hab mich mal dafür entschlossen hier raus nen Sammelthread zu machen um das Forum nicht mit Fragethreads zu überspammen. Alte Frage ist noch offen und im 1. Post einsehbar wenn vielleicht doch noch jemand eine Idee dazu hat :)
Neue Frage:
Der XP verwendet ja eine anscheinend recht alte Version von Ruby. Einige Methoden, die ich gerne benutzen würde, sind nicht vorhanden. Es ist zwar möglich, diese selbst nachzudefinieren, aber auf Dauer kann da doch einiges zusammenkommen an unnötiger zusätzlicher Arbeit.
Das Problem ist, dass ich nicht wüsste, wo ich mir den Code besorgen könnte für die ganzen neuen Methoden. Auf der ruby-doc ist zwar ein Kasten mit Source, der Inhalt sieht aber für mein bisheriges Ruby-Verständnis noch recht kryptisch aus und wenn ich ihn in den XP reinkopiere, krieg ich nur eine Fehlermeldung.
Frage ist also, gibt es irgendwo den Code von Ruby Methoden aus neueren Versionen frei zugänglich, sodass man ihn in den RPGXP Skript Bereich kopieren könnte? Oder zumindest eine Sammlung von viel verwendeten Methoden?
Methoden der Core-Library sind in C geschrieben und lassen sich nicht in den Maker einbinden. Bei der Standardlibrary sind die meisten Klassen in Ruby geschrieben. Deren Sourcecode ließe sich also in den Maker einfügen.
Wenn dich interessiert, wie die Methoden der Core-Library als Rubycode aussehen würden, kannst du dir ja mal Rubinius anschauen: https://github.com/rubinius/rubinius/blob/master/kernel/common/
Das ist eine Ruby-Implementation, die zum größten Teil in Ruby selbst geschrieben ist. Auch die Kernklassen wie Array, Enumerable etc. sind in Ruby geschrieben. Aber auch da kannst du oftmals den Code nicht 1:1 rüberkopieren, da Rubinius auch ein paar interne Klassen und Methoden hat, die der Maker nicht kennt.
Ich denke die beste Lösung ist, auf diese zusätzlichen Methoden einfach zu verzichten. So viele wichtige sind ja imo nicht dabei.
Mmhm am schemrzlichsten hab ich bisher min_by / max_by vermisst, die ließen sich zum Glück recht einfach implementieren.
Danke jedenfalls für den Link, wenn ich mal was dringend brauche sollte mir der Code zumindest einen Denkanstoß zur Implementation geben wenn ich auf dem Schlauch stehe :)
Zwei Fragen, einmal technischer und einmal mathematischer Natur
Technisch: Ich würde gerne zur besseren Übersicht ein paar mehr Ordner bei den Grafiken anlegen. Das Problem ist, dass ich über die Materialbase im Maker ja nur die Standardordner sehe und darüber nicht Inhalte weiterer Ordner verwalten kann. Aus meiner Erinnerung zum Rm2k konnte es da verschiedene Probleme geben, wenn man Dateien einfach reinkopiert hat statt sie über den Maker zu importieren. Frage ist, kann ich beim XP bedenklos Grafiken in die Ordner kopieren oder muss ich mit irgendwelchen Nebeneffekten rechnen?
Mathe: Wahrscheinlichkeitsrechnung, ugh. Es geht um Techniken, die zB die Treffergenauigkeit erhöhen. Also beispielsweise, man hat normalerweise eine Treffwahrscheinlichkeit von 90% und eine Technik, die die Trefferwahrscheinlichkeit um 50% erhöht. Rein logisch sollte da ja irgendwas zwischen 91 und 99 % rauskommen. Mit naiven Ansätzen, wie die Trefferwahrscheinlichkeit mit dem Modifikator zu multipliziere,n kommt man nicht weit (90% * 1.5 = 135%).
Ich denke, die Rechnung wäre in etwa so richtig: Wenn man zu den 90% nicht trifft, hat man nochmal einmal die halbe Chance (45%), doch noch zu treffen, also 0.9 + 0.1 * (0.9*0.5) = 90.045. Bei einer Ausgangschance von 50% käme man immerhin auf 62.5%
Formel, die sich soweit daraus ergibt, wäre x + ((1-x) * (m-1)*x) mit x als Trefferquote und m als Mod (In dem 1. Beispiel wäre x = 0.9 und m = 1.5). Funktioniert aber auch nur für Werte von m zwischen 1 und 2.
Das Problem ist, das Ganze in eine anständige Formel zu packen, die auch funktioniert, wenn der Mod unter 1 oder über 2 ist. Ich mag Mathe eigentlich normalerweise, aber Wahrscheinlichkeitsrechnung ist wirklich nicht meins - Für irgendwelche Ideen zu einer anständigen Formel wäre ich dankbar.
Ordnerstruktur: Ich hab nur mittelmässige Erfahrung auf dem Gebiet, es gibt einige Dinge zu bedenken.
* Du kannst die Graphiken dann soweit ich das sehe aus den entsprechenden Ordner nicht mehr aus RPG::Cache ziehen - imo ist der Unterschied bei Festplattenzugriff nur unwesentlich langsamer und macht sich eher auf langsameren Rechnern oder wenn viel Auslastung besteht bemerken.
* Wenn du mit einem entsprechenden Grafikprogramm es hinbekommst, halbtransparenz und transparenz zu setzen oder simulieren und Bilder benutzt, die eh nicht soviele Vorgaben haben (wobei das auch mit Tilesets und Charsets funktionieren könnte, aber da würd ich mich nicht drauf verlassen) sollte es kaum Probleme geben wenn du die Grafiken einfach in den Ordner ziehst
Waren jetzt nur 2, ich fürchte ich hab welche die ich erwähnen wollte während des Schreibens vergessen.
Alternative dazu wäre übrigens Prefixe vor Bildnamen - Subordner also Praktisch mit Prefixen simulieren. So bring ich bei mir Ordnung rein.
Mathematisch: Ich würd den Ansatz anders wählen. 1,5-fache Trefferchance heisst, 1,5 mal so selten verfehlen (vor Ausweichen, aber im Grune ist das vor und nach Ausweichen-Modifikation nutzbar). Also Teilen wir die Verfehlchance mit 1,5 und addieren das zur Trefferchance.
t - Trefferchance neu
f - faktor
b - Basistrefferchance
t=100-(100-b)/f
für b=90 f=1,5
100-(100-90)/1,5=100-10/1,5=100-6,66=93,33=t
für b=50 f=2
100-(100-50)/2=100-25=75=t
für b=50 f=1,5
t=66,66
Ordnerstruktur: Ich hab nur mittelmässige Erfahrung auf dem Gebiet, es gibt einige Dinge zu bedenken.
* Du kannst die Graphiken dann soweit ich das sehe aus den entsprechenden Ordner nicht mehr aus RPG::Cache ziehen - imo ist der Unterschied bei Festplattenzugriff nur unwesentlich langsamer und macht sich eher auf langsameren Rechnern oder wenn viel Auslastung besteht bemerken.
* Wenn du mit einem entsprechenden Grafikprogramm es hinbekommst, halbtransparenz und transparenz zu setzen oder simulieren und Bilder benutzt, die eh nicht soviele Vorgaben haben (wobei das auch mit Tilesets und Charsets funktionieren könnte, aber da würd ich mich nicht drauf verlassen) sollte es kaum Probleme geben wenn du die Grafiken einfach in den Ordner ziehst
Waren jetzt nur 2, ich fürchte ich hab welche die ich erwähnen wollte während des Schreibens vergessen.
Alternative dazu wäre übrigens Prefixe vor Bildnamen - Subordner also Praktisch mit Prefixen simulieren. So bring ich bei mir Ordnung rein.
Präfixe hatte ich bisher auch, aber ich hab die Befürchtung, dass das auf Dauer auch unübersichtlich wird, wenn es zB irgendwann 100 Monster geben sollte, findet man auch nicht mehr schnell, was man sucht. ^_^
Danke jedenfalls für die Antwort dazu.
Mathematisch: Ich würd den Ansatz anders wählen. 1,5-fache Trefferchance heisst, 1,5 mal so selten verfehlen (vor Ausweichen, aber im Grune ist das vor und nach Ausweichen-Modifikation nutzbar). Also Teilen wir die Verfehlchance mit 1,5 und addieren das zur Trefferchance.
t - Trefferchance neu
f - faktor
b - Basistrefferchance
t=100-(100-b)/f
für b=90 f=1,5
100-(100-90)/1,5=100-10/1,5=100-6,66=93,33=t
für b=50 f=2
100-(100-50)/2=100-25=75=t
für b=50 f=1,5
t=66,66
Die Idee hatte ich auch, wenn man aber kleinere Ausgangswahrscheinlichkeiten nimmt, sieht man, dass es damit leider auch nicht aufgeht - Wird am eindeutigsten, wenn man eine Basistrefferchance von 0% hat, nach deiner Formel käme 33% raus - Sollte sinnvollerweise bei 0 bleiben :)
Du kannst bedenkenlos so viele Ordner mit dem RPG-Maker XP und VX verwenden wie du willst und denen Namen geben wie dir lieb ist.
Du kannst die Ordner auch irgendwo halten, wo immer du willst. Sogar auf deinem Desktop wenn du es so magst.
Du kannst die Bilddateien auch so wie sie sind einfach in den Spieleordner packen ohne sie in irgendein Unterverzeichnis zu setzen.
Macht alles keinen Unterschied.
Bei dem RPG-Maker XP wirst du dann nichtmehr über RPG::Cache arbeiten können um die Bilddateien zu holen, aber das ist sowieso vollkommen unnötig. Zumindest solange du weist was du tust.
Geschwindigkeitsunterschied ist kaum vorhanden, wenn aber dann eher schneller als wenn du den Cache benutzt da du damit einen Funktionsaufruf sparst.
Als Code brauchst du lediglich folgendes um ein Bild zu laden:
some_bitmap = Bitmap.new(<PATH>)
wobei du <PATH> mit dem Pfad der Bilddatei angibst. Hier ein paar Beispiele:
"einBild" würde die Bilddatei mit Namen "einBild" direkt aus dem Hauptordner des Spieles laden.
"Graphics/einBild" würde die Bilddatei aus dem Ordner "Graphics" laden.
"Graphics/Battler-Animations/einBild" würde die Datei aus dem Ordner "Battler-Animations" aus dem Ordner "Graphics" laden.
"C:/Dokumente und Einstellungen/Neuer Ordner/einBild" würde die Datei aus [...]
Ich glaube du verstehst inzwischen wie das geht.
Funktioniert für jegliche Arten von Audio-Dateien äquivalent.
Um auf deine Wahrscheinlichkeitsrechnungsfrage einzugehen (schau dir einmal dieses Wort an):
So wie es mir scheint willst du nicht die Trefferwahrscheinlichkeit von 90% um 50% erhöhen, denn das wäre tatsächlich 135% sondern eher die Chance daneben zu schlagen, also 10% um 50% verringern um die Trefferchance damit auf 95% zu erhöhen.
Versuch einmal damit zu arbeiten und sag uns auf welche Ergebnisse du gekommen bist.
@Ordner: Ordner sind ja auch okay, schreib ich ja^^. Das umgehen von neuen Orner mit Prefixen stellt nur eine Alternative dar.
Um auf deine Wahrscheinlichkeitsrechnungsfrage einzugehen (schau dir einmal dieses Wort an):
So wie es mir scheint willst du nicht die Trefferwahrscheinlichkeit von 90% um 50% erhöhen, denn das wäre tatsächlich 135% sondern eher die Chance daneben zu schlagen, also 10% um 50% verringern um die Trefferchance damit auf 95% zu erhöhen.
Versuch einmal damit zu arbeiten und sag uns auf welche Ergebnisse du gekommen bist.
Ihr habt parallel gepostet oder?
Ich bezweifel, dass sich da ein Ansatz finden lässt. Alternativ könnte man auch von allem was größer als 67% ist auf 100% springen - oder gar wirklich 135%, vor Ausweichen. Praktisch gesehen hast du damit deine 50%. Vllt gibt es andere Lösungen, aber ehrlich gesagt bin ich der Meinung, dass es dann in einer Art und Weise nicht mehr intuitiv genug ist, dass es für den Spieler nachvollziehbar ist. Wenn der Spieler liesst, erhöhung um 50%, erwartet er eine der beide Lösung.
Du hast aber recht, für besoners kleine Werte geht das schief. Am Intuitivsten find ich einfach mit dem Faktor zu multiplizieren und werte über 100% entweder zu cutten oder für Ausweichen-Modifikation drin zu lassen. Aber vllt hat jemand eine bessere Idee :D
Danke zur Antwort mit den Ordnern, so ausführlich braucht ichs gar nicht - Meine Sorge war nur, dass irgendwas dadurch kaputt gehen könnte, vor langer Zeit beim Rm2k hab ich alle Dateien in die Verzeichnisse kopiert und irgendwann war das Projekt für den Maker nicht mehr lesbar. Kann zwar auch an was anderem gelegen haben, aber seitdem bin ich da lieber vorsichtig.
Bei der Wahrscheinlichkeit dachte ich, dass es da eine passende Formel gibt aus der Wahrscheinlichkeitsrechnung (Trefferwahrscheinlichkeit x verändert sich um Faktor m) gibt, Wahrscheinlichkeitsrechnung ist ja ein recht großes Gebiet- Aber die Frage ist halt streng mathematisch und vielleicht ist hier nicht das ideale Forum, um für sowas eine Antwort zu finden. Danke dennoch für die Ansätze.
Dein Problem hat allerdings in etwa 0 mit Wahrscheinlichkeitsrechnung zu tun. Es ist nicht mehr als reine Arithmetik. Wahrscheinlichkeitsrechnung würde jetzt vllt soweit gehn, wie hoch die Wahrscheinlichkeit ist, von 3 Attacken mindestens 2 zu Treffen. Du willst einen Erhöhung des Wertes. Vllt mag das in der Theorie auch eine Instannz von Wahrscheinlichkeitsrechnung sein, aber in einem Trivialfall, der nicht viel mit eigentlicher Wahrscheinlichkeitsrechnung gemein hat.
Da mir nicht ganz klar ist, wie genau du es haben willst, schreib bitte deine Erwarteten Werte mal auf. Gib uns ein paar Beispiele, wie genau bei Trefferchance und modifikator das Ergebnis aussehen soll, weil offenbar scheitern wir daran, nicht zu wissen, wo genau du hinwillst.
Den RPG::Cache kannst du immer noch benutzen. Schreib einfach das Unterverzeichnis vor den Dateinamen:
mein_bitmap = RPG::Cache.picture("facesets/foo")
Das Problem ist eher, dass du diese Pictures nicht über die normalen Event-Befehle verwenden kannst. Von der Rubyseite aus gibts da aber keine Probleme. Es kann außerdem noch sein, dass beim Verschlüsseln des Projekts (falls du das denn vor hast) die Unterordner nicht mit verschlüsselt werden. Zudem wird beim Importieren bei alpha-channel freien Bildern die Transparenz vom Maker gesetzt. Das kannst du aber auch mit einem geeignetem Grafikprogramm manuell machen.
Zur Wahrscheinlichkeitsrechnung: Cornix hat es imo richtig erklärt. Eine Steigerung der Trefferchance um 50% ist dasselbe wie eine Verringerung der gegnerischen Ausweichsrate um 50%. Lässt sich einfach über 1.0 - (1.0 - Trefferrate) * 0.5 berechnen und liefert imo auch ein sinnvolles Ergebnis.
Den RPG::Cache kannst du immer noch benutzen. Schreib einfach das Unterverzeichnis vor den Dateinamen:
mein_bitmap = RPG::Cache.picture("facesets/foo")
Gut, bei Unterordnern geht das. Was nicht geht ist extra-Ordner via RPG::Cache abrufen, ist was ich meinte. Ala Graphics/NeuerOrdner/
Gut, bei Unterordnern geht das. Was nicht geht ist extra-Ordner via RPG::Cache abrufen, ist was ich meinte. Ala Graphics/NeuerOrdner/
Das geht auch, du müsstest nur die Cache-Klasse ein wenig umschreiben.
Diese ist im RPG-Maker XP zwar versteckt aber du kannst sie auch aus dem RPG-Maker VX kopieren da diese dort beinahe identisch realisiert worden ist.
In der Hilfedatei vom XP ist auch der Quellcode, aber da hast du recht.
So, kleines Problem mit den Window-Klassen:
Ich hätte gerne Fensterinhalt, der nicht mitscrollt. also quasi ein Headerbereich, der immer stehen bleibt, und darunter ein Bereich, der normal über ox/oy scrollen kann.
Ich würde am ehesten die Funktionsweise von content ändern und content2 hinzufügen, sodass ich einmal scrollenden und einmal stehenden content habe. Problem ist, dass ich keinerlei Code der Klasse Window habe und aus der Dokumentation ich keinen Ansatz finde, wie ich da was ändern könnte. Ich wäre schon glücklich, wenn ich Position vom content ändern könnte, sodass dieser nicht immer 16 Pixel Abstand zum Rand hat.
Alternative Lösung wäre natürlich, zwei Windows übereinander zu legen, eins für den statischen und eins für den scrollenden Bereich, aber wenn ich die Funktionsweise vom Window content ändern könnte, fände ich das schöner.
Einfach einen weiteren Sprite darüber setzen. Content im Window ist auch nichts anderes als ein separater Sprite.
stardust
24.01.2012, 15:21
Content ist ein Bitmap-Objekt. Du könntest eine weitere Window-Klasse machen, die z.B. von Window_Base erbt und darin ein zweites Bitmap-Objekt (content2 oder wie auch immer) instanzieren:
self.contents2 = Bitmap.new(width - 32, height - 32)
Ich hab was ähnliches gemacht, ich weiss allerdings nicht genau, ob sich das auch auf Scrollbare Windows anwenden lässt, wobei es Window_Command mit ner Headline ist und daher eh eine Subklasse von Selectable.
Ich persönlich hab mir ne zweite Klasse erstellt, also in meinem Fall Window_Command_Headline, Klasse redefinieren oder von ihr Ableiten dürfte aber mit leicht anderer Herangehensweise auch funktionieren.
In Window_Command findest du übrigens auch eine Standard-Contents-Erstellungsanweisung afaik, kannst dich daran ja Orientieren und das passend Semantisch auf Fenstergröße umstellen.
Der Trick ist jetzt, einfach alle an relevanten Operationen die Koordinaten zu modifizieren - in den meissten Fällen wird das also y+Interger(Headgröße) sein - bzw +AnzahlAnZeilenVomHeader - je nachdem was passiert
Ich weiß nicht 100%ig ob das ein Ansatz ist, der auch für Selectable funktioniert, aber für Command hat die herangehensweise wunderbar funktioniert.
Content ist ein Bitmap-Objekt. Du könntest eine weitere Window-Klasse machen, die z.B. von Window_Base erbt und darin ein zweites Bitmap-Objekt (content2 oder wie auch immer) instanzieren:
self.contents2 = Bitmap.new(width - 32, height - 32)
Das würde so nicht funktionieren. Ein Bitmap kann man nicht sehen auf dem Bildschirm. Ein Bitmap enthält nur Daten.
Was man braucht um eine Grafik anzuzeigen ist ein Sprite. Einen sprite setzt man in einen Viewport, in diesem Fall den gleichen wie das Fenster, und übergibt dem Sprite ein Bitmap welches er darstellen soll.
Wie ich oben bereits geschrieben habe, erstelle einen Sprite und lege diesen an die richtige Stelle. Die Window Contents sind ebenfalls nichts anderes.
Mmhm danke für die Antworten, wird wohl auf ne zusätzliche Klasse / Sprite hinauslaufen - Ich hätts halt am saubersten (und wohl auch für andere Vorhaben potentiell hilfreich) gefunden,wenn ich irgendwie den sprite vom content-Bitmap modifizieren könnte und nicht nur das Bitmap selbst,
Wenn du etwas scrollen willst dann musst du ganze Sprites scrollen. Anders würde es auch garkeinen Sinn machen.
Jedes separates Element sollte sowieso ein eigener Sprite sein sofern du größere Möglichkeiten offen halten willst.
stardust
25.01.2012, 12:35
@Cornix Nicht ganz richtig, contents ist zumindest in den Windowklassen der Standardskripts ein Bitmap-Objekt, kein Sprite-Objekt. Für die Anzeige von reinem Text genügt eine Bitmap, alle anderen Window-Klassen kommen auch damit aus, sieh nach ;)
Das Objekt ".contents" ist zwar ein Bitmap, ein Bitmap kann aber ohne sprite nicht dargestellt werden.
Der Sprite ist in dieser Hinsicht das Window selbst dessen Bitmap nunmal das ".contents" Objekt ist.
Du kannst mir gerne ein Script schreiben mit welchem du ein Bitmap ohne einen Sprite darstellst um mich von dem Gegenteil zu überzeugen.
stardust
25.01.2012, 12:42
Hab ich auch nie behauptet, aber er hat ja bereits eine Windowsklasse. Und dass er sich darin um die Anzeige, das Aktualisieren, usw. des Textes kümmern muss sollte klar sein.
@stardust: ein "contents2"-Bitmap würde allerdings nicht helfen, da nur contents vom Window in einen Sprite gepackt wird. Das ist der Punkt.
Hallo, mal wieder eine Frage von mir ^_^
Mich plagt eigentlich schon die ganze Zeit das Laden von Musik im RPGXP. Bei der Suche hab ich nichts dazu gefunden, daher scheint es kein generelles Problem zu sein. Die Sache ist jedenfalls:
Wenn das erste Mal eine BGM oder ME abgespielt werden soll, hängt das Spiel für 5 Sekunden. Die Musik wird noch nicht abgespielt, aber auch alles an Grafik friert ein. Erstes Mal heißt dabei jedes Mal, wenn das Spiel geöffnet wird. So dauert es 5 Sekunden, bis der Titelbildschirm angezeigt wird. Wenn ich die BGM für den Titel abstelle, häng tes stattdessen bei der ersten Map mit BGM usw. Mit den MEs genau das Gleiche.
Die Ladezeit gibt es immer nur beim ersten Mal, wenn z.B. beim Titel BGM1 gespielt wird und bei der ersten Map BGM2 lädt es nur beim Titelbildschirm und alle weiteren BGMs werden sofort abgespielt. Es ist dabei anscheinend egal, was für eine BGM beim ersten Mal gespielt wird, importiert oder aus der RTP, kleine oder große Datei, kein Unterschied. Das Problem tritt auch in jedem Projekt auf, auch in einem neu gestarteten Projekt ohne Inhalt / Imports.
Ist das Problem bekannt und gibt es Lösungen um die Ladezeit wegzukriegen? Beim Testen ist es doch ziemlich nervig wenn man jedes Mal, auch wenn man Kleinigkeiten testet, erstmal die Verzögerung abzuwarten.
Ich habe zwar noch nie etwas dergleichen gemerkt aber ich würde sagen das klingt stark danach, dass einfach die Bibliotheken und Scripte zum Abspielen von Musik geladen und initialisiert werden müssen.
Das kannst du nicht umgehen.
The_Burrito
10.04.2012, 21:19
Das selbe Problem habe ich auch. Zumindest bei mir tritt das Problem aber nur bei MIDI-Dateien auf. Ist übrigens auch im Editor so. Wenn ich dort das erste Mal eine MIDI-Datei abspielen will, hängt das ganze kurz. In Winamp/Mediaplayer/etc habe ich dieses Problem aber nicht, dürfte also ein Problem der Engine sein, und keines von meinem PC.
Das Problem scheint eines vom RPG Maker selbst zu sein, und zwar in jeweils Kombination von bestimmten Dingen. Dabei können sowohl Projekte als auch der diverse Soft- und Hardwaregründe sein.
Ich hab die Erfahrung gemacht, dass ich bei den meissten MEINER Projekte Probleme hab, mit extrernen aber nur bei manchen, während Freunde von mir bei meinem Projekt wo es bei mir hakt keine Probleme haben.
Ich habe eine behelfsmässige Lösung für das Problem gefunden, die alle Lieder mit einem Schlag einlädt und danach nicht mehr Laden muss. D.h. auf betroffenen PCs würde einmal dieser Hänger 5 Sekunden bei jedem Spielstart auftreten, danach nicht wieder bis zum Neustart der exe.
(Zum Testen von Scripten empfehle ich allerdings eher, entsprechende BGMs einfach auszumachen, und auch das Script rauszukommentieren, wenn man das Spiel häufig startet) (oder ihr fragt drumherum ein unless $DEBUG ab). Eigentlich würd ich gern halb-Credit dafür wem geben, da ich darauf über ein Script (Scene_MusicPlayer), welches ich im rpg-studio gefunden hab drauf gekommen bin und die Lösung nur copy/paste/edited hab, leider ist kein Name im Script selbst und der Link den ich mir dazu aufgeschrieben hab ist tot.
Dies wäre in Scene_Title, direkt unter der if $BTEST abfrage, also direkt über dem Laden der Daten dann, wenn ihrs mögt.
dir = Dir.new("Audio/BGM/") # Neuer Ordnerpfad: Musikordner des Spiels
musicarray1 = dir.entries # Alle Dateinamen in einem Array abspeichern
2.times do musicarray1.shift end # Die ersten beiden Elemente löschen
# (Ist beides jeweils ein Punkr)
musicarray1.each {|index|
index.slice!(index.length-4, index.length)} # Schneide die Dateiendung ab
dir = Dir.new("Audio/ME/") # Neuer Ordnerpfad: Musikordner des Spiels
musicarray2 = dir.entries # Alle Dateinamen in einem Array abspeichern
2.times do musicarray2.shift end # Die ersten beiden Elemente löschen
# (Ist beides jeweils ein Punkr)
musicarray2.each {|index|
index.slice!(index.length-4, index.length)} # Schneide die Dateiendung ab
Audio.bgm_play("Audio/BGM/" + musicarray1[0],0,0)
Audio.me_play("Audio/ME/" + musicarray2[0], 0,0)
Das führt zwar zu einer knapp längeren Ladezeit im Title, dafür danach nicht mehr. Gut fürs Release (Leute die die Hänger nicht haben merkens garnicht, Leute die es haben, merken es wesentlich seltener, was angenehmer sein sollte) oder das Testen bestimmter Szenen.
The_Burrito
12.04.2012, 12:55
Das Problem ist, dass es sowieso nur beim jeweils ersten Laden eines BGM oder BGS auftritt. Danach hängt es nie wieder.
Ach? Okay, ich hab die Variante, dass beim ersten Laden JEDES Files das Problem auftritt, deshalb hatte ich es so interpretiert. File einmal geladen, gut, aber es hängt für Title BGM, Battle BGM, Map BGMs, BattleEnd-BGS - Vorausgesetzt, diese unterscheiden sich natürlich. Alles nur einmal. Für ebd. hilft die Lösung. Nur einmal hängen am Start find ich persönlich halb so wild ehlich gesagt.
Lang lang ists her, ich hab mich mal wieder an den Maker gesetzt und ein kleines Problem..
Ich nehme an, das Problem ist ein ziemliches Standard-Problem beim XP, eine Suche hat mir aber keine praktikable Lösungen geliefert.
Es geht einfach darum, dass Events als "Brücke" über unbegehbarem Grund dienen sollen. Im 2000 war das ja problemlos möglich, Event hinsetzen, below hero, fertig.
Im XP geht das anscheinend nicht, solange man für das Event keine Tilset-Grafik benutzt. Wenn die Brücke animiert sein soll, ist das schon ein Problem. Ich denke eigentlich, dass das Problem recht einfach durch eine Änderung im Game_Player- oder Game_Map-Skript behoben werden könnte. Vielleicht hatte ja jemand schonmal das gleiche Problem und kann mir weiterhelfen.
(Ich weiß, man könnte zB im Mapping schon unsichtbare, begehbare Tiles setzen und die Events auf through setzen und es gibt auch kompliziertere Lösungen. Das wäre für mich keine Lösung, ich brauch das möglichst flexibel, sodass das Feld nur durch das Event begehbar wird. Konkret gesagt kann man Baumstämme ins Wasser schieben und diese als Brücke benutzen, ähnlich wie in Golden Sun)
Im 2k geht das auch nur wenn die Grafik aus dem Tileset stammt.
Aber hier mal eine Lösung für den XP (kann man mit Sicherheit noch schöner schreiben)
class Game_Event < Game_Character
def name
@event.name
end
end
class Game_Player
def passable?(x, y, d)
# Get new coordinates
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# If coordinates are outside of map
unless $game_map.valid?(new_x, new_y)
# Impassable
return false
end
# If debug mode is ON and ctrl key was pressed
if $DEBUG and Input.press?(Input::CTRL)
# Passable
return true
end
$game_map.events.each_value { |event|
if event.x == new_x && event.y == new_y
return true if event.through && event.name.include?('bridge')
end
if event.x == x && event.y == y
return true if event.through && event.name.include?('bridge') && $game_map.passable?(new_x, new_y, 10 - d)
end
}
super
end
end
In ein neues Script über Main einfügen. Events die auf Trough gesetzt sind und "bridge" im Namen haben sind dann immer passierbar egal was für Tiles unter oder über ihnen sind.
Im 2k geht das auch nur wenn die Grafik aus dem Tileset stammt.
Aber hier mal eine Lösung für den XP (kann man mit Sicherheit noch schöner schreiben)
class Game_Event < Game_Character
def name
@event.name
end
end
class Game_Player
def passable?(x, y, d)
# Get new coordinates
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# If coordinates are outside of map
unless $game_map.valid?(new_x, new_y)
# Impassable
return false
end
# If debug mode is ON and ctrl key was pressed
if $DEBUG and Input.press?(Input::CTRL)
# Passable
return true
end
$game_map.events.each_value { |event|
if event.x == new_x && event.y == new_y
return true if event.through && event.name.include?('bridge')
end
if event.x == x && event.y == y
return true if event.through && event.name.include?('bridge') && $game_map.passable?(new_x, new_y, 10 - d)
end
}
super
end
end
In ein neues Script über Main einfügen. Events die auf Trough gesetzt sind und "bridge" im Namen haben sind dann immer passierbar egal was für Tiles unter oder über ihnen sind.
2k: Tatsächlich? Gut, da mekr man, dass es inzwischen wahrscheinlich mehr as 5 Jahre her ist, dass ich den 2k verwendet habe...
Die Lösung sieht nach genau dem aus, was ich suche. Vielen Dank :)
Nur als kleiner Hinweis am Rande, die dargestellte Lösung ist nicht sonderlich "effizient" was die Performance angeht. Es wird wahrscheinlich nicht direkt zu Problemen führen, kann aber wahrscheinlich, wenn man sich die Mühe machen wollte, sehr viel effektiver gelöst werden.
Ich nehme an, du meinst die Schleife über alle Events?
In der passable-Methode von Game_Character wird ja ohnehin schon über alle Events iteriert, im Grunde könnte ich da schon den Code anpassen. Spricht ja auch nichts dagegen, dass andere Events auch über die Brücke laufen können. (Dabei ist mir übrigens aufgefallen, dass Events mit leerer Grafik zwar kein Hindernis für den Spieler darstellen können, für Events aber schon. Hat das irgendeinen Sinn?)
Edit: Kleine Korrektur am Codeschnipsel: An den Event-Namen kommt man nicht einfach über event.name, das Event hat ein Attribut mit dem Namen event (ja, das event hat ein event), welches erst das Namensattribut hat. Man braucht also noch folgenden Code, wenn man es über den Event-Namen steuern will:
def name
return @event.name
end
Ich dachte eher an preprocessing von solchen "Brücken", also bereits zu einem festen Zeitpunkt alle Brücken auf der Karte zu suchen und die Positionen in einer Tabelle zu markieren um dann in den jeweiligen Passierbarkeitsabfragen lediglich in einer Tabelle nachschlagen zu müssen.
Solch eine Art der Datenvorverarbeitung ist ein Beispiel dafür wie man die Performance von Makerspielen um einen großteil erhöhen kann. Der standard Code vom RPG-Maker XP ist nicht sonderlich effizient und vieles wird hundertmal öfter berechnet als es nötig ist.
(Dabei ist mir übrigens aufgefallen, dass Events mit leerer Grafik zwar kein Hindernis für den Spieler darstellen können, für Events aber schon. Hat das irgendeinen Sinn?)
Der 2k(3) hatte ja bei Events diesen Haken "Forbid Event Overlap" oder so ähnlich, das hat man sich hier wohl gespart und einfach allen leeren Events diese Funktion gegeben.
def name
return @event.name
end
Steht doch genau so (- return) drin? o.O
Meinst du im Maker selbst oder in deinem Codeschnipsel? Zumindest bei mir hat Game_Event keine Methode name.
(self.)name ist nicht das Gleiche wie @event.name. Im Grunde käme man von einem Game_Event über event.event.name an den Namen. Aber lassen wir das ^_^
Eine kleine neue Frage:
Ich würde gerne meine Skripte auslagern. Dateien öffnen (was ich im anderen Kontext gemacht habe) ging eigentlich recht problemlos über File.open('./Data/datei'). Wenn ich aber require './Data/skript.rb' zu benutzen versuche, bekomme ich eine Fehlermeldung, dass das Skript nicht gefunden werden kann. Ich habe es auch mit ein paar anderen Pfaden versucht, geklappt hats aber nie. Die Frage ist im Grunde nur, wie der Pfad/ Befehl aussehen muss, wenn ich ein Skript aus dem Data-Ordner des Projekts importieren will.
$: << "."
Damit fügst du das Working Directory zum Suchpfad hinzu, indem require nach den Bibliotheken sucht. Warum require "./..." nicht funktioniert kann ich dir auch nicht sagen.
Alles klar, funktioniert genau so wie ich es wollte, danke :)
Ich hoffe, die Frage ist hier überhaupt richtig.
Also ist es möglich mit einem der Maker im Kampf ein bestimmtes Magiesystem zu programmieren :
Grundbeispiel wäre hier Ar Tonelico 2.
Man wählt einen Zauber aus, beispiel Feuerball. Bei einem Turn Based KS hat man dann jede Runde die Möglichkeit diesen Zauber zu sammeln. Angezeigt wird der Stand der Sammlung in %. Jeder zauber hat natürlich einen Grundwert, der erreicht werden muss, ehe er überhaupt ausgeführt wird (Feuerball dann so bei 50%). Wieviel pro Runde gesammelt wird hängt dann entweder von einem der üblichen Statuswerte/Level ab, oder einem speziellen selbst erstellten Wert. Mit steigender Anzeige wird auch der Zauber stärker, ggf. erreicht er dann auch einen neuen Level (Feuer > Feura > Feuga oder wie man es auch immer nennen möchte) Die Anzeige hat dann aber auch so Einfluss auf den Schaden, den der Zauber anrichtet.
Bei einem ATB KS würde dann einfach bei weiterlaufender Zeit die Prozentanzeiche steigen (Je nach Wert schneller, oder langsamer) Alleine das stell ich mir schwer anzuzeigen vor, wenn man 10 % in einer Sekunde oder genauere Zahlen anzeichen möchte, wie 0,01%(Was dann wohl wegfallen wird)
Ich hoffe, dies kann mir jemand beantworten (Ich persönlich gehe davon aus, dass es möglich wäre, habe aber keine Erfahrung, weshalb ich lieber auf nummer sicher gehe ^^")
Ist alles möglich, allerdings wahrscheinlich nicht sehr einfach.
Du musst dir dabei im Hinterkopf behalten, dass die neueren Maker eine "richtige" Programmiersprache verwenden welche auch international als solche anerkannt ist und tatsächlich benutzt wird. Der Maker ist im Grunde nicht mehr als ein simpler Interpreter für Ruby und eine kleine Standardbibliothek.
Mit Ruby kannst du alles mögliche Programmieren, daraus folgt, dass du auch mit dem Maker alles mögliche Programmieren kannst. Der einzige Brennpunkt ist, dass der Maker kein sehr guter Interpreter ist und Ruby auch selbst keine sehr "effektive" Programmiersprache im Sinne von Performance ist.
Prinzipiell ist (auch ohne Ruby) so ziemlich jede Idee umsetzbar, Frage ist, wie aufwändig das wird. Wenn man neu beim RPG-Maker und keine Programmierkenntnisse hat, wird man sich das Leben ziemlich schwer machen und unnötig kompliziert programmieren, bis man mal in der Nähe der Idee kommt. Wenn man Programmierkenntnisse hat kriegt man es wahrscheinlich schneller hin, man braucht aber trotzdem ein gutes Stück an Zeit, sich an die Eigenheiten des RPG-Makers zu gewöhnen.
Generell würde ich sagen: Wenn man neu beim RPG-Maker ist, sollte man nicht gleich mit der Umsetzung einer komplizierten Idee anfangen. Erstmal sollte man "normale" Sachen bauen und sich an den Maker gewöhnen. Erst, wenn man sich an die Features gewöhnt hat und man eine ungefähre Idee hat, wie man die Idee konkret umsetzen könnte, sollte man sich da auch heranwagen.
Ich kann anhand des Posts schlecht schließen, ob und wie gut du dch schon mit den Makern auskennst, für mich klang es eher nach keiner oder sehr geringer Erfahrung, meine Erklärungsversuche gingen auch in die Richtung ^_^
PS: So ganz richtig bist du hier übrigens nicht. Das hier ist mein persönlicher Sammelthread für meine Fragen, für eigene Fragen sollte es eigentlich schon ein eigener Thread sein ;)
Kurze Frage:
Ist es irgendwie möglich, in RGSS an die Abhängigkeiten der Maps zu komen? Also grob gesagt sowas wie $game_map.parent, um an die map zu kommen (bzw.die id der map würde schon reichen), die in der Struktur über der aktuellen Map ist.
Solche Dinge stehen iirc in der MapInfos.rxdata.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.