Dies ist die kleinste lauffähige SSCCE, von meinem Projekt, die ich implementieren könnte, um Ihnen zu zeigen.Separate Logik Thread von Event Dispatch Thread
Ich habe gelesen, dass das Spiel Logik aus dem Ereignis Dispacth Thema Aufruf ist eine schlechte Praxis, wie kann ich sie trennen, weil, wie Sie
update()
undrepaint()
sehen können, sind in Schleife im Zusammenhang und Wie kann ich Code auf eine schöne Art und Weise trennen? Ich bekomme damit Probleme und versuche herauszufinden, wie es geht.Ich habe eine ähnliche Frage in Bezug auf gebucht und ich bekam eine Antwort, die eine Swing Timer zu verwenden, sagt, aber ich habe große Aufgabe zu machen und als i
Swing timer
lesen für diese scenario.This nicht ideal ist, ist die Frage :
Hauptklasse
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class Main {
private static final Main mainFrame = new Main();
private final JFrame frame;
private Main() {
frame = new JFrame();
frame.setUndecorated(true);
frame.add(new MyPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static Main getMainFrameInstance() {
return mainFrame;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Main.getMainFrameInstance();
}
});
}
}
MyPanel Klasse
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class MyPanel extends JPanel implements Runnable,KeyListener,MouseListeners {
private static final long serialVersionUID = 1L;
// thread and loop
private Thread thread;
private boolean running;
private int FPS = 60;
private long targetTime = 1000/FPS;
private long start;
private long elapsed;
private long wait;
// image
public BufferedImage image;
// foo
private Foo foo;
private Render render = Render.getRenderManagerInstance();
public MyPanel() {
setPreferredSize(new Dimension(700, 700));
setFocusable(true);
requestFocus();
}
public void addNotify() {
super.addNotify();
if (thread == null) {
addKeyListeners(this);
addMouseListener(this);
thread = new Thread(this);
thread.start();
}
}
private void initGraphic() {
image = new BufferedImage(700, 700, BufferedImage.TYPE_INT_RGB);
foo = new Foo();
running = true;
}
public void run() {
initGraphic();
// loop
while (running) {
start = System.nanoTime();
foo.update();
repaint();
elapsed = System.nanoTime() - start;
wait = (targetTime - elapsed/1000000) - 8;
if (wait <= 0)
wait = 6;
try {
Thread.sleep(wait);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
graphics = image.getGraphics();
((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
render.setRenderState((Graphics2D) graphics);
graphic.drawImage(image, 0, 0, this);
// clear graphics resources after use them
graphic2D.dispose();
}
public void keyPressed(KeyEvent keyEvent) {
//code not considerable
}
public void keyReleased(KeyEvent keyEvent) {
//code not considerable
}
public void mousePressed(MouseEvent mouseEvent) {
//code not considerable
}
public void mouseReleased(MouseEvent mouseEvent) {
//code not considerable
}
}
Was meinen Sie mit "EDT"? – Illidanek
@Illidanek Event Dispatch Thread. – OiRc
Scheint so, als ob du in einer ereignisgesteuerten Umgebung (die Swing ist) versuchen, eine traditionell ausgelastete Spielschleife zu machen; das ist keine gute Idee. Ziehen Sie in Betracht, diese Schleife zu entfernen und stattdessen einen Swing-Timer zu verwenden. Oder benutze Swing nicht, sondern verwende eine Window + Canvas + BufferStrategy, um nicht mit einem EDT zu kollidieren. – Gimby