# Pacman-Clone



## linuxjava (10. Jun 2010)

Hallo!
Ich würde gerne einen Pacman-Clone programmieren.
Suche deshalb erfahrene Java-Programmierer, die mich dabei unterstützen (ich würde das auch alleine hinkriegen, aber umso mehr, desto besser ).
würde als GUI swing und java2D nehmen. Codesaustausch und so würde ich gleich hier im Thema machen.


----------



## ARadauer (10. Jun 2010)

> umso mehr, desto besser


Ich denke, dass bei so einem kleinen Projekt, sich eher mehr Programmierer in die Quere kommen...

Fang mal an, und wenn du auf Probleme stößt, wir dir hier sicher gerne geholfen...


----------



## linuxjava (10. Jun 2010)

> Ich denke, dass bei so einem kleinen Projekt, sich eher mehr Programmierer in die Quere kommen...


Ich meinte eigentlich damit, dass dann umso weniger Fehler passieren.
Aber na gut, ich werde einfach anfangen und meine Ergebnisse immer mal posten.


----------



## linuxjava (10. Jun 2010)

OK, ich poste hier mal die Klassen, die ich anlegen will (bzw. die Konstruktoren)
-
	
	
	
	





```
void GameFrame()
```
-
	
	
	
	





```
void SettingsFrame()
```
-
	
	
	
	





```
EditorFrame()
```
-
	
	
	
	





```
ThreadMonsterMove()
```
*kurze Erläuterungen dazu:*
-
	
	
	
	





```
void GameFrame(String Levelfile)
```
Es wird ein Labyrinth mit 50 x 50 Feldern.
Was ich dafür bräuchte wären gescheite Graphiken.
Könnte das jemand machen ??? 
Bräuchte vorerst Mauern, einen Pacman und Monster, mehr will ich erstmal nicht machen (muss sich eigentlich nicht mal bewegen ).
Welches Teil an welcher Stelle ist (auch Monster und Pacman), wird in ein 2D int-Array eingetragen (mit 50X50 Feldern eben)
nach jeder Aktion (drücken einer Pfeiltaste, ...) wird ein entsprechendes Feld neugeladaden.
soll ein Menu haben, wo man sich dann irgendwo eine Leveldatei auswählen kann.
Dh. man kann auch nicht speichern, weil man ja sowieso alle Leveldatein auswählen kann.


```
void SettingsFrame()
```
Hier kann man Einstellungen ändern. Was da genau reinkommt, weiß ich noch nicht.
Könnte mir zB. vorstellen, das man verschiedene Graphiksets auswählen kann oder so.
Aber das kommt wenn dann erst zum Schluss


```
EditorFrame()
```
Ist halt ein Editor für eigene Levels. Gibt ein menu, wo man das Level speichern kann. Oder sollte ich sowas über Tastenkürzel machen ? Außerdem eine Tabelle mit den verschiedenen Teilen (Mauer, Startposition,...)


```
ThreadMonsterMove()
```
Ist ein Thread, der die Monster bewegt. Da sie sich aber in Richtung Pac bewegen sollen, hab ich keine Ahnung wie ich das machen soll. Könnte mir da jemand Tipps gebens?
-------------------------------------------------------------
Außerdem gibt es noch folgende Datein im Verzeichniss:
- settings.properties -> für die den SettingsFrame
- /Levels/ -> Standartverzeichniss für eigene Levels
------------------------------------------------------------
Ich bräuchte auch noch irgendwie ein Speichern/Laden - Frame (Game und Editor). 
Soll ich das mit SWT machen (da gibts doch was entsprechendes) oder weiß jemand wie ich das selbst implementieren kann?


Gruß linuxjava


----------



## linuxjava (10. Jun 2010)

und ich brauche mal noch nen Namen für das Spiel


----------



## linuxjava (10. Jun 2010)

Ok hier erstmal das absoulute Grundgerüst:

```
import javax.swing.JFrame;


public class GameFrame extends JFrame{
	static String version = "0.01 alpha";
	static String name = "Pacman";
	public GameFrame() {
		super(name+" "+version);
		setSize(1200,900);
		setVisible(true);
	}
	public static void main(String[] args) {
		GameFrame GF = new GameFrame();
	}
}
```


----------



## linuxjava (10. Jun 2010)

Achja, wenn ihr hier mir Tipps gebt oder Bilder postet, dann sei euch gesagt, dass das Projekt unter der GPL in Sourceforge gehostet wird. Heisst also, das die Bilder dann jeder benutzen darf und das ich dafür auch kein Geld geb.


