2009-04-17 3 views
0
an

Ich mache ein Multithread-Pacman-Spiel.Mehrere animierte JPanels - nur die letzte, die zu JFrame hinzugefügt wurde, zeigt

Es gibt eine PacmanController-Klasse, die JFrame erweitert, eine Maze-Klasse, die JPanel erweitert, eine Pacman-Klasse, die in einem eigenen Thread läuft und JPanel erweitert, und eine Ghost-Klasse, die in einem eigenen Thread läuft und JPanel erweitert. Jeder Thread (Pacman und jeder Ghost) zeichnet sich ständig neu auf und nennt auch labyrinth.repaint().

Wenn ich das Labyrinth zum Rahmen hinzufüge, zeigt es fein an, wenn ich dann pacman addiere, zeigt es noch an und belebt fein.

Wenn ich jedoch den Ghost nach Pacman zum Rahmen hinzufüge, erscheint der Geist und Pacman verschwindet. Wenn ich die Reihenfolge umstelle, in der Pacman und der Ghost hinzugefügt werden, ist das Gegenteil der Fall, d. H. Es wird immer nur einer von Pacman oder jeder Instanz von Ghost angezeigt - der zuletzt hinzugefügte.

ZB:

add(maze); 
add(pacman); 
add(ghostA); 

Nur das Labyrinth und Ghosta erscheinen?

Ich weiß, dass dies etwas mit JFrames BorderLayout zu tun hat, d. H. Es kann nur eine Komponente zur mittleren Region hinzugefügt werden, aber ich weiß nicht, wie ich sie beheben kann. Ich habe versucht, Pacman und Geister zu EAST WEST usw. hinzuzufügen, aber das hat nicht funktioniert.

Ich habe auch versucht,

maze.add(pacman); 
add(pacman); //etc 

aber das hat nicht funktioniert entweder.

Sorry für die lange Post, jede Hilfe wird sehr geschätzt. Ich kann keinen Code posten, da der Code zu lang ist und sich auf viele Klassen verteilt.

Vielen Dank!

Antwort

0

Erstens: Die Neubearbeitung von mehreren Threads in Swing ist ein Rezept für Probleme. Ein besserer Weg besteht darin, von der Hauptspielklasse zu aktualisieren und das Graphics Objekt an alle Schauspieler zu übergeben, um sich selbst zu malen (ich bin mir sicher, dass es andere Muster gibt, aber ich habe diese Art seit einer Weile nicht mehr gemacht).

Zweite: Ihre Akteure (Pacman, Geister) sollte nicht JPanels sein. Das ist ein Rezept für noch schlimmere Probleme. Lassen Sie sie eine Actor Klasse oder etwas erweitern, aber sie sollten keine Swing-Komponenten sein.

Ich weiß, dass dies nicht direkt Ihre Frage beantwortet, aber einige Ihrer Probleme werden verschwinden, wenn Sie Ihr Spiel richtig entwerfen. Es gibt eine Reihe von Tutorials zum Thema Game Design im Internet. Ich kann keine von ihnen persönlich empfehlen, aber die ersten paar Kapitel von Killer Game Programming in Java sehen vielversprechend aus.


Edit: In Ordnung, ich werde versuchen, die eigentliche Frage zu beantworten.

Wenn Sie BorderLayout verwenden, die Möglichkeit, mehrere Komponenten hinzuzufügen, ist die Position zu spezifizieren:

setLayout(new BorderLayout()); 
add(maze, BorderLayout.CENTER); 
add(pacman, BorderLayout.EAST); 
add(ghostA, BorderLayout.WEST); 

Alternativ (und vielleicht besser), könnten Sie die Spieler das Labyrinth hinzufügen:

setLayout(new BorderLayout()); 
maze.setLayout(new BorderLayout()); 
maze.add(pacman, BorderLayout.EAST); 
maze.add(ghostA, BorderLayout.WEST); 
add(maze, BorderLayout.CENTER); 

Jetzt, während diese sollte, um alle drei Komponenten zum Rahmen hinzugefügt werden, kann ich immer noch nicht sehen, wie Sie ein Spiel haben könnten, wo der Spieler JPanel versucht, JPanels zu entkommen.
Wie auch immer, wenn sie nicht funktionieren, ist das nächste, was zu tun ist, einen anderen layout manager zu versuchen.

+0

Viele Rezepte für Probleme in Swing aye :-) – Peter

+0

Danke für die Antwort, aber dies ist für eine Zuordnung ; daher habe ich nicht wirklich Zeit, mein Programm neu zu gestalten - es ist insgesamt 2000 Zeilen lang. Was ich wirklich wissen möchte ist, kann ich es mit dem, was ich bisher gemacht habe, funktionieren lassen? Beide zeigen OK an, nicht gleichzeitig - also gibt es angesichts dessen, was ich beschrieben habe, eine schnelle Lösung? Prost – Rory

+0

Hatte schon versucht, ohne Erfolg. Vergiss es, trotzdem danke. – Rory

0

Fügen Sie diese Panels direkt zum JFrame hinzu? Wenn ja, sollten Sie sie in den Rahmen des Inhaltsbereich werden, indem statt:

getContentPane().add(maze); 
getContentPane().add(pacman); 
getContentPane().add(ghostA); 
+1

können Sie direkt zu einem Rahmen hinzufügen, ging dieses Problem in Java5 – basszero

0

FYI, mmyers richtig ist. Sie werden dieses Design bis zum Ende kämpfen und es wird nie richtig funktionieren. Du gehst falsch herum.

Beginnen wir auf einige dieser Fragen arbeiten

  • Wie steuern Sie die Position/Lage von Pacman und dem Geist?
  • Stellen Sie die Position des Jpanels ein oder zeichnen Sie etwas x/y im Panel?
  • Erwarten Sie, dass alle 3 Panels übereinander gezeichnet/gerendert werden?
  • Haben Sie paintComponent() in jedem JPanel überschrieben, um den Pacman/Ghost/Labyrinth zu zeichnen?
  • Was sind die Kriterien der Hausaufgabe?
  • Muss es Multithread sein?
+0

@mmyers, danke für das Format-Update. Ich bin faul – basszero

+0

Pacman wird von den Pfeiltasten gesteuert + ein einfacher Algorithmus macht Geist Bewegung in zufällige Richtungen Es muss Multithread sein - das ist der ganze Sinn der Aufgabe. Das Labyrinth wird durch ein 2D-Array von Cell-Objekten dargestellt.Jedes Bild, das einer Zelle zugeordnet ist, wird in der richtigen Position auf dem Maze Panel gezeichnet. Pacman und Ghosts bewegen sich bei jeder Bewegung um 32 Pixel [1 Zellenposition] paintComponent() wird in jedem JPanel überschrieben, um das Labyrinth/Ghost/zu zeichnen Pacman – Rory

Verwandte Themen