Java/Tutorials/Karteneditor II Kapitel 4
Was ist ein Sprite?
Ein Sprite (engl. für ein Geistwesen, Kobold u. a.) ist ein Grafikobjekt, das von der Grafikhardware über das Hintergrundbild bzw. den restlichen Inhalt der Bildschirmanzeige eingeblendet wird.
Eine Solche Sprite ist z.B. unser Charset.
Wir werden aber als erstes eine Abstracte Klasse brauche, weil wir wollen ja noch später NPC und Events Implementieren. Daher erstellen wir die Abstrakte Klasse Sprite mit der Methode getImage(). Das ein BufferedImage zurück liefern soll.
public abstract class Sprite { public abstract BufferedImage getImage(); }
Kommen wir nun zur SpieleSprite-Klasse die wir von der oben genannten Klasse Ableiten. Als Klassenvariablen benötigen wir erstmal ein BufferedImage, also das aussehen unseres Helden. Dann brauchen wir die Position unseres Helden auf der Karte, hierfür werden wir die Klasse Point verwenden, wo wir anschließend die X und Y Werte unseres Helden Speichern werden. Hierbei sei anzumerken das damit die Position auf den Bildschirm gemeint ist und nicht auf der Karte, für die Position auf der Karte wird später ein Weiterer Punkt benötigt. Dies wird gemacht, weil sich der Bildschirm ja nicht immer mit Scrollt, wenn man z.B. am Rand ist soll sich der Char dann von der Mitte los Lösen und sich zum Rand bewegen z.B. und diese Methode spart uns auch einiges an Quellcode ein und wir müssen uns nicht mit Komplizierten Formeln rumschlafen. 2 Weitere Klassevariablen sind die für das SpieleFenster und der Steuerung. Die Steuerung nehmen wir mit, weil es einfach schreibarbeit spart. Keine Angst, das Objekt wird nicht in die Klasse Kopiert, sonst nur eine Referenz, daher ist es immer noch die selbe Klasse die ihr in der SpielFenster Klasse Initialisiert habt. Das Charset werden wir wieder mit der Klasse ImageIO und File laden.
public class SpielerSprite extends Sprite{ BufferedImage charset; Point position=new Point(9,8); SpielFenster fenster; Steuerung steuerung; public SpielerSprite(String dateiname, SpielFenster f) { fenster=f; steuerung=fenster.steuerung; try { charset=ImageIO.read(new File(dateiname)); } catch (IOException fehler) { fehler.printStackTrace(); } } @Override public BufferedImage getImage() { } }
Kommen wir nun zur Methode getImage() die wir ja von Spirte implementieren mussten, ihr werdet nun erfahren wie man wirklich Animationen erstellt mit Java. Hierfür legen wir uns eine float Variable an. Die bei jeden aufruf von getImage() um einen kleinen Teil erhöht wird, in unseren Fall nehmen wir den wert 0.33. Dieser Wert wird später unsere FPS entsprechen. Aber der Wert soll nur erhöht werden, wenn wir uns bewegen, nun kommt die Klassenvariable bewegung ins Spiel aus der Klasse Steuerung. Wenn wir uns bewegen wird die Variable animation um 0.33 Einheiten erhöht. Falls wir uns nicht bewegen wird die Variable auf 0.0 gesetzt. So das dann aus unseren Charset die erste Pose jeweils links ausgewählt wird, da wir 4 Animationen haben müss wir dafür sorgen, das der Wert der animation-Variable den Wert 4 übersteigt bzw. den Wert 3.5. Da wir ja von 0 Anfangen zu zählen. Wenn der Wert 4 erreicht ist wie die Variable wieder auf 0 gesetzt. Kommen wir nun zur Methode getSubimage von der Klasse BufferedImage. Mit dieser Methode können wir uns einen Teil aus einen Bild herraus hohlen in unseren Fall eine Pose aus unseren Charset. Die Variable animation sagt hierbei aus welche Spalte wir die Pose nehmen. Für die Zeilen werden wir die KlassenVariable letzterichtung von Steuerung verwenden, es wird nun klar, warum wir diese Zahlen verwendet haben. Anschließend Multiplizieren wir es noch mit 32 und 48.
Anmerkung: Eine Pose hat eine Höhe von 48 Pixeln und eine Breite von 32 Pixeln.
public class SpielerSprite extends Sprite{ BufferedImage charset; Point position=new Point(9,8); SpielFenster fenster; Steuerung steuerung; float animation=0.0f; public SpielerSprite(String dateiname, SpielFenster f) { fenster=f; steuerung=fenster.steuerung; try { charset=ImageIO.read(new File(dateiname)); } catch (IOException fehler) { fehler.printStackTrace(); } } @Override public BufferedImage getImage() { if(steuerung.bewegung)animation+=0.33; else animation=0.0f; if((int)animation ==4 ) animation=0.0f; return charset.getSubimage(((int)animation)*32, steuerung.letzterichtung*48, 32, 48); } }
Fügen wir nun unser SpielerSprite unseren SpielFenster hinzu.
public class SpielFenster extends JFrame{ Steuerung steuerung; SpielerSprite spieler; Karte karte; public SpielFenster() { steuerung=new Steuerung(); addKeyListener(steuerung); spieler=new SpielerSprite("Char.png",this); karte=Karte.ladeKarte("1.karte"); setSize(new Dimension(640,480)); setTitle("Spiel"); setVisible(true); } }
