# 2D Spiel - Level einlesen - Problem mit paint



## raven (27. Jun 2006)

Hallo,

Ich versuche mich zur Zeit an ein 2D Spiel in dem man Levels aus Text-Dateien einließt. Das Funktioniert ja auch soweit, Da die Variablen die ich zum zeichnen brauche erfolgreich aus der Text-Datei ausgelesen wurden. 
Nun rätsel ich schon die ganze Zeit lang wie ich diese Fehlermeldung beseitigen kann:


```
Main.java:44: cannot find symbol
symbol  : method paint(java.awt.Graphics2D)
location: class java.lang.Object
                        objects.get(i).paint(g2D);
```

Ich weiß ungefähr was der Grund für diese Fehlermeldung sein kann. Ich nehme an Ich erzeuge die Klasse "Ground" an der falschen stelle so das (siehe oben) meine paintComponent nicht die paint Methode der Klasse "Ground" aufrufen kann. Aber ich wüßte nicht an welcher anderen Stelle ich das machen sollte.

Ich stell einfach mal mein bis jetzt geschriebenen Code rein. Ich hoffe ihr könnt mir helfen. Bin echt verzweiflt!

Das ist meine Main-Class

```
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.*;

public class Main extends JPanel {

	private Image image;

	public Vector objects = new Vector();

	public Main() {
		Map map = new Map(this, "./level/testLevel01.txt");
	}

	public static void main(String[] arguments) {
		JFrame frame = new JFrame("TestSpiel");
		Main main = new Main();
		
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();  
		frame.setSize(800, 600);      
		frame.setLocation((screen.width-frame.getSize().width)/2,
			(screen.height-frame.getSize().height)/2);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(main);
		frame.setVisible(true);
	}

	public void addObject(int xPosObject, int yPosObject, String imagePath) {
		image = Toolkit.getDefaultToolkit().getImage(imagePath);
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(image, 0);
		try{
			mt.waitForID(0);
		} catch (InterruptedException e) {
			System.out.println("---ERROR---");
		}
		objects.addElement(new Ground(this, xPosObject, yPosObject, image));
	}

	public void paintComponent(Graphics g) {
		Graphics2D g2D = (Graphics2D)g;
		for(int i = 0; i < objects.size(); i++) {
			objects.get(i).paint(g2D);
		}
	}
}
```

Das ist die Kasse in der das Level eingelesen wird:

```
import java.io.*;
import java.awt.*;

public class Map {

	public Main main;

	private String imagePath = "";
	private int xPosObject;
	private int yPosObject;

	public Map(Main main, String mapPath) {
		try{
			FileReader level = new FileReader(mapPath);
			BufferedReader levelBuffer = new BufferedReader(level);

			int readPos = 0;
			String charSave = "";
			String imageSave = "";
			boolean readImage = false;
			boolean eof = false;

			while(!eof) {
				String line = levelBuffer.readLine();
				if(line == null) {
					eof = true;
				} else {
					for(int i = 0; i<line.length(); i++) {
						if(line.charAt(i) != ',') {
							if (line.charAt(i) != '"') {
								if (readImage == false) {
									charSave = charSave + line.charAt(i);
								}
								if (readImage == true) {
									if(line.charAt(i) != '"' &&
										line.charAt(i) != ';') {
										imageSave = imageSave + line.charAt(i);
									} else {
										imagePath = imageSave;
										imageSave = "";
										readImage = false;
										readPos = 0;
									}
								}
							} else {
								readImage = true;
							}
						} else {
							if(readPos == 0) {
								xPosObject = Integer.parseInt(charSave);
							}
							if(readPos == 1) {
								yPosObject = Integer.parseInt(charSave);
							}
							charSave = "";
							readPos++;
						}
					}
					main.addObject(xPosObject, yPosObject, imagePath);
				}
			}
			levelBuffer.close();
		} catch(IOException e) {
			System.out.println("--- ERROR ---");
		}
	}
}
```

Und das ist die Klasse "Ground". Die ganzen verschiedenen Objekte Ground speichere ich alle in ein Vector.

```
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Ground {
	
	public Main main;

	private Image image;
	private int xPosObject;
	private int yPosObject;

	public Ground(Main main, int xPosObject, int yPosObject, Image image) {
		this.main = main;
		this.xPosObject = xPosObject;
		this.yPosObject = yPosObject;
		this.image = image;
	}

	public void paint(Graphics2D g2D) {
		g2D.drawImage(image, xPosObject*25, yPosObject*25, main);
	}
}
```

Und hier wie die Text-Datei aussieht aus der ich mein Level aufbaue.

```
5,15,"./pics/ground01.gif";
6,15,"./pics/ground02.gif";
7,15,"./pics/ground02.gif";
8,15,"./pics/ground02.gif";
9,15,"./pics/ground02.gif";
10,15,"./pics/ground03.gif";
5,16,"./pics/ground04.gif";
6,16,"./pics/ground05.gif";
7,16,"./pics/ground05.gif";
8,16,"./pics/ground05.gif";
9,16,"./pics/ground05.gif";
10,16,"./pics/ground06.gif";
```


----------



## The_S (27. Jun 2006)

paint wird grundsätzlich mit dem Konstruktor Graphics aufgerufen, nicht mit Graphics2D. Wenn du Graphics2D benötigst musst du anschließend casten


```
public void paint(Graphics g) {

   Graphics2D g2D = (Graphics2D)g;
   // rest vom Schützenfest
}
```


----------



## raven (27. Jun 2006)

jetzt Hab ich Graphics2D überall raus gemacht, Unbedingt brauchen tuh ich es ja noch nicht. aber an der Fehlermeldung hat sich nichts geändert. Ich kann ich aber errinern das ich das vorher auch immer so gemacht habe.


----------



## dieta (27. Jun 2006)

Du musst das Object, das die get-Methode zurückliefert noch zu eine Ground-Objekt casten:


```
((Ground)objects.get(i)).paint(g);
```


----------



## Brainiac (28. Jun 2006)

X_Master hat gesagt.:
			
		

> ```
> public Vector objects = new Vector();
> ```



Alternativ kannst du auch den Vector so definieren, geht aber erst seit 1.4 oder 1.5? (weiß grad net genau):


```
public Vector<Ground> objects = new Vector<Ground>();
```

Dann kannst Du dir den Cast sparen.

Gruß Brainiac


----------



## raven (28. Jun 2006)

Hat an dem Casten gelegen. Ich hatte das mit den casten auch schon probiert aber ich hatte das so:


```
Ground(Vecor...)
```

 :? 

Danke für eure hilfe, funktioniert alles.


----------

