【发布时间】:2012-02-21 19:30:50
【问题描述】:
我有一个正在尝试绘制的小程序,但我想在小程序的 paint() 方法之外进行。目前我有一个实体类,它将图像的文件名和屏幕坐标作为参数。构造函数调用一个处理资源加载和类似事情的 Sprite 类。
所以我有一个名为 MainMenuState 的类,它原本应该为我的小程序的主菜单处理键盘输入(我正在开发 2D 游戏),但我意识到将绘图代码放在那里会更好好吧。我要做的是在构建主菜单状态时绘制主菜单背景。这是我目前所拥有的:
Game.java(扩展小程序)
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);
}
小程序运行并且所有绘制方法都被正确调用,但小程序从不将图像绘制到屏幕上。目前我的小程序的paint() 方法是空的。如何在小程序的 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:当然,小程序在调整大小时总是闪烁吗?可能就是这样。
【问题讨论】:
-
“小程序在调整大小时总是闪烁吗?” 其他 GUI 不应该,但小程序通常不能调整大小。换句话说,不要做
this.setSize(500, 500);之类的事情。 1) 为什么要使用具有透明度的BufferedImage? 2) 你为什么要编写一个小程序? -
我不记得为什么我选择了 BufferedImage。最初的程序是一个小程序,因为我们的想法是,一旦项目完成,我们就可以将它发布到网站上(虽然不是我的想法)。
-
1) 我的问题不是关于
BufferedImage的使用,而是关于透明度的使用。将其更改为 RGB 并报告任何差异。 2) “我们可以将它发布到网站上”小程序既不是最好的也不是最简单的方法。而是从使用Java Web Start 的链接启动JFrame。