Ich fahre ganz gut mit folgender Methode (ich beziehe mich mal auf den Hubschrauber oben):
- Pro Sprite lege ich die Grafiken so ab, wie oben gezeigt. Ein Bild für alle Sprites wäre mir zu viel Gefrickel, vor allem, wenn man im Nachhinein noch was ändern will.
- Außerdem habe ich mir eine SpriteLib geschnitzt, welche die Bilder lesen kann und je nachdem was ich als Anzahl Spalten und Anzahl Zeilen beim Methodenaufruf mitgebe, mir das Bild in Sub-Images zerlegt und als Array von BufferedImages zurück liefert. Ein Methodenaufruf sieht dann in etwa so aus:
BufferedImage[] helipic = SpriteLib.getImage("path/....", 4,6);
Wobei ich diesen Methodenaufruf meist in den Konstruktor meiner SpriteKlasse packe, die sowieso ein BufferedImage bzw. ein Array davon erwartet
- die Animation steuere ich dann komplett im eigentlichen Objekt. Dabei setze ich z. b. min/max-Grenzen für die
Animation von - bis fest. Wenn das Ding also nach links gesteuert wird, setzt ein Methodenaufruf die Zähler auf 0 - 3, so daß nur die ersten 4 Bilder des Arrays für die Animation herangezogen werden, eben die auf denen der Hubschrauber nach links fliegt.
- in der paint-Methode selbst ist relativ wenig Code. Eigentlich wird nur das Bild gezeichnet, daß dem aktuellen Animations-Counter entspricht. Den Animations-Counter wiederum überprüfe ich in einer Methode namens doLogic(), die alle meine Sprites haben, um dort solche und weitere Vorgaben zu prüfen. Hier wird dann u. a. geprüft, ob die voreingestellte Zeit in ms für die Animation um ist. Wenn ja, wird der Zähler erhöht, bzw auf den Startwerrt gesetzt, wenn er das aktuelle Maximum überschritten hat.
Wie man es letztlich macht, ist eine Frage, wie gut es funktioniert und wie man selbst damit zurecht kommt. Es gilt aber grundsätzlich, daß man relativ wenig Code ausführen sollte, bzw. Code der wenig aufwändig ist. Damit gehören in der Regel alle Modifikationen, die mit dem Erzeugen, Zerlegen oder Abändern von Grafiken zu tun haben, nicht in eine Methode, die während des Spiels aufgerufen wird. Hierfür ist es z. B. ggeignet eine Initialisations-Methode zu haben, die zu Anfang diese zeitaufwändigen Arbeiten übernimmt. Hier gibt es sicher auch Ausnahmen, die die Regel bestätigen, aber meist ist das so. Warum wohl haben viele Spiele, die man als Flash oder was auch immer im Netz findet, einen Fortschrittsbalken, der nach dem Spielstart angezeigt wird?
