Ergebnis 1 bis 11 von 11

Thema: Simple Einbindung von Icons

  1. #1

    Simple Einbindung von Icons

    Moin,
    Es geht darum, in eine Windows-Klasse (refresh-Definition) neben normalem Text ein Icon anzuzeigen:

    Code:
    bitmap = RPG::Cache.icon("Icon001")
    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
    Code:
    self.contents.draw_text(100, 200, 50, 80, $game_variables[0001].to_s)
    falsch, dass ein Syntaxfehler ausgeworfen wird?

    Geändert von Expresseon (18.08.2008 um 07:38 Uhr)

  2. #2
    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?

  3. #3
    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.

  4. #4
    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.

    Code:
    #zuerst holst du dir ein Bitmap
    mein_bitmap = RPG::Cache.icon("Icon001")
    #danach veränderst du es
    mein_bitmap.draw_text(mein_bitmap.rect, $game_variables[1].to_s)
    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.

    Code:
    #zuerst holst du dir ein Bitmap und kopierst es mit dup
    mein_bitmap = RPG::Cache.icon("Icon001").dup
    #danach veränderst du es
    mein_bitmap.draw_text(mein_bitmap.rect, $game_variables[1].to_s)

  5. #5
    @ -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.

  6. #6
    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.


    Code:
    mein_sprite = Sprite.new
    mein_sprite.bitmap = mein_bitmap
    mein_sprite.x = 100 
    mein_sprite.y = 100

  7. #7
    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).

  8. #8
    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.

  9. #9
    Du willst 'ne Formel mit Makervariablen machen?

    $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.

    Code:
    a = $game_variables[13].to_f
    b = $game_variables[20].to_f
    # Pythagoras:
    c = (a + b)**0.5
    # Zurückrechnen in Ganzzahl
    $game_variables[1] = c.round

  10. #10
    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).

  11. #11
    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:
    Code:
    module Skripte
      def self.pythagoras
        a = $game_variables[13].to_f
        b = $game_variables[20].to_f
        # Pythagoras:
        c = (a + b)**0.5
        # Zurückrechnen in Ganzzahl
        $game_variables[1] = c.round
      end
    end
    Wichtig ist nur das self. vor dem Methodennamen. Nun kannst du im Call-Script mit Skripte.pythagoras dieses Script aufrufen.

    Andere Möglichkeit:
    Code:
    class Interpreter
      def pythagoras
        #...
      end
    end
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •