Geeigneter Weise zu zeichnen, um ein JPanel für 2D-Game-development?
Ich bin zu wollen, um ein 2D-Spiel, aber ich habe Probleme bei der Suche die beste und effizienteste Weg, um zu zeichnen auf einer 2D-Fläche/Leinwand mit einer BufferStrategy. Ich habe einen JFrame als Hauptfenster und zeichnen möchten, an die Oberfläche, dass. Ich würde gerne sehen, einige Beispiel-code, wie dies geschieht (ob das ein guter Weg, es zu tun) sowie andere Beispiele. Es wäre toll, wenn jemand könnte auch erklären, warum einige vor-und Nachteile, dies zu tun.
Ich bin zurzeit hinzufügen meine Zeichnung Klasse zu meinem JFrame mit " Rahmen.add(new Painter ()); " und dann das überschreiben der paintComponent-Methode. Das einzige problem habe ich mit diesem ist, es scheint nur diese Methode aufrufen, sobald.
dies ist mein Maler-Klasse:
public class Painter extends JPanel{
public static Player player;
public Painter() {
player = new Player(300, 300);
}
public void paint(Graphics g) {
player.x++;
g.setColor(Color.white);
g.fillRect(player.x, player.y, 32, 32);
}
}
- docs.oracle.com/javase/tutorial/2d/index.html
- Und warum sollte es nennen es mehrmals? Wenn Sie möchten, eine animation, die Sie benötigen, um einen Faden, bewegt Ihr den Spieler und bittet swing-repaint der Maler in einer Schleife.
- Denn ich möchte in der Lage sein, kontinuierlich zu zeichnen, um den Bildschirm, damit es zeigt, aktualisierte Spieler-position usw..
- 1) Sie erwähnen paintComponent (richtig), im text aber, dass der code überschreibt
paint
(falsch). 2), es sei denn, auch das hinzufügen von Komponenten auf der Oberseite des rendering, verwenden Sie einBufferedImage
statt. Zeigen Sie es in einem label - & repaint der (Bild-und) Etikett, wenn erforderlich (wie in einer SchaukelTimer
).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im einfachsten Fall, bei dem das Spiel braucht um den Bildschirm zu aktualisieren, basierend auf Benutzer-Aktionen nur, Sie müssen rufen Sie
repaint()
(auf dem JFrame zum Beispiel), wenn Sie ein update etwas.In anderen Fällen, die Sie benötigen, zu konstruieren, eine so genannte Game Loop, wo Sie zu aktualisieren, das Spiel Stand-und render-aktualisierte Spiel-Staates in einer fristgerechten Weise. Ein nettes tutorial über ein einfaches Spiel-Schleife mit Java-code kann hier gefunden werden: http://obviam.net/index.php/the-android-game-loop/
Falls Sie entwickeln ein ernstes Spiel, Sie sollten stick mit einer game-engine für die Verwaltung der game-loop und anderen routine-Spiel Entwicklung Aspekte. Ein gutes Java-Spiel-engine finden Sie hier: http://code.google.com/p/playn/
Für ein Spiel loop und eine effiziente Art zu drucken, um den Bildschirm für das Spiel, Objekte und andere(Bilder, Explosionen, etc), müssen Sie ein timing-Mechanismus und einen JFrame zu drucken, um über und über wieder, während gleichzeitig abrufen von updates von der Spieler und das Spiel Staat selbst.
Zunächst benötigen Sie eine main-Methode, und ich werde zu erraten, dass du ziemlich neu in dieser Art von Feld in java also ich werde es brechen für Sie so schnell und klar wie möglich.
Dieser main-Methode wird dabei 2 Dinge zuerst, erstellen Sie ein Objekt, um Ihre run-Methode (da statische Referenzen werden nicht empfohlen, für das Spiel Schleifen) und dann der Aufruf der Methode mit Ihrem neu erstellten Objekt. Wenn die run-Methode fertig ist, wird das system wird das Programm beendet.
Bin jetzt nicht in allen Einzelheiten hier aber einmal haben Sie die run-Methode ausgeführt wird, benötigen Sie ein init-Methode wird nur einmal ausgeführt. In dieser Methode erstellen Sie Ihre JFrame, die Sie Rendern. Das ist ziemlich einfach zu tun, so dass ich nicht weiter in die Schaffung eines JFrame-Klasse. Aber Ihre Run-Methode sollte in etwa so Aussehen...
Diese Methode wird sich verlangsamen, die Rechengeschwindigkeit zu einer bestimmten fps, dass Sie den Wunsch(in diesem Fall die fps variable namens fps für die Karte).
Nun in Ihrer update-Methode haben Sie Ihre Tastenbelegung und andere Sachen zu suchen Sie nach änderungen mit der Tastatur oder der Maus(und in meinem Fall derzeit ein server). Die meisten Menschen wissen nicht, wie zu zeichnen oder drucken, um das JFrame, ohne in eine paramitor, dass die Repaint-Methode erfordert, so werden wir zu überschreiben, indem man die doppelte Pufferung.
In der initialize-Methode fügen Sie
In der draw-Methode haben Sie...
Und mit denen, die Sie haben die Fähigkeit zu zeichnen auf dem JFrame erstellt, die von der init-Klasse(auch, dies zu tun, müssen Sie die Fähigkeit zu zeichnen aus einer Klasse oder einem thread zur Verringerung der Prozessorlast).
Um zu sehen, ob es funktioniert, gehen Sie vor und verwenden Sie die
bbg.fillRect(updateX,updateY,5,5)
Den updateX und updateY stellen Variablen dar, die Sie zum aktualisieren der Position des Rechtecks. Sparen Sie als einer globalen Variablen oder einer public variable gespeichert, in einer Charakter-Klasse.
Und wenn alle Stricke reißen, hier ist Beispielcode, die ich verwendet habe für die Erstellung meiner eigenen game-engine...
Ich hoffe das hilft und ich weiß, kann dies eine SEHR späte Antwort, aber ich habe noch zu sehen, eine anständige java game-engine, dass war einfach zu verstehen und zu nutzen und mit Spaß an der Arbeit. Hoffe, dass Sie mit ihm bleiben und frohes Programmieren!!!