----------



## eRaaaa (10. Jun 2010)

linuxjava hat gesagt.:


> Achja, wenn ihr hier mir Tipps gebt



... erster Tipp zum Grundgerüst: 


```
public static final String VERSION = "0.01 alpha";
 public static final String NAME = "Pacman";
```

also an Konventionen halten.

Und Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing) mal anschauen, besonders die zweite Seite


----------



## linuxjava (10. Jun 2010)

```
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String version = "0.01 alpha";
	public static final String name = "Pacman";
	// suche besseren Variablennamen
	public static String filetrenner = "/";
	public static int feld[][] = new int[50][50];
	
	public GameFrame() {
		super(name+" "+version);
		setSize(1200,900);
		setVisible(true);
		openLevelFile(loadLevelFile());
	}
	public static void main(String[] args) {
		GameFrame GF = new GameFrame();
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+filetrenner+"Level"+filetrenner+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<50;i++){
				for(int a=0;a<50;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```
Wenns irgendwelche unklarheitengibt ... fragt!


----------



## linuxjava (10. Jun 2010)

> Und Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing) mal anschauen, besonders die zweite Seite


Ich meinte nicht, das ich keine Ahnung von Threads habe, sondern das ich nicht weiß, wie man die künstliche Intelligenz der Monster programmiert


----------



## eRaaaa (10. Jun 2010)

linuxjava hat gesagt.:


> Ich meinte nicht, das ich keine Ahnung von Threads habe, sondern das ich nicht weiß, wie man die künstliche Intelligenz der Monster programmiert



Und ich bezog mich gar nicht auf deinen Text, sondern lediglich auf deinen Code

```
public GameFrame() {
        super(name+" "+version);
        setSize(1200,900);
        setVisible(true);
        openLevelFile(loadLevelFile());
    }
    public static void main(String[] args) {
        GameFrame GF = new GameFrame();
    }
```

aber ich bin ja schon still jetzt :bae:


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String version = "0.01 alpha";
	public static final String name = "Pacman";
	// suche besseren Variablennamen
	public static String filetrenner = "/";
	public static int feld[][] = new int[40][30];
	public GameFrame() {
		super(name+" "+version);
		setSize(1300,900);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
	}
	public static void main(String[] args) {
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+filetrenner+"Level"+filetrenner+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		Graphics g = getGraphics();
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
}
```
Die Felder hab ich mal auf 40x30 begrenzt.


----------



## Gast2 (10. Jun 2010)

> // suche besseren Variablennamen
> public static String filetrenner = "/";
> public static int feld[][] = new int[50][50];




```
FILE_SEPERATOR und grid
```
 ?
Außerdem würde ich 
	
	
	
	





```
FILE_SEPERATOR
```
, 
	
	
	
	





```
NAME
```
 und 
	
	
	
	





```
VERSION
```
 final (und dann auch großgeschrieben) machen.

Du könntest dir auch überlegen das grid aus enums zu machen anstatt ints.
Hat den Vorteil dass du dich dann nicht um ungültige zustände (z.b. 42) kümmern musst und kannst relativ leicht neue hinzufügen.


----------



## Quaxli (10. Jun 2010)

Pacman Dossier

:rtfm:


----------



## linuxjava (10. Jun 2010)

> Du könntest dir auch überlegen das grid aus enums zu machen anstatt ints.


Und wie definiert man die?


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String VERSION = "0.01 alpha";
	public static final String NAME = "Pacman";
	public static String FILE_SEPERATOR;
	public static int feld[][] = new int[40][30];
	public GameFrame() {
		super(NAME+" "+VERSION);
		setSize(1300,1000);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
	}
	public static void main(String[] args) {
		FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","/");
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		Graphics g = getGraphics();
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
}
```


----------



## eRaaaa (10. Jun 2010)

.....also schade dass du dir den Link nicht mal angeschaut hast, aber noch etwas:
wieso übergibst du newpaint(0); nicht das Graphics-Objekt dass du in paint übergeben bekommst? Denn getGraphics kann zu komischen ungewollten Problemen führen!
Des weiteren überschreibt man in Swing eig. eher paintComponent eines JPanels o.ä.


----------



## linuxjava (10. Jun 2010)

Wenn jetzt zb. die Datei /Level/Example.properties so aussieht:

```
0|0=1
0|1=1
0|2=2
```
dann sieht das entsprechende Bild dazu aus: (siehe Anhang)


