Ergebnis 1 bis 9 von 9

Thema: [VX Ace] Schadens-Popups und Performancefragen

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #6
    Zitat Zitat
    (Wenn ich hier so ein @-Objekt, also ein lokales erzeuge, ist das dann ein lokales Objekt von meinem Game-Objekt, also bleibt sowieso solange vorhanden, wie mein Spiel läuft?)
    @ Variablen sind Instanzvariablen (oder Attribute, Member-Variablen und wie man die noch so nennt). Wenn du die in einem parallelen Event anlegst, sind sie sie an den Event-Interpreter gebunden, der wiederum an das jeweilige Event gebunden ist. Von daher hast du recht: Solange du die Map nicht wechselst, bleibt die Variable am "Leben".
    Wenn du den Code hingegen mehrfach ausführst, wird die Variable neu zugewiesen und der alte Sprite wird vom GarbageCollector gelöscht. Darum verschwindet die Grafik nach wenigen Sekunden.



    Aus dem Grund macht es Sinn immer zwei Klassen zu schreiben: Eine Game-Klasse und eine Sprite-Klasse:
    Code:
    class Game_DamageDisplay
    
      MOVE_UP = 40 # Anzahl Pixel, die sich die Anzeige bewegen soll
    
      def initialize x, y, damage, time
        @x = x
        @y = y
        @damage = damage
        @time = time
        @target= Graphics.frame_count + time
      end
    
      # gibt einen prozentualen Wert von 0.0 bis 1.0 an, wie weit die Anzeige fortgeschritten ist
      def progress
        duration= @target - Graphics.frame_count
        [(@time - duration).to_f / @time, 1.0].min
      end
    
      def y
        @y - progress*MOVE_UP
      end
    
      def opacity
        255 * (1.0-progress)
      end
    
      def finished?
        progress >= 0.99 # kann jetzt gelöscht werden 
      end
    
    end
    
    class Game_Screen
      def damage_displays
        displays = (@damage_displays ||= [])
        displays.delete_if {|display| display.finished?}
        displays
      end
    end
    
    class Game_Screen
      alias update_damage_displays update
      def update
        update_damage_displays
        @sprite_damage_displays ||= []
        displays = $game_screen.damage_displays
        # lösche alle Displays die nicht mehr benötigt werden
        @sprite_damage_displays[displays.size..-1].each {|display| display.dispose}
        @sprite_damage_displays = @sprite_damage_displays[0...displays.size]
        # update den Rest
        displays.each_with_index {|display, index| 
          @sprite_damage_displays[index] ||= Sprite_DamageDisplay.new
          @sprite_damage_displays[index].refresh(display)
        }
      end
    
      alias dispose_damage_displays dispose
      def dispose
        dispose_damage_displays
        @sprite_damage_displays.each {|d| d.dispose}
        @sprite_damage_displays.clear
      end
    
    end
    So könnte das z.B. aussehen. Dann fügst du jede neue Schadensanzeige in den Array $game_screen.damage_displays ein und in Spriteset_Map wird dafür gesorgt, dass für jede Anzeige ein entsprechender Sprite angelegt und angezeigt wird.


    Edit: Ich seh grade, du arbeitest mit dem VX Ace. Mein Code war eher für den XP gedacht. Aber das kriegst du ja leicht angepasst. Noch eine Anmerkung zu deinem Fehler: Das Problem ist, dass deine Klasse von Sprite erbt und Sprite als Instanzvariable hat. Beides macht keinen Sinn. Entweder du erstellst eine Klasse die von Sprite erbt, ODER eine Klasse die eine Instanzvariable vom Typ Sprite hat. Im ersteren Fall musst du aufpassen, dass du die initialize Methode von Sprite aufrufst (konkret: dass du in deiner initialize Methode super() aufrufst). Andernfalls wird der Sprite nicht angelegt. Aus dem Grund kommt bei dir immer die Dispose-Fehlermeldung: Solange kein intialize aufgerufen wurde, ist der Sprite noch nicht angelegt und daher "disposed".

    Geändert von -KD- (17.11.2012 um 16:35 Uhr)

Berechtigungen

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