PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie stelle ich Variablen als Zahlen mit Ruby dar???



K.L.R.G.
16.06.2007, 18:10
So, nach einigen kleineren technischen Rückschlägen will ich mich nochmal an nem Menü versuchen, für das ich der Einfachheit halber Ruby gebrauchen könnte ...

Das Menü soll mit Pictures gemacht werden und immer auf der aktiven Map dargestellt werden. Würde ich z.B. bei den Statusanzeigen jede einzelne ZAhl mit Pictures darstellen, dann wäre das nicht nur aufwendig, sondern auch kaum möglich aufgrund der Picturezahl ...

Also frage ich mich ob und wie es möglich wäre (hab das glaub ich mal irgendwo gelesen) Variablenwerte als Zahlen mit Ruby darzustellen (die über den Pictures liegen). Ich bin immer noch ein ziemlicher Ruby-Noob, von daher bitte eine idiotensichere Erklärung ... am besten mit passendem Scriptbeispiel dazu ...

Danke im vorraus!http://www.multimediaxis.de/images/smilies/old/sm_12.gif

K.L.R.G.
19.06.2007, 21:51
Push!!
Sagt ma is die Frage so dämlich das die keiner beantworten will?:'( :'( http://www.multimediaxis.de/images/smilies/old/1/nixweiss.gif http://www.multimediaxis.de/images/smilies/old/1/gruebel.gif ^w^

Kelven
19.06.2007, 22:52
Ne, aber da muss man so viel Code schreiben um das zu erklären. ^^ Es geht mit der Methode draw_text der Bitmap-Klasse. Damit kann man an jeder Stelle des Bildschirms Text anzeigen lassen. Falls ich mal mehr Zeit habe, schreibe ich vielleicht wie man das benutzt oder du schaust nach einem Beispiel auf einer der großen XP-Seiten.

makenshi
26.06.2007, 11:34
Hum, bin zwar an sich Neuling in RGSS...aber ich versuchs mal trotzdem:

Du kannst sicherlich Zahlen einfach "auf den Bildschirm" schreiben.
Allerdings brauchst du ein leeres Bitmap dadrunter auf das du schreiben kannst.
Das ginge sicherlich auch auf einem Fenster bei dem du die Transperenz auf 100% hochsetzt, aber das halte ich jetzt einfach mal für Ressourcenverschwendung. (ohne Gewähr)



#=====================================================#
# ###writeText### #
#Letzte Änderung am 26.06.07 - Erstellt am 26.06.07 #
#=====================================================#
class writeText
#==============================================================================
def initialize

Sprite = Sprite.new #Neues Spriteobjekt erzeugen
Bitmap = Bitmap.new(100,50) #Neues Bitmapobjekt erzeugen
Bitmap.font.name = "Arial" #Schriftart einstellen
Bitmap.font.size = 14 #Schriftgröße einstellen
Sprite.bitmap = Bitmap #Dem Sprite die Bitmap zuweisen
Sprite.bitmap.draw_text(0, 0, 50, 25, "Text auf dem Bildschirm!")

end
#==============================================================================
end #END der Klasse


Die Einstellung des Schriftfonts ist übrigens nicht beim legalen XP nötig. Allerdings weiß ich nicht mit was für einem du arbeitest. Also ist es mal mit drin.

So solltest du an sich Text auf dem Bildschirm lesen. Halt aufs leere Bitmapobjekt geschrieben. Je nach Wunsch musst du nun halt mit den Koordinaten und Größenangaben rumspielen.
Um dann zu schreiben benutzt du einfach den "Script" Befehl und fügst dort folgendes ein:



writeText.new


Nimm dir dafür irgendein Event das du dir erstellen musst. Am besten eine Art NPC den du ansprechen kannst.

PS:

Mist. Ich seh grad du willst ja Variablenwerte nehmen. ^^"
Das ist aber nicht sich nicht viel anders. Du musst halt nur den draw_text Befehl etwas unändern. So in etwa:



Sprite.bitmap.draw_text(0, 0, 50, 25, variable.to_s)


Einfach an der Stelle wo früher der Text einfach angegeben war einfach die Variable angeben die angezeigt werden soll. An den Variablennamen musst du ein ".to_s" dranhängen. So wird der Zahlenwert in einen String umgewandelt vor der Anzeige. Ohne diese Anweisung würde dir der XP einen Fehler ausgeben. Immerhin kannst du keine Zahlenwerte an einer Stelle ausgeben wo die Funktion einen String erwartet.

Ob das ganze jetzt über deinen Bildern liegt weiß ich jedoch nicht. Musst du wohl mal ausprobieren.

Kelven
26.06.2007, 12:57
@makenshi
Du solltest die Objekte mit kleinem Buchstaben schreiben, also z.B.


sprite = Sprite.new


Dann könntest du dir noch eine Zeile sparen, indem du folgendes schreibst:


sprite.bitmap = Bitmap.new(100,50)


Die "Höhe" der Anzeige kann man so festsetzen:


sprite.z = [irgendein Wert]

Ich nehme immer 200, das liegt über den Pictures, aber auch über dem Debug-Menü. ;)