----------



## srea (10. Jun 2010)

Hab das ma aus Neugierde bei mir gestartet und bekomme nen Bild mit transparentem Rand, der sich beim verschieben aber nicht verändert. Ist des gewollt?

[c]setDefaultCloseOperation(EXIT_ON_CLOSE);[/c] wäre auch noch schön.


----------



## linuxjava (10. Jun 2010)

> Hab das ma aus Neugierde bei mir gestartet und bekomme nen Bild mit transparentem Rand, der sich beim verschieben aber nicht verändert. Ist des gewollt?


Schick das ganze mal als Screenshot. Welches OS verwendest du?


----------



## linuxjava (10. Jun 2010)

> wieso übergibst du newpaint(0); nicht das Graphics-Objekt dass du in paint übergeben bekommst? Denn getGraphics kann zu komischen ungewollten Problemen führen


Ich will ja newpaint() nicht nur aus paint() aufrufen. Später zB. auch aus einem KeyListener, dann aber mit anderen parameter


----------



## srea (10. Jun 2010)

Hier verwende ich Windows XP.
Wenn ich zu Hause bin kann ich mal noch mit Ubuntu 10.04 und Windows 7 versuchen wenn nötig.
Screenshot im Anhang


----------



## linuxjava (10. Jun 2010)

ähh... so sollte das eigentlich nicht aussehen... 
Dummerweise habe ich aber kein Windows, und kann es so auch nicht selber austesten. Hast du auch die Datei \Level\Example.properties ??
Oder es kann auch sein, das  FILE_SEPERATOR  "\\" sein muss. Dann funktioniert die Methode in main nicht .... must die dann auch löschen


----------



## The_S (10. Jun 2010)

linuxjava hat gesagt.:


> Ich will ja newpaint() nicht nur aus paint() aufrufen. Später zB. auch aus einem KeyListener, dann aber mit anderen parameter



Das ist aber schlechter Stil und führt nur zu neuen Problem.


----------



## srea (10. Jun 2010)

linuxjava hat gesagt.:


> ähh... so sollte das eigentlich nicht aussehen...


Hab ich mir fast gedacht.



> Dummerweise habe ich aber kein Windows, und kann es so auch nicht selber austesten.


Schlechte Vorraussetzungen um nen Spiel das du veröffentlichen willst zu programmieren 



> Hast du auch die Datei \Level\Example.properties ??


Wenn in deiner Example.properties nur das steht was auf der ersten Seite hier im Thread is 

```
0|0=1
0|1=1
0|2=2
```
hab ich mir mal erstellt... Sieht genauso aus.


----------



## Gast2 (10. Jun 2010)

