Почему мой метод рендеринга ничего не отображает?
Я делаю игру для своего класса APCS на Java. Он использует алгебру и математику, но это не проблема:
У меня есть State-класс вместо State Enum, потому что по какой-то причине Enum не работает.
public class State {
private int option;
public int getState(){
return option;
}
public void setState(int option){
this.option=option;
}
}
Теперь я на 90% уверен, что это не проблема, потому что, когда я устанавливаю состояние на фактический номер состояния игры, он работает нормально, за исключением того, что не отображает фон.
Мой класс меню выглядит так:
public Rectangle playButton= new Rectangle(GameMain.WIDTH/2 +120,200,117,49);
public Rectangle helpButton= new Rectangle(GameMain.WIDTH/2 +120,300,117,49);
public Rectangle quitButton= new Rectangle(GameMain.WIDTH/2 +120,400,117,49);
ImageLoader loader = new ImageLoader();
GameMain game;
public BufferedImage bgrd, play,help, quit;
public void init(){
try {
bgrd = loader.loadImage("res/imgs/bgrd.png");
play = loader.loadImage("res/imgs/play.png");
help = loader.loadImage("res/imgs/help.png");
quit = loader.loadImage("res/imgs/exit.png");
} catch (IOException e) {
e.printStackTrace();
}
}
public void render(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g.drawImage(bgrd,0,0, null);
g.drawImage(play,game.WIDTH/2 +120,200,null);
g.drawImage(help,game.WIDTH/2 +120,300,null);
g.drawImage(quit,game.WIDTH/2 +120,400,null);
}
Вы можете проверить это самостоятельно, но все образы находятся в правильном каталоге, и папка res была добавлена в путь сборки.
Класс ImageLoader просто включает метод loadImage, который возвращает BufferedImage.
В моем классе GameMain это мой метод рендеринга, который должен отображать изображения:
private void render(){
BufferStrategy bStrat = this.getBufferStrategy();
if(bStrat==null){
createBufferStrategy(3);
return;
}
Graphics g = bStrat.getDrawGraphics();
if(state.getState()==1){
menu.render(g);
}
if(state.getState()==2){
}
if(state.getState()>2 && state.getState()<11){
Font font=new Font("Verdana",Font.BOLD,20);
g.setFont(font);
g.drawImage(bgrd,0,0,this);
g.drawString(gameName, 300, 100);
g.drawImage(wizard,x,y-75,this);
g.drawImage(hdkn,x,y,this);
g.dispose();
bStrat.show();
}
if(state.getState()==11){
}
}
А вот мой метод init, который (когда я закончу) инициализирует все:
public void init(){
state=new State();
state.setState(1);
loader = new ImageLoader();
menu=new Menu();
menu.init();
try{
bgrd=loader.loadImage("res/imgs/bgrd.png");
wizard=loader.loadImage("res/sprites/wiz.png");
hdkn=loader.loadImage("res/sprites/hdkn.png");
}catch(IOException e){
e.printStackTrace();
}
}
Это результат, когда я устанавливаю состояние в состояние меню (1)
И это результат, когда для состояния установлено состояние игры (номера 3-10): Game State Game
РЕДАКТИРОВАТЬ: Кто-то хотел увидеть мой основной метод, я думаю...
game=new GameMain();
game.setPreferredSize(new Dimension(WIDTH,HEIGHT));
game.setMaximumSize(new Dimension(WIDTH,HEIGHT));
game.setMinimumSize(new Dimension(WIDTH,HEIGHT));
JFrame frame = new JFrame("Math Game");
frame.add(game);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
game.start();
РЕДАКТИРОВАТЬ: выяснил, почему это не сработало. Я не включил bStrat.show() после моего вызова метода рендера в моем методе рендеринга GameMain.
РЕДАКТИРОВАТЬ 2: Я оглянулся на мой код, и если кто-то хочет его использовать, вы должны также поставить перед ним g.dispose(), чтобы он освободил распределение ресурсов или что-то еще
1 ответ
Может быть, ваш Graphic
объект g
не может быть нарисован сразу. Попробуйте использовать
g.paintImmediately(0,0, /*your graphic width here*/, /*your graphic height here */)
после того, как вы попросили нарисовать картинку. Это заставит пользовательский интерфейс обновлять вашу графику, не позволяя вашей системе выбирать, когда обновлять ее, только на это время.
Посмотрите здесь: https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html