Ergebnis 1 bis 3 von 3

Thema: [XP] Fragen zu den Klassen Sprite und Window_Base

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    [XP] Fragen zu den Klassen Sprite und Window_Base

    Hi, ich bins mal wieder, immernoch ein RGSS newb, aber ich lerne langsam dazu (einen animierten tilel und eigenes savemenü hab ich mir schon erstellen können), allerdings hatte ich gestern ein Problem, das ich erst nach einigem herumprobieren "lösen" oder besser "umgehen" konnte.

    Ich hatte eine Neue Klasse erstellt, deren initialize so aussah
    (bin mir nichtmehr 100% ich rekonstruiere das gerade):

    Code:
    class Sprite_Infobox < Sprite
      #---------
      def initialize(x, y, actor)
    
        super(Viewport.new(x, y, 200, 100))
    
        self.bitmap = RPG::Cache.picture("Bild1")
    
        #Actor Name
        self.bitmap.font.color.set(255, 255, 255)
        self.bitmap.draw_text(29, 4, 75, 24, $game_party.actors[0].name)
    
        #hp Leiste
        bitmap = RPG::Cache.picture("HPLeiste")
        cw = bitmap.width * $game_party.actors[0].hp / $game_party.actors[0].maxhp
        src_rect = Rect.new(0, 0, cw, 5)
        self.bitmap.blt(74, 25, bitmap, src_rect)
    
        end
      #------------
      ......
      #------------
    end
    Als ich (mit $test1 = Sprite_Infobox.new(x,y,0) und $test2 = Sprite_Infobox.new(x,y,1) ) die Box für 2 verschiedene Spielercharas erstellte, fiel mir auf, dass sich in den beiden Infoboxen die informationen der beiden Actor überlagerten. Sobald ich für die 2te Box eine andere bitmap wählte war das Problem gelöst.
    Speichert der Maker also wenn ich so ein Sprite erstelle unter dem Namen des Sprite immer dessen eigentliches Bild und die hinzugefügten Bildinformationen wie Text und Pixel

    Edit: die Zeilen in den [[ ]] Klammern habe ich mitlerweile gepfüft, geht nicht, also muss ich wohl 2 mal dieselbe datei unter unterschiedlichem Namen importieren...
    [[solte man desshalb in einem solchen fall immer eine ?Tochterklasse? von Window_Base ohne windowskin erstellen, und dort dann das Bild der Box und die Text und Bildinformationen anziegen?]]

    Ich frage weil ich den wirklichen Grund dieses Fehlers erfahren will, ich werde heute mein Script wohl noch so umstellen, dass es eine ?Tochterklasse? von Window_Base ist.

    Geändert von Lihinel (19.09.2006 um 15:59 Uhr)

  2. #2
    Das "Problem" liegt daran wie in Ruby Objekte gespeichert werden.

    Jedes Objekt liegt erst einmal irgendwo im Speicher rum. In den Variablen, die du benutzt um auf diese Objekte zuzugreifen liegt aber nicht das Objekt selber, sondern nur eine Angabe wo das Objekt sich im Speicher befindet. Alle Variablen sind so gesehen Zeiger.
    Wenn du nun in einer Variable ein Objekt erzeugst und dieses dann in eine zweite Variable packst, zeigen beide Variablen auf das selbe Objekt. (PS: Nur bei Integern wird das Objekt direkt gespeichert und dieses Problem tritt dort nicht auf)

    Code:
    x = Test.new
    y = x
    # x und y zeigen nun beide auf das selbe Objekt. Jede Änderung in y wirkt sich auch auf x aus.
    # Um das zu umgehen kann man direkte Kopien von Objekten erstellen, sogenannte clones.
    x = Test.new
    y x.clone # Hier speichern wir einen Clone von x in y ab.
    # Nun besitzen x und y zwei Kopien des ursprünglich selben Objektes.
    Bei dir liegt der Fehler daran, daß das Bild, welches du aus dem Cache holst, eben nur eine Referenz auf das eigentliche Bildobjekt ist. Wenn du nun zwei Objekte deiner Klasse erstellst benutzen sie beide dasselbe Bild-Objekt und wenn du auf das eine etwas blittest, zeigt sich das auch auf der anderen. Die Lösung liegt eben darin, einen Clone des gecacheten Bildes zu benutzen.
    Code:
    self.bitmap = RPG::Cache.picture("Bild1").clone
    Das Bild sollte übrigens, wenn es nicht mehr benötigt wird freigegeben werden (disposed). Deine Klasse sollte dispose wie folgt überschreiben:
    Code:
    def dispose
    super
    if self.bitmap != nil
    self.bitmap.dispose
    end
    end
    Ob du ein normales Sprite benutzt oder Window_Base ist davon abhängig was du haben willst. Window_Base bzw. Window haben den Vorteil, daß sie automatisch ein entsprechendes großes Bild anhand des Windowskin erstellen, allerdings sind damit dann natürlich nur rechteckige Formen möglich und aufgrund des Randes ist die eigentliche Zeichenfläche in Höhe und Breite 32 Pixel kleiner als das eigentliche Window.

  3. #3
    Ah wunderbar, das bestätigt meine Vermutungen und danke für den .clone Befehl, den kannte ich noch nicht.

    Einen "def dispose" habe ich übrigens drin, genauso wie anderes, ich hab den Code hier nur mal in vereinfachter/verkürzter Form dargestellt, man muss ja keine seitenlangen Texte posten wenn man schon ziemlich genau weis wo sich der Fehler befinden müste. (Viele Dinge kenne ich mitlerweile selbst, auch dank help Datei, hin und wieder fehlt mir allerdings noch das Detailwissen. Ich koch sozusagen schon ganz essbar, nur ans Gewürzregal komme ich noch nicht so recht heran.^^)

Berechtigungen

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