Pacman-Clone

linuxjava

Mitglied
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.
 

linuxjava

Mitglied
OK, ich poste hier mal die Klassen, die ich anlegen will (bzw. die Konstruktoren)
-
Java:
 void GameFrame()
-
Java:
 void SettingsFrame()
-
Java:
 EditorFrame()
-
Java:
 ThreadMonsterMove()
kurze Erläuterungen dazu:
-
Java:
 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.
Java:
 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
Java:
 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,...)
Java:
 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

Mitglied
Ok hier erstmal das absoulute Grundgerüst:
Java:
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

Mitglied
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.
 
Zuletzt bearbeitet:

linuxjava

Mitglied
Java:
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

Mitglied
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

Top Contributor
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
Java:
    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

Mitglied
Java:
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.
 
G

Gast2

Gast
// suche besseren Variablennamen
public static String filetrenner = "/";
public static int feld[][] = new int[50][50];
Code:
FILE_SEPERATOR und grid
?
Außerdem würde ich
Code:
FILE_SEPERATOR
,
Code:
NAME
und
Code:
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.
 

linuxjava

Mitglied
Java:
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

Top Contributor
.....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

Mitglied
Wenn jetzt zb. die Datei /Level/Example.properties so aussieht:
Code:
0|0=1
0|1=1
0|2=2
dann sieht das entsprechende Bild dazu aus: (siehe Anhang)
 

Anhänge

  • Bildschirmfoto1.png
    Bildschirmfoto1.png
    943 Bytes · Aufrufe: 42

srea

Bekanntes Mitglied
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

Mitglied
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

Bekanntes Mitglied
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
 

Anhänge

  • pacman.jpg
    pacman.jpg
    23,5 KB · Aufrufe: 58

linuxjava

Mitglied
ä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
 
Zuletzt bearbeitet:

srea

Bekanntes Mitglied
ä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
Code:
0|0=1
0|1=1
0|2=2
hab ich mir mal erstellt... Sieht genauso aus.
 

linuxjava

Mitglied
Java:
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



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


Hab ich mir fast gedacht.


Zitat:



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


Zitat:



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
Code:

0|0=1
0|1=1
0|2=2

hab ich mir mal erstellt... Sieht genauso aus.
Ich hab noch was an meiner Antwort editiert
 

linuxjava

Mitglied
oh, wartet...
ich hab noch was vergesen:
Java:
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);
					}
				}
			}
		}
	}
}
 

linuxjava

Mitglied
Noch mal geändert:
Java:
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:
Code:
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
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ich auch ;)

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

Also: finger weg von getGraphics()
 

linuxjava

Mitglied
Java:
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
 
G

Gast2

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

EDIT:
Java:
    @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.
 
Zuletzt bearbeitet von einem Moderator:

linuxjava

Mitglied
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

Mitglied
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)
 

Anhänge

  • Bildschirmfoto3.jpg
    Bildschirmfoto3.jpg
    11,8 KB · Aufrufe: 33
  • Bildschirmfoto2.jpg
    Bildschirmfoto2.jpg
    10,3 KB · Aufrufe: 31
G

Gast2

Gast
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.
 
G

Gast2

Gast
und hier noch ein kleines Beispiel:

Java:
    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

Mitglied
Java:
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;)
 
G

Gast2

Gast
Java:
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

Mitglied
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
 
G

Gast2

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

EDIT:
seh grad du schreibst es anders. naja, so gehts zumindest.
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Java Themen


Oben