Moin,
Es geht darum, in eine Windows-Klasse (refresh-Definition) neben normalem Text ein Icon anzuzeigen:
Angenommen, ich verwende nun einen draw_text-Befehl, ist es doch eigentlich unmöglich, dort die Bitmap fürs Icon einzubinden, oder? (bitmap muss ja zu string werden) Deshalb muss ich die Bitmap separat anzeigen, aber wie?
Nebenbei hätt' ich noch ne kleine Frage. Wie kann ich die Ausrüstung eines Charakters abfragen (hat Charakter001 Waffe001 ausgerüstet?) ?
Edit:
3. Was ist an
falsch, dass ein Syntaxfehler ausgeworfen wird?
1)u kannst doch vor der Messange ein Bild anzeigen, dass zu 100% Tranparent ist(musst etwas auf null modifizieren).
Dies lässt du dann einfach in der gewünschten Zeit erscheinen.
2):also du kannst mit einen Conditional Branch auf Seite drei(glaub ich) abfragen,
was der Held trägt.
3):
Dazu weiß ich nichts.
Sorry. Hast du dort etwas gerskrippt?
Also, ich meinte alles in Ruby, nix mit Eventcode.
Mit Bildern kann ich also nix anfangen, ich weiß genau, dass das mit Icons geht, aber nicht wie. Das 2. muss ich von Eventcode in Ruby übersetzt kriegen, und beim letzten ist eben immer ein mir unbekannter Syntaxfehler.
Du musst zwei Dinge unterscheiden: Erstellen eines neuen Bitmaps und verändern eines bestehenden Bitmaps. Ein Bitmap neu zu erstellen ist sehr teuer (siehst ja auf deiner Festplatte, wie viel Speicher allein ein kleines bmp einnimmt). Darum verändern die Bitmapmethoden eigentlich alle ein bestehendes Bitmap, statt ein neues zu erstellen.
RPG:ache ist im Grunde genommen nur eine Art Speicher, wo Bitmaps zwischengelagert werden. Immer wenn du eine Grafikdatei laden willst (z.B. ein Icon) wird in RPG:ache nachgesehn, ob diese Grafik schon einmal geladen wurde. Ist das der Fall, wird die bereits geladene Grafik genommen, ansonsten wird die Grafik neu geladen. Auf diese Weise muss also nicht bei jedem RPG:ache.icon("foo.png") die Grafik foo.png neu geladen werden und es ist nur ein einziges Bitmap im Speicher, welches diese Grafik enthält.
Willst du übrigens ein leeres Bitmap erzeugen, verwendest du Bitmap.new(weite, hoehe)
Methoden wie draw_text, blt, stretch_blt usw. verändern dagegen ein bereits existierendes Bitmap. draw_text schreibt auf ein Bitmap einen Schriftzug drauf.
So ganz richtig ist das trotzdem noch nicht. Du kannst dir überlegen, dass an vielen Stellen des Spiels das Icon angezeigt werden soll. Und du weißt, dass RPG:ache das Bitmap-Icon zwischenspeichert und nicht nochmal neu lädt. Wenn du also aus dem Cache das Icon holst und es veränderst, werden alle weiteren Skripte im Spiel dieses veränderte Icon nutzen. Du hast dann also im Item-, im Skillmenü, im Kampf usw. überall wo das Icon "Icon001" vorkommt, plötzlich den Schriftzug drauf.
Darum muss man, will man ein RPG:ache Bitmap verwenden und anschließend verändern, dieses vorher kopieren.
@ -KD-:
Wie zeige ich meine geholte Bitmap jetzt aber an? Mit deinem Verwendungsbefehl kann ich doch keine x und y-Positionen in einer super-class definieren.
Afaik musst du erst ein Sprite erstellen und diesem dein Bitmap zuweisen.
(Bin allerdings selbst ziemlich unerfahren in Ruby ^^)
In diesem Rubykurs wird das auch relativ gut erklärt.
Das kommt vor allem auch drauf an, wo du es anzeigen willst. Es gibt im Prinzip zwei Möglichkeiten:
- du zeigst es, wie Shimassy gesagt hat, als Sprite an
- du kopierst es auf ein anderes Bitmap, welches bereits angezeigt wird
Letzteres ist gegebenfalls effizienter. Wenn du ein Menü mit sehr vielen Icons hast, ist es für die Performance nicht gut wenn du jedes Item als Sprite anzeigst. Du legst stattdessen ein einziges großes Bitmap an und kopierst alle Items in dieses Bitmap (das geht mit dem blt Befehl. grosses_bitmap.blt(x, y, kleines_bitmap, kleines_bitmap.rect).
Dieses große Bitmap kannst du dann anzeigen (entweder als Sprite, oder in einem Menü als Window, in dem du schreibst mein_window.contents = grosses_bitmap).
Das hat jetzt so prima geklappt.
Ich versuche derzeit, eine Variable aus 10 anderen Variablen zusammenzusetzen, in Form von einer Formel. Da ich mit genauen Werten und Nachkommastellen rechnen möchte, was mit Ruby hoffentlich möglich ist, möchte ich wissen, wie ich statt Eventcode diese Berechnung skripten kann.
$game_variables[5] # Zugriff auf die Makervariable 0005
$game_variables[29] = 10 # Setzt Makervariable 0029 auf den Wert 10
Damit du mit Kommastellen rechnen kannst, musst du die Variablen in Floats umwandeln. Das geht mit der Methode to_f. Um am Ende wieder eine Ganzzahl zu erhalten, verwendest du die Methode round.
Kann man das in mehrere Calls fassen oder muss ich dazu ein Skript erstellen? Beim Skript, wie könnte ich das definieren, praktisch als Befehl, der ständig aufgerufen wird, wenn ich will? Im Callskript gibt's jedenfalls NameErrors (ich denke mal, da fehlen noch irgendwelche Definitionen).
in mehrere Call-Script verteilt darfst du das nicht schreiben. Entweder in ein Call-Script, oder du schreibst es in den Scripteditor. Letzteres ist vermutlich für längere Scripte die bessere Variante.
Da hast du wiederum zwei Möglichkeiten. Einmal über Module:
Wichtig ist nur das self. vor dem Methodennamen. Nun kannst du im Call-Script mit Skripte.pythagoras dieses Script aufrufen.
Andere Möglichkeit:
Jetzt brauchst du im Call-Script einfach nur pythagoras() hinschreiben, um das Script auszuführen.
NameError heißt btw. das du auf eine lokale Variable, Konstante oder Klassenvariable zugreifst, die noch nicht definiert wurde. Ich nehme mal an du hast eine lokale Variable, z.B. a = $game_variables[13].to_f im ersten call-script definiert und wolltest im zweiten call-script darauf zugreifen. Das funktioniert allerdings nicht.