Bei mir unter Win7 schauts normal aus.


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String VERSION = "0.01 alpha";
	public static final String NAME = "Pacman";
	public static String FILE_SEPERATOR;
	public static int feld[][] = new int[40][30];
	private Graphics g;
	private boolean isGset = false;
	public GameFrame() {
		super(NAME+" "+VERSION);
		g = getGraphics();
		setSize(1300,1000);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","\\");
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paintComponents(Graphics gC) {
		// TODO Auto-generated method stub
		if(isGset == false){
			g = gC;
		}
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
}
```



> fDas ist aber schlechter Stil und führt nur zu neuen Problem.


Findet ihr es so besser?


> Zitat: linuxjava
> 
> Beitrag anzeigen
> 
> ...


Ich hab noch was an meiner Antwort editiert


----------



## linuxjava (10. Jun 2010)

oh, wartet...
ich hab noch was vergesen:

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String VERSION = "0.01 alpha";
	public static final String NAME = "Pacman";
	public static String FILE_SEPERATOR;
	public static int feld[][] = new int[40][30];
	private Graphics g;
	private boolean isGset = false;
	public GameFrame() {
		super(NAME+" "+VERSION);
		g = getGraphics();
		setSize(1300,1000);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","\\");
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paintComponents(Graphics gC) {
		// TODO Auto-generated method stub
		if(isGset == false){
			g = gC;
			isGset = true;
		}
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
}
```


----------



## srea (10. Jun 2010)

Nein, lag nicht am File Seperator. Solange ich der einzige mit dem Problem is ja egal.
Ich klink mich ma aus


----------



## linuxjava (10. Jun 2010)

Noch mal geändert:

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String VERSION = "0.01 alpha";
	public static final String NAME = "Pacman";
	public static String FILE_SEPERATOR;
	public static int feld[][] = new int[40][30];
	public static Graphics g;
	private boolean isGset = false;
	public GameFrame() {
		super(NAME+" "+VERSION);
		g = this.getGraphics();
		setSize(1300,1000);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","\\");
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paintComponents(Graphics gC) {
		// TODO Auto-generated method stub
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
	
}
```
Ich krieg da folgende Fehlermeldung:

```
Exception in thread "main" java.lang.NullPointerException
	at GameFrame.newpaint(GameFrame.java:71)
	at GameFrame.<init>(GameFrame.java:29)
	at GameFrame.main(GameFrame.java:34)
```
irritiert mich, weil ich ja eigentlich g instanziert hebe


----------



## eRaaaa (10. Jun 2010)

> Returns:
> a graphics context for this component, or null if it has none



JFrame (Java Platform SE 6)

ps.: ( paintComponent*s* != paintComponent ...(und bevor du jetzt sagst, dass es das bei JFrame nicht gibt, hatte ich dir extra gesagt, dass man dann JPanel o.ä. nimmt!)


----------



## Gast2 (10. Jun 2010)

Ich auch 

Oben wurde doch jetzt schon öfter mal geschrieben dass getGraphics() aufzurufen zu problemen führen kann. Et voilà hier ist eines 
Wenn dein Frame noch nicht sichtbar ist, dann liefert getGraphics() null.

Also: finger weg von getGraphics()


----------



## The_S (10. Jun 2010)

linuxjava hat gesagt.:


> Findet ihr es so besser?



Nein, noch immer getGraphics.


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame{
	public static final String VERSION = "0.01 alpha";
	public static final String NAME = "Pacman";
	public static String FILE_SEPERATOR;
	public static int feld[][] = new int[40][30];
	public static Graphics g;
	public GameFrame() {
		super(NAME+" "+VERSION);
		setSize(1300,1000);
		setVisible(true);
		openLevelFile(loadLevelFile());
		newpaint(0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","\\");
		GameFrame GF = new GameFrame();
	}
	@Override
	public void paintComponents(Graphics gC) {
		// TODO Auto-generated method stub
		g = gC;
		newpaint(0);
	}
	private String loadLevelFile(){
		// muss noch überschrieben werden (mit Load-Frame)
		return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
	}
	private void openLevelFile(String file){
		Properties p = new Properties();
		try {
			p.load(new FileReader(new File(file)));
			
			for(int i=0;i<40;i++){
				for(int a=0;a<30;a++){
					feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void newpaint(int commando){
		//commando:
		// 0... alles neuzeichnen
		for(int i=0;i<40;i++){
			for(int a=0;a<30;a++){
				if(commando == 0){
					if(feld[i][a] == 0){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 1){
						g.setColor(Color.BLACK);
						g.fillRect(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 2){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.YELLOW);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
					if(feld[i][a] == 3){
						g.setColor(Color.WHITE);
						g.fillRect(i*30+20, a*30+50, 30, 30);
						g.setColor(Color.RED);
						g.fillOval(i*30+20, a*30+50, 30, 30);
					}
				}
			}
		}
	}
	
}
```
So, jetzt habe ich getGraphics weggelassen.
Krieg aber immer noch die NullPointerException


----------



## Gast2 (10. Jun 2010)

Ja... du rufst ja auch im Konstruktor newPaint(); auf, da ist g noch null.

EDIT:

```
@Override
    public void paintComponents(Graphics gC) {
        // TODO Auto-generated method stub
        g = gC;
        newpaint(0);
    }
```
paintComponents wird nie(?) aufgerufen, überschreib besser paintComponent von nem JPanel, dass dann dein Spielfeld darstellt.


----------



## linuxjava (10. Jun 2010)

> ps.: ( paintComponents != paintComponent ...(und bevor du jetzt sagst, dass es das bei JFrame nicht gibt, hatte ich dir extra gesagt, dass man dann JPanel o.ä. nimmt!)


Also bei JComponent gibts ne Methode paintComponent.
Könntest du mir ein Beispiel geben, wie man die dann verwendet?


----------



## linuxjava (10. Jun 2010)

ah stimmt, danke.
aber jetzt sehe ich nichts im Fenster (Anhang)
wenn ich statt paintComponents() nur paint() nehme, dann sind wenigstens die Felder weis (Anhang)


----------



## Gast2 (10. Jun 2010)

> Könntest du mir ein Beispiel geben, wie man die dann verwendet?


Naja, anstatt auf dem JFrame zu malen, malst du auf einem JPanel. Das unterscheidet sich nur in der Hinsicht dass du paintComponent überschreibst anstatt paint.
Das JPanel kannst du dann auf deinen JFrame adden.


----------



## linuxjava (10. Jun 2010)

Aber ich finde keine Klasse paintComponent() in JPanel


----------



## Sempah (10. Jun 2010)

keine Klasse.

-> JPanel (Java 2 Platform SE v1.4.2)
-> Methods inherited from class javax.swing.JComponent
-> JComponent (Java 2 Platform SE v1.4.2)


----------



## Gast2 (10. Jun 2010)

und hier noch ein kleines Beispiel:


```
public static void main(String[] args) {
        JFrame frame = new JFrame();

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);

                g.drawString("Ich bin ein Spielfeld", 100, 100);
            }
        };
        panel.setPreferredSize(new Dimension(400, 200));
        
        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
```


----------



## linuxjava (10. Jun 2010)

ähh... und wie muss jetzt der Befehl zum definieren des JPanels aussehen?
Ich komme da nicht so richtig weiter.


----------



## linuxjava (10. Jun 2010)

ah ok, ich hatte nicht aktualisiert


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame {
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int feld[][] = new int[40][30];
    public static Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        JPanel JP = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);
                
                g = gC;
                newpaint(0);
            }
        };       
        add(JP);
        
        setVisible(true);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("FILE_SEPERATOR","/");
        GameFrame GF = new GameFrame();
    }
 
    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<40;i++){
                for(int a=0;a<30;a++){
                    feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void newpaint(int commando){
        //commando:
        // 0... alles neuzeichnen
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(commando == 0){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 1){
                        g.setColor(Color.BLACK);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 3){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.RED);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                }
            }
        }
    }

}
```
Danke es funktioniert !!!
Hoffe, ich kapier sowas das nächste mal schneller


----------



## Gast2 (10. Jun 2010)

```
JPanel JP = new JPanel() {
```
Variablen schreibt man klein 
Wenn du das neue JPanel als anonyme Klasse anlegst kannst du später nicht nochmal drauf zugreifen. Ich würde es daher besser in eine eigene Datei auslagern und als eigene Klasse definieren.

(Mein Code war nur auf die schnelle hingetippt und mit der anonyme klasse gings einfach scheller )


----------



## linuxjava (10. Jun 2010)

Gibt es irgendeine Methode den "FILE_SEPARATOR" des Betriebsystemes zu erkennen.
Ich meine damit das Zeichen, welches Verzeichnisse trennt, also
/ unter Linux und \ unter Windows


----------



## Gast2 (10. Jun 2010)

```
System.getProperty("file.seperator");
```
Aber das nutzt du doch schon... ???:L

EDIT:
seh grad du schreibst es anders. naja, so gehts zumindest.


----------



## linuxjava (10. Jun 2010)

EikeB: Vorerst gehts ja noch; wenn ich das dann wirklich so brauche, dann mache ich das schon


----------



## linuxjava (10. Jun 2010)

davor benutze ich System.getPropertie("FILE_SEPARATOR");
Aber danke


----------



## linuxjava (10. Jun 2010)

Hatte dein EDIT noch nicht gesehen


----------



## ARadauer (10. Jun 2010)

public static Graphics g;

warum?


----------



## Gast2 (10. Jun 2010)

@linuxjava:
Du hast auch nen Edit button


----------



## linuxjava (10. Jun 2010)

hat ich noch nicht geändert, danke für den Hinweis
EDIT: AH, *JETZT* HAB ICH IHN GESEHEN


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int feld[][] = new int[40][30];
    private Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        JPanel JP = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);
                
                g = gC;
                newpaint(0);
            }
        };       
        add(JP);
        addKeyListener(this);
        setVisible(true);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }
 
    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<40;i++){
                for(int a=0;a<30;a++){
                    feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }

    public void newpaint(int commando){
        //commando:
        // 0... alles neuzeichnen
    	// 1... nur Pacman neuzeichnen
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(commando == 0){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 1){
                        g.setColor(Color.BLACK);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 3){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.RED);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                }
                if(commando == 1){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                }
            }
        }
    }
    
    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub
    	System.out.println("Hi");
    	int key = e.getKeyCode();
    	int x=0;
    	int y=0;
    	for(int i=0;i<40;i++){
    		for(int a=0;a<30;a++){
    			if(feld[i][a] == 2){
    				x=i;
    				y=a;
    			}
    		}
    	}
    	int oldx=x;
    	int oldy=y;
    	// bewege Pac-man nach oben,unten,links oder rechts
	   	if(key == e.VK_UP){
	   		y--;
	   		if(y<0){
	   			y++;
	   		}
	   		System.out.println("Hi2");
	   	}
	   	if(key == e.VK_DOWN){
	   		y++;
	   		if(y>29){
	   			y--;
	   		}
	   	}
	   	if(key == e.VK_LEFT){
	   		x--;
	   		if(x<0){
	   			x++;
	   		}
	   	}
	   	if(key == e.VK_RIGHT){
	   		x++;
	   		if(y>39){
	   			x--;
	    	}
	    }   	
	   	feld[oldx][oldy] = 0;
	   	feld[x][y]=2;
	   	newpaint(1);
    }   
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }

}
```
bedeutet das, dass ich das JPanel in eine neue Klasse schreiben soll?
EDIT: wobei, wenn ichs mir recht überlege, das erste mal newpaint() ausführen funzt ja auch


----------



## eRaaaa (10. Jun 2010)

Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen? Z.B. dieses oder dieses ? Nicht böse gemeint, aber du gehst hier auf die meisten Sachen die man dir sagt entweder gar nicht ein oder nur halb!

p.s.: mache das JPanel JP (übrigens klein schreiben) zu einer Instanzvariable und rufe dann auf ihr repaint() auf  wenn das Panel neu gezeichnet werden soll!


----------



## linuxjava (10. Jun 2010)

ok, das in deiner ps hab ich gemacht ... es funktioniert.
werde mir trotzdem mal das Tutorial durchlesen.:rtfm:


----------



## linuxjava (10. Jun 2010)

dh. , ich habe jp (jetzt klein geschrieben) instanziert und in newpaint() am ende jp.repaint(); hingeschrieben. Wenn ich mir das Tutorial durchlese kommt das mir gar nicht mehr so richtig vor (da steht, ich solle nur über paint() zeichnen, 
aber ich zeichne doch auch in newpaint() ???:L)


----------



## linuxjava (10. Jun 2010)

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int feld[][] = new int[40][30];
    private JPanel jp;
    private Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);
                
                g = gC;
                newpaint(0);
            }
        };       
        add(jp);
        addKeyListener(this);
        setVisible(true);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }
 
    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<40;i++){
                for(int a=0;a<30;a++){
                    feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }

    public void newpaint(int commando){
        //commando:
        // 0... alles neuzeichnen
    	// 1... nur Pacman neuzeichnen
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(commando == 0){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 1){
                        g.setColor(Color.BLACK);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 3){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.RED);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                }
                if(commando == 1){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                }
            }
        }
        jp.repaint();
    }
    
    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub
    	System.out.println("Hi");
    	int key = e.getKeyCode();
    	int x=0;
    	int y=0;
    	for(int i=0;i<40;i++){
    		for(int a=0;a<30;a++){
    			if(feld[i][a] == 2){
    				x=i;
    				y=a;
    			}
    		}
    	}
    	int oldx=x;
    	int oldy=y;
    	// bewege Pac-man nach oben,unten,links oder rechts
	   	if(key == e.VK_UP){
	   		y--;
	   		if(y<0 | feld[x][y] == 1){
	   			y++;
	   		}
	   		System.out.println("Hi2");
	   	}
	   	if(key == e.VK_DOWN){
	   		y++;
	   		if(y>29 | feld[x][y] == 1){
	   			y--;
	   		}
	   	}
	   	if(key == e.VK_LEFT){
	   		x--;
	   		if(x<0 | feld[x][y] == 1){
	   			x++;
	   		}
	   	}
	   	if(key == e.VK_RIGHT){
	   		x++;
	   		if(y>39 | feld[x][y] == 1){
	   			x--;
	    	}
	    }   	
	   	feld[oldx][oldy] = 0;
	   	feld[x][y]=2;
	   	newpaint(1);
    }   
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }

}
```


----------



## linuxjava (10. Jun 2010)

Ich bräuchte einen Namen für das Spiel
--> wie wärs mit JacMan?


----------



## Illuvatar (10. Jun 2010)

linuxjava hat gesagt.:


> (da steht, ich solle nur über paint() zeichnen, aber ich zeichne doch auch in newpaint() ???:L)



Genau das ist das große Problem...


----------



## linuxjava (10. Jun 2010)

> Genau das ist das große Problem...


ich bin grade dabei das Problem zu beheben.


----------



## linuxjava (10. Jun 2010)

Unter Sourceforge: jacman heist das Project
 dort könnt ihr euch die aktuellsten runterladen. Wenn was wichtiges kommt, werde ich es auch hier posten


----------



## linuxjava (10. Jun 2010)

hab jetzt das ganze ein bisschen überarbeitet.
Ich poste euch mal hier die Klasse GameFrame:

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int xfelds = 40;
    public static int yfelds = 30;
    public static int aktuellx = 0;
    public static int aktuelly = 0;
    public static String feld[][] = new String[xfelds][yfelds];
    private JPanel jp;
    public static Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);

                g = gC;
                g.setColor(Color.BLACK);
                g.fillRect(0, 0, 1300, 1000);
                for(int i=0;i<xfelds;i++){
                	for(int a =0;a<yfelds;a++){
                        aktuellx = i;
                        aktuelly = a;
                        try {
							Class c = Class.forName(feld[i][a]);
							try {
								Object o = c.newInstance();
							} catch (InstantiationException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						} catch (ClassNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
							
							
						
                    }
                }



            }
        };
        add(jp);
        addKeyListener(this);
        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }

    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<xfelds;i++){
                for(int a=0;a<yfelds;a++){              
						feld[i][a] = p.getProperty(i+"|"+a, "Leer");
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }




    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub

    }
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub

    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub

    }

}
```


