(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:
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".