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)
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.
Das Bild sollte übrigens, wenn es nicht mehr benötigt wird freigegeben werden (disposed). Deine Klasse sollte dispose wie folgt überschreiben:
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.