----------



## eRaaaa (11. Jun 2010)

```
try {
                            Class c = Class.forName(feld[i][a]);
                            try {
                                Object o = c.newInstance();
                            } catch (InstantiationException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        } catch (ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
```

Hä?
Dir ist klar dass Class.forName(null) eine NPE wirft ?
Was soll das überhaupt generell werden? Selbst wenn es an der Stelle 
	
	
	
	





```
Object o = c.newInstance();
```
 wirklich zu einer Instanz kommen würde, was bringe dir dieses leere String-Objekt? :autsch: Und mit o machst du ja dann sowieso nichts...
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 3.10 Arrays


----------



## The_S (11. Jun 2010)

eRaaaa hat gesagt.:


> Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen? Z.B. dieses oder dieses ? Nicht böse gemeint, aber du gehst hier auf die meisten Sachen die man dir sagt entweder gar nicht ein oder nur halb!



Ich schließe mich hier mal an und werfe noch das Tutorial von Quaxli in den Raum: http://www.ralf-bauer.org/java/tutorial/Tutorial.zip. Und bitte nicht gefühlte 20.000 Beiträge untereinander, man kann auch mal editieren. Es sagt niemand etwas dagegen, wenn einem nach 6 Stunden oder so noch etwas einfällt und man dann noch einen Post drunter setzt. Aber ständig neue unnötige Posts ... naja, muss nicht sein.


