# Ein Spielfeld zeichnen



## Bastard (15. Jan 2006)

Hallo allerseits,

ich möchte für ein Gesellschaftsspiel einen Spielfeld Generator erstellen.
Ich habe noch nicht soo die Erfahrung, will es aber mal alleine versuchen,
doch stellen sich mir Fragen die ich nicht so einfach beantworten kann,
deswegen frag ich einfach hier!  :wink: 

Ich möchte ein rechteckiges Rasterfeld (12 x 12) mit Bildern füllen,
welche das Spielfeld bilden.

Soll ich die Bilder nun als Image laden und in kleine JPanels verpacken,
oder wären Icons besser die ich in JLabels einbinde?
Was wäre hier am Sinnvollsten?

In jedem Fall soll es möglich sein,
über die einzelnen Felder noch etwas drüber zuzeichnen.
Da würde sich ja ein GIF anbieten (da das untere Feld durchscheinen soll).
Wie ich das realisieren kann weiß ich allerdings auch noch nicht.

vielen Dank schonmal.
Bastard


----------



## jagdfalke (15. Jan 2006)

Also wenn du was drüberzeichnen willst solltest du das ganze mit Graphics zeichnen. Also Bilder als BufferedImages lagen und per Graphics.drawImage() zeichnen lassen.

mfg
jagdfalke


----------



## Bastard (19. Jan 2006)

Hi,
also ich habe jetzt eine Klasse

```
MapField extends JPanel
```
erstellt, die in ihrer paint methode mittels drawImage ein Bild auf sich selbst zeichnet.
Die MapFields liegen in einem doppel Array und werden in einem GridLayoutManager (12, 12) gezeichnet.

Das klappt alles wunderbar, vielen Dank für den Tipp unten!


Per Listener fange ich Mouseklicks darauf ab, und möchte nun ein anderes Bild darüberzeichnen!
Wie soll ich das machen?

wenn ich im Array das MapField ändere und repaint aufrufe, passiert nichts.

Hier der Code:



```
//Teile des Konstruktors im Hauptframe.
JPanel mapPanel = new JPanel(); 
mapPanel.setLayout(new GridLayout(12, 12));
	
createMapRaster();

//initial filling of the map
for (int i = 0; i < mapRaster.length; i++) {
	for (int j = 0; j < mapRaster[i].length; j++) {
		mapPanel.add(mapRaster[i][j]);
	}
}
```


```
private void createMapRaster(){
	mapRaster= new MapField[12][12];
	for(int i=0; i<mapRaster.length; ++i){
		for (int j = 0; j < mapRaster[i].length; j++) {
			MapField l= new MapField(j,i, imgBlue, "blue");
			l.addMouseListener(new FieldListener(l, this));
			mapRaster[i][j]= l;
		}
	}
}
```


```
//wird vom FieldListener aufgerufen
public void drawField(MapField mf){
	int x= mf.getXPosition();
	int y= mf.getYPosition();
	MapField m= mapRaster[x][y];
	
	m= new MapField(x, y, imgRed, "red");
	mapRaster[x][y]= m;
	repaint();
}
```


----------



## Beni (19. Jan 2006)

Wenn du die Mapfehler erstmals dem "mapPanel" hinzugefügt hast, sind sie unabhängig vom Array. D.h. wenn du im Array was ersetzt, hat das keinen Einfluss auf das mapPanel.

Du kannst aber über den Array immernoch auf die Fields zugreiffen, welche auf dem Panel liegen. Und hier ist auch eine einfache Lösung versteckt: gib dem MapField die Möglichkeit das Bild auszuwechseln. Anstelle der Erstellung eines neuen MapFieldes, rufst du dann bei einem alten MapField die Methode auf, welche das Bild auswechselt.


----------



## Guest (20. Jan 2006)

hallo
wie kann man denn graphiken über andere legen ?
wenn man beispielsweise ein spielfeld hat auf dem figuren stehen sollen.


----------



## Beni (20. Jan 2006)

In einer paint-Methode mehr als einmal "g.drawImage" aufrufen :wink: Das letzte Image ist auch immer das oberste Image.


----------



## Bastard (20. Jan 2006)

@ Beni: super,
so funktioniert das Ganze, danke!

Noch eine Frage ... :roll: 
Ein Kumpel von mir meinte es gäbe eine statische Methode, mit der man einfach Bilder aus einem Pfad laden kann.
Ist das korrekt?
Ich habe nichts dazu gefunden.


----------



## Illuvatar (20. Jan 2006)

Schau mal die Klasse javax.imageio.ImageIO an.


----------

