1
我剛剛拿起Java,我打算用它製作一個簡單的圖形遊戲,以便隨時指出任何樣式錯誤。爲什麼我的方法不能正確重畫?
從我的主標題畫面過渡到主畫面,我的舊標題畫面沒有刷新,用於點擊以進入主畫面的按鈕被凍結,基本上,圖像凍結,主畫面paintComponent是沒有調用,程序進入一個無限循環並且不會關閉(必須通過任務管理器關閉)。
有趣的是要注意的是,沒有while循環它工作得很好,paintComponent被調用,並且當重新引入while循環時一切正常,因此同樣的問題仍然存在。
public class Game {
private static final int HEIGHT = 650;
private static final int WIDTH = 820;
private static final int FRAMES_PER_SEC = 60;
private JFrame frame = new JFrame("Game");
private boolean inIntroScreen = true;
private boolean game_running = false;
private int x = 1;
private int y = 1;
private int dx = 1;
private int dy = 1;
/* method to set up GUI for the game. */
public void initGUI() {
//Build Frame
frame.setSize(WIDTH, HEIGHT);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
//End Build Frame
/* Intro screen build */
class drawIntro extends JPanel {
public void paintComponent(Graphics g) {
if (inIntroScreen) {
Graphics2D g2d = (Graphics2D) g;
//Background
g2d.setPaint(Color.BLACK);
g2d.fillRect(0, 0, 820, 650);
//Title
BufferedImage img = null;
try { img = ImageIO.read(new File("game.png")); }
catch (IOException e) { System.out.println("Error image"); }
g2d.drawImage(img, 180, 52, null);
g2d.setPaint(Color.WHITE);
g2d.fillOval(550, 60, 40, 40);
g2d.fillOval(195, 60, 40, 40);
System.out.println("Intro screen painted");
}
} //end paint
} //end draw inner class
final drawIntro introScreen = new drawIntro();
final JPanel introPanel = new JPanel();
final JButton startButton = new JButton("Start");
frame.getContentPane().add(introPanel,BorderLayout.SOUTH);
introPanel.setBackground(Color.BLACK);
frame.getContentPane().add(introScreen, BorderLayout.CENTER);
startButton.setPreferredSize(new Dimension(100,50));
startButton.setBackground(Color.BLACK);
startButton.setForeground(Color.WHITE);
introPanel.add(startButton);
introScreen.repaint();
//End intro screen build
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
introPanel.removeAll();
introPanel.revalidate();
inIntroScreen = false;
game_running = true;
System.out.println("button clicked");
Start();
}
});
} //End initGUI
/* Level building class */
class Level extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//Background
g2d.setPaint(Color.BLACK);
g2d.fillRect(0, 0, 820, 650);
//Anti-aliasing
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setPaint(Color.BLUE);
g2d.fillOval(x, y, 70, 70);
x += dx;
y += dy;
System.out.println("Main screen painted");
} //End paint component
}
/* Game loop */
public void Start() {
Level player = new Level();
frame.add(player);
player.repaint();
int FPS = 1000/FRAMES_PER_SEC;
while(game_running) { /* PROBLEM HERE, if while loop is removed everything works as intended */
frame.repaint();
try { Thread.sleep(FPS); }
catch (InterruptedException e) {}
}
}
public static void main(String[] args) {
Game game = new Game();
game.initGUI();
System.out.println("Program terminated");
}
} //end game class