----------



## Quaxli (11. Jun 2010)

eRaaaa hat gesagt.:


> Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen?



 Ich les' jetzt schon die 3. Seite quer und hab' mich schon gefragt wie lange es noch dauert, daß das jemand mal vorschlägt. 
Schließe mich daher dem Antrag von eRaaa und The_S an. :rtfm::rtfm::rtfm:


----------



## linuxjava (11. Jun 2010)

> Dir ist klar dass Class.forName(null) eine NPE wirft ?


Kanns gar nicht, da ich zuvor in openLevelFile das Array feld vollständig mit Strings befülle:

```
for(int i=0;i<xfelds;i++){
                for(int a=0;a<yfelds;a++){              
                        feld[i][a] = p.getProperty(i+"|"+a, "Leer");
                }
            }
```



> Was soll das überhaupt generell werden? Selbst wenn es an der Stelle Object o = c.newInstance(); wirklich zu einer Instanz kommen würde, was bringe dir dieses leere String-Objekt?  Und mit o machst du ja dann sowieso nichts...


Hast du dir mal die anderen Klassen in Sourceforge mal angeschaut? Mit o.newInstance() ruft er eine Klasse auf, die dann das jeweilige Spielelement zeichnet oder sonstwas damit tut.
*EDIT:*Vielleciht sei noch zu erwähnen, dass dann logischerweise die Datei ./Level/Example.properties so aussehen muss:

