Java/Tutorials/Entwicklung eines einfachen Karteneditors III/Kapitel 3

Aus Scientia
Version vom 24. Januar 2011, 12:21 Uhr von Alexis Hiemis (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Für diese Option müssen wir nicht viel schreiben. Wir erstellen hierfür eine Klasse PassmapPalette die von der Klasse TilePalette erbt.

public class PassmapPalette extends TilePalette{
 
	public PassmapPalette(KartenFenster kartenfenster) {
		super(kartenfenster);
	}
}

Das machen wir damit wir nicht nochmal alles neu schreiben müssen. Das einzige was wir doch nochmals brauchen ist die paintComponent'-Methode. Diese Kopieren wir vollständig aus der TilePalette

public class PassmapPalette extends TilePalette{
 
	public PassmapPalette(KartenFenster kartenfenster) {
		super(kartenfenster);
	}
 
	public void paintComponent(Graphics g)
	{
		int tileAnzahl=fenster.aktuelleKarte.tileset.size();
		int zeile=0;
		int spalte=0;
		for(int i=0;i<tileAnzahl;i++)
		{
			BufferedImage tile=fenster.aktuelleKarte.tileset.get(i);
			g.drawImage(tile,spalte*32, zeile*32, this);
 
			if(i%4 == 3)
			{
				zeile++;				
				spalte=0;
			}
			else spalte++;
		}
	}
}

Wir legen nun Fest, Wenn in der Passmap eine 1 steht, soll das Tile passierbar sein und wenn es 0 ist, soll es unpassierbar sein. Zur grafischen Hervorherbung fügen wir eine if/else Abfrage hinzu:

			if(fenster.aktuelleKarte.passmap[i] == 1)
			{
				g.setColor(Color.green);
				g.drawOval(spalte*32, zeile*32, 32, 32);
			}
			else
			{
				g.setColor(Color.red);
				g.drawRect(spalte*32, zeile*32, 32, 32);
			}

Mit der Methode setColor der Klasse Graphics sagen wir, das das nächste zu zeichnende Objekt die Angegebe Farbe sein soll. Daher wir verwenden grün wenn es Passierbar ist und Rot, wenn es nicht passierbar ist. Mittels der Methode drawOval, werden wir ein Kreiszeichnen wenn es Passierbar ist und wenn es nicht Passierbar ist zeichnen wir mittels drawRecht ein Rotes Rechteck. Diese Zeichen-Operationen müssen unbedingt nach drawImage erfolgen, da sonst diese überschreibt.

Am Ende sieht es wie folgt aus:

public class PassmapPalette extends TilePalette{
 
	public PassmapPalette(KartenFenster kartenfenster) {
		super(kartenfenster);
	}
 
	public void paintComponent(Graphics g)
	{
		int tileAnzahl=fenster.aktuelleKarte.tileset.size();
		int zeile=0;
		int spalte=0;
		for(int i=0;i<tileAnzahl;i++)
		{
			BufferedImage tile=fenster.aktuelleKarte.tileset.get(i);
			g.drawImage(tile,spalte*32, zeile*32, this);
			if(fenster.aktuelleKarte.passmap[i] == 1)
			{
				g.setColor(Color.green);
				g.drawOval(spalte*32, zeile*32, 32, 32);
			}
			else
			{
				g.setColor(Color.red);
				g.drawRect(spalte*32, zeile*32, 32, 32);
			}
			if(i%4 == 3)
			{
				zeile++;				
				spalte=0;
			}
			else spalte++;
		}
	}
}

Damit wir nun die Passmap ändern können, müssen wir die Methode setTile überschreiben. Wir erinnern uns, das die Klasse TilePalette eine Klassenvariable des Namen aktuelleTile hat, um auf diese zugreifen zu können müssen wir die Methode von der übergeordneten Klasse also TilePalette aufaufrufen. Dies macht man mit super.setTile. So rufen wir die Methode von TilePalette auf. Dies sieht wie folgt aus:

public class PassmapPalette extends TilePalette{
 
	public PassmapPalette(KartenFenster kartenfenster) {
		super(kartenfenster);
	}
 
	public void paintComponent(Graphics g)
	{
		int tileAnzahl=fenster.aktuelleKarte.tileset.size();
		int zeile=0;
		int spalte=0;
		for(int i=0;i<tileAnzahl;i++)
		{
			BufferedImage tile=fenster.aktuelleKarte.tileset.get(i);
			g.drawImage(tile,spalte*32, zeile*32, this);
			if(fenster.aktuelleKarte.passmap[i] == 1)
			{
				g.setColor(Color.green);
				g.drawOval(spalte*32, zeile*32, 32, 32);
			}
			else
			{
				g.setColor(Color.red);
				g.drawRect(spalte*32, zeile*32, 32, 32);
			}
			if(i%4 == 3)
			{
				zeile++;				
				spalte=0;
			}
			else spalte++;
		}
	}
	@Override
	public void setTileID(int x, int y)
	{
		super.setTileID(x, y);
	}
}

Um jetzt auch die Passmap zu ändern, brauchen wir nur noch eine if/else Hinzufügen, wo wir den aktuellen wert Abfragen und ihn in das Gegenstück ändern. Das heißt steht in der Passmap bei der gegeben Tile 0, müssen wir es in 1 ändern. Steht hingegen 1, müssen wir es in 0 ändern. Zuschmuss muss man noch ein repaint aufruf betätigen, damit die anzeige aktualisiert wird.

public class PassmapPalette extends TilePalette{
 
	public PassmapPalette(KartenFenster kartenfenster) {
		super(kartenfenster);
	}
 
	public void paintComponent(Graphics g)
	{
		int tileAnzahl=fenster.aktuelleKarte.tileset.size();
		int zeile=0;
		int spalte=0;
		for(int i=0;i<tileAnzahl;i++)
		{
			BufferedImage tile=fenster.aktuelleKarte.tileset.get(i);
			g.drawImage(tile,spalte*32, zeile*32, this);
			if(fenster.aktuelleKarte.passmap[i] == 1)
			{
				g.setColor(Color.green);
				g.drawOval(spalte*32, zeile*32, 32, 32);
			}
			else
			{
				g.setColor(Color.red);
				g.drawRect(spalte*32, zeile*32, 32, 32);
			}
			if(i%4 == 3)
			{
				zeile++;				
				spalte=0;
			}
			else spalte++;
		}
	}
	@Override
	public void setTileID(int x, int y)
	{
		super.setTileID(x, y);
		if(fenster.aktuelleKarte.passmap[aktuelleTile] == 1)
		{
			fenster.aktuelleKarte.passmap[aktuelleTile] = 0;
		}
		else
		{
			fenster.aktuelleKarte.passmap[aktuelleTile] = 1;
		}
		repaint();
	}
}