Пытаюсь сделать небольшую игру и столкнулся с проблемой рисования объектов.
Главный класс.
public class Main {
public static Frame frame = new Frame();
public static JPanel[] panels = {new Game(), new Menu()};
public static void main(String[] args) {
frame = new Frame();
frame.add(panels[0]);
frame.add(panels[1]);
if(panels[1].isVisible()) {
frame.remove(panels[0]);
panels[0].setVisible(false);
}
if(panels[0].isVisible()) {
frame.remove(panels[1]);
panels[1].setVisible(false);
((Game) panels[0]).start();
}
}
}
В конструкторе класса Frame находится таймер, который обновляет его содержимое.
Сначала запускается панель меню
public class Menu extends JPanel {
public Menu() {
JButton btn = new JButton("Start");
add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
Main.frame.add(Main.panels[0]);
Main.frame.remove(Main.panels[1]);
Main.panels[0].setVisible(true);
}
});
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g.setColor(Color.BLUE);
g.fillRect(0, 0, Frame.frameW, Frame.frameH);
}
}
При нажатии на кнопку, Frame переключается на игровую панель
public class Game extends JPanel implements Runnable {
public static int WIDTH = Frame.frameW, HEIGHT = Frame.frameH;
public Thread thread;
private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);;
private Graphics2D g = (Graphics2D) image.getGraphics();
public static GameBack background;
public static Player player;
public Game() {
super();
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
public void start() {
thread = new Thread(this);
thread.start();
}
public void run() {
background = new GameBack();
player = new Player();
while(true) {
gameUpdate();
gameRender();
gameDraw();
try {
Thread.sleep(33);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
public void gameUpdate() {
background.update();
player.update();
}
public void gameRender() {
background.draw(g);
player.draw(g);
}
public void gameDraw() {
Graphics g2 = this.getGraphics();
g2.drawImage(image, 0, 0, null);
g2.dispose();
}
}
Игровая панель должна отрисовывать фон и игрока, которые прописаны в отдельных классах, но этого почему-то не происходит.
Класс фона. Класс игрока построен по такому же принципу.
public class GameBack {
private Color color;
public GameBack() {
color = Color.BLUE;
}
public void update() {
}
public void draw(Graphics2D g) {
g.setColor(color);
g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
}
}
Помогите разобраться почему это не работает. Заранее спасибо