```
0|0=Wall
0|1=Wall
0|2=Pacman
```


----------



## eRaaaa (11. Jun 2010)

linuxjava hat gesagt.:


> Kanns gar nicht, da ich zuvor in openLevelFile das Array feld vollständig mit Strings befülle:
> 
> Hast du dir mal die anderen Klassen in Sourceforge mal angeschaut? Mit o.newInstance() ruft er eine Klasse auf, die dann das jeweilige Spielelement zeichnet oder sonstwas damit tut.



Okay Tatsache, hast gewonnen! Den Sinn dahinter verstehe ich allerdings dennoch nicht...
(vor allem jedes mal neue Instanzen zu erzeugen in der paintComponent :autsch: )


----------



## linuxjava (11. Jun 2010)

> Den Sinn dahinter verstehe ich allerdings dennoch nicht...


Nun, meiner Meinung nach wirds übersichtlicher. Zudem war das mit diesen If-schleifen doch etwas "unobjektorientiert", oder?

Bei GameFrame kommt noch folgendes hinzu:

```
public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        int key = e.getKeyCode();
        int x=0;
        int y=0;
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(feld[i][a].equals("Pacman")){
                    x=i;
                    y=a;
                }
            }
        }
        int oldx=x;
        int oldy=y;
        // bewege Pac-man nach oben,unten,links oder rechts
        if(key == e.VK_UP){
            y--;
            if(y<0 | feld[x][y].equals("Wall")){
                y++;
            }
        }
        if(key == e.VK_DOWN){
            y++;
            if(y>yfelds-1 | feld[x][y].equals("Wall")){
                y--;
            }
        }
        if(key == e.VK_LEFT){
            x--;
            if(x<0 | feld[x][y].equals("Wall")){
                x++;
            }
        }
        if(key == e.VK_RIGHT){
            x++;
            if(y>xfelds-1 | feld[x][y].equals("Wall")){
                x--;
            }
        }       
        feld[oldx][oldy] = "Leer";
        feld[x][y]="Pacman";
        jp.repaint();
    

    }
```