Was dann noch fehlt ist ein sprite.bitmap.clear, damit der Text nicht ständig über schon bestehenden Text geschrieben wird. Praktischer wäre es natürlich sowieso, die Klasse flexibler zu machen:



class writeText
def initialize
@sprite = Sprite.new
@sprite.bitmap = Bitmap.new(640,480)
@sprite.bitmap.font.name = "Arial"
@sprite.bitmap.font.size = 14
@sprite.bitmap.font.color = Color.new(255, 255, 255)
@sprite.z = 200
end

# Achtung, ich gehe davon aus, dass der Text vor dem Aufruf schon
# mit to_s in einen String umgewandelt wurde, falls nötig.
def ausgabe(x, y, text)
@sprite.bitmap.clear
@sprite.bitmap.draw_text(x, y, 640, 32, text)
end
end

makenshi
26.06.2007, 13:13
Ah, das sieht doch wesentlich besser aus. :)
Nimm auf jeden Fall die Variante von Kelven.

Damit hättest du dann eine Funktion mit der du auf den ganzen Bildschirm schreiben kannst. Nutzungsweise wäre folgende:

Initalisierung der Funktion:


$schreiben = writeText.new


Schreiben eines Textes:


$schreiben.ausgabe(x,y,variable)


Beides natürlich wieder über "Script".
Ich kenne zwar bei Ruby die Abfrage nicht um abzufragen um welchen Typen es sich bei dem parameter "text" handelt, aber wäre es an sich nicht noch gut die methode ausgabe so zu ändern:


def ausgabe(x, y, text)
texts = text.to_s
@sprite.bitmap.clear
@sprite.bitmap.draw_text(x, y, 640, 32, texts)
end


So müsste dann doch 100% immer ein String ankommen?Immerhin wandeln wir dann den Parameter um. So ist eine Fehlerquelle ausgeschlossen. Und ein Komfortfaktor eingebaut.

Kelven
26.06.2007, 13:55
Ich hab's nur deswegen weggelassen, weil ich nicht genau wußte, ob es eine Fehlermeldung gibt, wenn man ein String-Objekt in einen String umwandeln will. Gibt es aber nicht, wie ein Test gezeigt hat, deswegen kann das to_s also bleiben. Aber mir ist noch was eingefallen. Wenn man mehr als einen Text anzeigen will, wäre eine eigene Löschmethode besser. Deswegen sollte die Klasse so aussehen (man muss dann nur immer manuell löschen):



class writeText
def initialize
@sprite = Sprite.new
@sprite.bitmap = Bitmap.new(640,480)
@sprite.bitmap.font.name = "Arial"
@sprite.bitmap.font.size = 14
@sprite.bitmap.font.color = Color.new(255, 255, 255)
@sprite.z = 200
end

def löschen
@sprite.bitmap.clear
end

def ausgabe(x, y, text)
@sprite.bitmap.draw_text(x, y, 640, 32, text.to_s)
end
end


@makenshi
Das mit dem texts ist doppelt-gemoppelt. Eine Zuweisung text = text.to_s ist kein Problem für den Interpreter, weil von rechts nach links ausgewertet wird. Außerdem könnte das text.to_s dann sowieso direkt in den Aufruf von draw_text.

makenshi
26.06.2007, 14:26
@makenshi
Das mit dem texts ist doppelt-gemoppelt. Eine Zuweisung text = text.to_s ist kein Problem für den Interpreter, weil von rechts nach links ausgewertet wird. Außerdem könnte das text.to_s dann sowieso direkt in den Aufruf von draw_text.


Das habe ich an sich nur gemacht weil ich dachte das der Parameter "text" ja auch z.B. ein Integer sein könnte. Wenn man nun hergeht und text = text.to_s benutzt, dachte ich das der Versuch in eine Integervariable einen String zu verpacken eventuell einen Fehler auslöst. Hätte es denke ich auch.
Da du aber in der aktuellen Version ohnehin direkt beim parameter der draw_text Funktion direkt umwandelst, sollte das ohnehin egal sein.

Kelven
26.06.2007, 15:53
Ruby hat soweit ich weiß keine explizite Typendeklarierung. So ist es mir z.B. mal passiert, dass ich die Standardvariablen in Floats umgewandelt hab, weil ich in einem Rubyscript geteilt habe.