8 Stimmen

Pacman-Labyrinth in Java

Also baue ich das Pacman-Spiel in Java, um mir das Programmieren von Spielen beizubringen.

Ich habe das grundlegende Spielfenster mit dem Pacman-Sprite und den Ghost-Sprites gezeichnet, der Pacman bewegt sich mit den Pfeiltasten, bewegt sich nicht über die Wände des Fensters hinaus, usw. Jetzt versuche ich, das Labyrinth zu bauen, wie in diesem Bild:

Pacman maze

Ohne mir die direkte/komplette Lösung zu geben, kann mir jemand sagen, wie dies gebaut werden kann? Ich spreche hier nur von den Begrenzungen und den Rohren ("T"-Markierungen), durch die man nicht hindurchgehen kann und um die man herumgehen muss. Nicht die Punkte, die der Pacman noch frisst.

Hier sind meine Fragen:

1) Was ist der effizienteste Algorithmus/die effizienteste Methode zur Erstellung dieses Labyrinths? Muss es jedes Mal gezeichnet werden, wenn die paint()-Methode aufgerufen wird, oder gibt es eine Möglichkeit, es nur zu Beginn des Spiels zu zeichnen und nie wieder?

2) Wie wird dies tatsächlich auf den Bildschirm gezeichnet? Ich nehme an, dass die fillRect() verwendet werden?

3) Irgendwelche Hinweise zur Kollisionserkennung (damit der Pacman/Ghosts nicht durch die Wände gehen kann) wären hilfreich.

4) Jeder Hinweis darauf, wie der freie Raum zwischen den Rohren berechnet wird, damit die Punkte zwischen ihnen gefüllt werden können, wäre ebenfalls sehr hilfreich.

Gracias

10voto

Spencer Ruport Punkte 34547

So würde ich es nicht machen.

Ich würde die grafische Karte zeichnen und dann ein 2D-Datenfeld erstellen, das die Karte darstellt. Die Datenkarte wäre verantwortlich für die Bestimmung von Kollisionen, Essen Punkte, wo Süßigkeiten ist und wo die Geister sind. Sobald die Logik für alles gehandhabt wird, verwenden Sie einfach das 2D-Array, um alles in ihren richtigen Pixelkoordinaten über die grafische Karte anzuzeigen.

Der Benutzer drückt zum Beispiel die linke Taste. Zunächst stellt man fest, dass pacman sich an Element 3, 3 befindet. Element 3, 2 enthält Informationen, die eine Wand bezeichnen, so dass man den Code implementieren kann, damit er den Befehl ignoriert.

EDITAR:

Jedes Element würde ungefähr die Stelle darstellen, an der sich ein Punkt befinden könnte. Zum Beispiel:

Nein, wenn ich mir das Board ansehe, würde ich sagen, dass die Anordnung ungefähr so aussehen würde.

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p    
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d    
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d

Und so weiter. Sie sollten jedoch eine flexiblere Datenstruktur als nur Zeichen wählen, da einige Bereiche eine Reihe verschiedener Informationen enthalten müssen. Z.B. ist der Bereich, in dem die Geister spawnen, zwar leer, aber der Pacman darf dort nicht hinein. Die Bewegung der Geister und pacman ist anders für die Seite entweicht, die Süßigkeiten Spawn-Punkt ist ein leerer Fleck, aber wenn Sie flexibel bleiben wollen, werden Sie wollen, um zu bezeichnen, wo dies auf eine Karte Basis ist.

Eine andere Sache, die du beachten solltest, ist, dass Pacman und die Geister sich oft zwischen den Punkten befinden. Informationen, die einen Prozentsatz des Platzes darstellen, den sie zwischen 1,2 und 1,3 einnehmen, sind wichtig für die Kollisionserkennung und um zu bestimmen, wann du Punkte, Powerups und Süßigkeiten vom Spielfeld entfernen willst.

0 Stimmen

Wie würde dieses Array die Karte darstellen? Wie bei einer Pixel-zu-Pixel-Darstellung?

0 Stimmen

Danke! Also, wenn ich den Pacman auf 100 x, 50 y Position bewegen wollte, wie würde ich das in der Karte setzen, um zu zeigen, dass diese Position besetzt ist? irgendein Code für das?

0 Stimmen

Ändern Sie die Datenstruktur in etwas wie map[100,50].OccupiedBy = Characters.PacMan. Characters könnte ein Enum mit Characters.Ghost1, Characters.Ghost2 usw. sein.

2voto

TrayMan Punkte 6755
  1. Sie können die Karte in ein BufferedImage malen und dieses Bild bei jedem paint() einfach zeichnen. Auf diese Weise erhalten Sie eine recht vernünftige Leistung.

  2. Wenn Sie damit zufrieden sind, dass die Wände massiv sind, können Sie jeden quadratischen Wandblock mit fillRect zeichnen. Wenn Sie das gleiche Aussehen wie auf dem Bild erreichen wollen, müssen Sie herausfinden, wie Sie die Linien richtig zeichnen und Bögen für die Ecken verwenden.

  3. Der Pacman-Spielplan besteht aus Quadraten, und Pacman und die Geister bewegen sich immer in einem animierten Schritt von einem Quadrat zum benachbarten Quadrat (d.h. wenn Sie rechts drücken, bewegt sich der Pacman ein Quadrat nach rechts). Das bedeutet, dass die Erkennung von Kollisionen einfach ist: Es werden einfach keine Bewegungen zu Feldern zugelassen, die nicht leer sind.

  4. Ich verstehe nicht, was Sie hier zu fragen versuchen.

0 Stimmen

Meinen Sie mit einem Quadrat eine Pixel/x,y-Koordinate oder einen 10-Pixel-Block, der ein Quadrat ist?

0 Stimmen

Ich meine einen Block von Pixeln. Spencer Ruport spricht von der gleichen Sache.

2voto

kgrad Punkte 4552

1) Ich möchte Ihnen einen Ratschlag zum Umzeichnen geben. Wenn Sie feststellen, dass das Neuzeichnen des gesamten Bildes zu langsam ist, können Sie nur die Elemente ermitteln, die sich auf dem Bildschirm geändert haben, und diese neu zeichnen. Ein Ansatz hierfür wäre der folgende: Ermitteln Sie die Sprites, die sich bewegt haben. Bestimmen Sie (annähernd) ein Rechteck um diese Sprites. Zeichnen Sie nur diese Rechtecke neu. Auf diese Weise aktualisieren Sie nur Teile des Bildschirms und nicht den gesamten Bildschirm. Dies sollte zu einer Leistungssteigerung gegenüber dem Neuzeichnen des gesamten Bildschirms führen.

Die anderen Antworten waren für die anderen Fragen, die Sie gestellt haben, angemessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X