----------



## The_S (11. Jun 2010)

linuxjava hat gesagt.:


> If-schleifen



if-schleife.de


----------



## linuxjava (11. Jun 2010)

> Es gibt keine if-Schleifen, sondern nur if-Abfragen!


Ok, dann halt if-Abfragen ... Hahahaha
EDIT: hab grade Datein hochgeladen, es gibt nun Punkte und Powerpillen
EDIT: übrigens sinnvolle Seite
EDIT: Ok, ich glaub langsam sollte ich mich mal um die küstliche Intilligenz der Monster bearbeiten. 
kennt dafür jemand ein gutes Tutorial?


----------



## linuxjava (11. Jun 2010)

weiß denn  wirklich niemand was?


----------



## Gast2 (11. Jun 2010)

Auf der ersten Seiten wurde doch das Pacman Dossier gepostet, da steht doch schon einiges zur KI der Monster.


----------



## linuxjava (11. Jun 2010)

gibts sowas auch in Deutsch? Mein Englisch ist nämlich nicht sonderlich gut ;(


----------



## Sempah (11. Jun 2010)

linuxjava hat gesagt.:


> gibts sowas auch in Deutsch? Mein Englisch ist nämlich nicht sonderlich gut ;(



Wenn du wirklich programmieren möchtest, wirst du kaum um das Englische drumherum kommen.


----------



## Gast2 (11. Jun 2010)

Für den Anfang kannst du ja erstmal mit einer gaaanz simplen KI anfangen.
Die Monster laufen solange gradeaus bis sie auf eine Verzweigung treffen, dort wählen sie dann per Zufallszahl aus in welche richtung sie weiterlaufen.
Das kannst du dann wenn das spiel steht stück für stück verbessern.


----------



## Geeeee (11. Jun 2010)

> Das kannst du dann wenn das spiel steht stück für stück verbessern.


z.B. 1. in Richtung Pacman bei ner Abzweigung und später dann immer in Richtung Pacman. (glaube mich entsinnen zu können, dass sie sich auch Umdrehen, wenn sie mitten auf der Gerade sind)


----------



## hundert_bytes (14. Jun 2010)

ähm, Linuxerjava. Ich will dir nun nicht zu nahe treten, aber vielleicht solltetst du erst mal mit etwas 
"leichteren" als GUI-Programmierung anfangen? (zb. könntest du einfach ein paar nützliche Klassen für Files zusammenstellen (egal ob sowas schon exestiert)). 
Oder google mal im Web (ich weiß, das klingt blöd) und schau nach einer Seite, in der sie Project ideen
hosten.


----------

