Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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?
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.
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.
.....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.ä.
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.
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?
wieso übergibst du newpaint(0); nicht das Graphics-Objekt dass du in paint übergeben bekommst? Denn getGraphics kann zu komischen ungewollten Problemen führen
ä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
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
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!)
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.
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!)
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)
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.
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 )
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