我有一个我正在尝试绘制的applet,但我想在applet的paint()方法之外进行绘制。目前我有一个Entity类,它将图像的文件名和屏幕坐标作为参数。构造函数调用Sprite类来处理资源加载和类似的东西。
所以我有一个名为MainMenuState的类,它本来应该处理我的applet主菜单的键盘输入(我正在处理2D游戏)但我意识到将绘图代码放在那里会更好好。我想要做的是在构建主菜单状态时绘制主菜单背景。这是我到目前为止所做的:
Game.java
(扩展Applet)
public void init() {
this.setSize(500, 500);
// New games have the MainMenuState by default because the game starts at the main menu.
setState(new MainMenuState(this));
Entity background = new Entity("../Assets/Menus/titleScreen.png", 0, 0);
background.draw(this.getGraphics());
}
MainMenuState.java
(扩展抽象State类)
public MainMenuState(Game game) {
super(game);
Graphics g = game.getGraphics();
Entity background = new Entity("../Assets/Menus/titleScreen.png", 0, 0);
background.draw(g);
}
小程序运行并且绘制方法都被正确调用,但小程序从不将图像绘制到屏幕上。目前我的applet的paint()方法是空的。如何在applet的paint()方法之外将图像绘制到屏幕上?
感谢。
更新:好的。我修改了我的MainMenuState类,使用屏幕外缓冲区的图形上下文调用背景的draw()方法,然后我将其绘制到屏幕上。这有效,但每当我调整窗口大小时,我都会闪烁。
Game.java
public void init() {
this.setSize(500, 500);
offScreen = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
graphics = offScreen.getGraphics();
// New games have the MainMenuState by default because the game starts at the main menu.
setState(new MainMenuState(this));
}
public void paint(Graphics g) {
g.drawImage(offScreen, 0, 0, this);
}
public void update(Graphics g) {
paint(g);
}
MainMenuState.java除此之外是相同的:background.draw(game.getOffScreenGraphics());
更新2:当然,applets在调整大小时总是会闪烁吗?可能就是这样。
答案 0 :(得分:1)
永远不要使用getGraphics()
,因为永远不会保证获得的Graphics对象能够持久存在。我建议您绘制一个BufferedImage,如果您想绘制“paint of paint”,然后在您希望显示它时在paint
方法内绘制该图像。要显示某些内容,最终必须在paint方法中绘制。