我正在用Java制作一款游戏,我有一个canvas类,其中包含游戏标记,我使用
在画布上绘制图像public void paint(Graphics g) {
// draw stuff here
}
我想移动所有的绘图功能到我的引擎类。我有这个方法在我的引擎:
@Override
public void render(Graphics scene) {
// draw stuff here
}
在我的画布中,我不必调用油漆方法,但在引擎中,我必须调用渲染方法,但由于它将图形场景作为参数,我有点不知所措。我怎么能从我的Engine类(使用render方法)而不是从Canvas类中绘制组件呢?
引擎类不扩展任何JComponent,但是它初始化了Canvas对象
我正在用Java制作一款游戏,我有一个canvas类,它有我使用
在画布上绘制图像。
注意
public void paint(Graphics g) {for awt。帆布、awt。小组
public void paintComponent(Graphics g) {for swing。JComponent,摇摆不定。JPanel
- 任何绘制只能为J/Component完成,好的做法是不能将这个方法移出J/Component声明
我想移动所有的绘图功能到我的引擎类。我有这个方法在我的引擎:
- 在paint/paintComponent执行之前准备好所有对象是一个好主意,
- 将所有对象放入数组
- 内部paint/paintComponent只循环内部数组的准备对象,从Swing Timer,鼠标/键事件调用
- 所有用于绘制AWT/Swing GUI的事件必须在事件调度线程上完成
- 为今天的GUI使用Swing JComponent, JPanel和覆盖paintComponent 这里有几个非常好的代码示例,标记为paintComponent
一个问题是引擎没有办法知道paint(g)
被调用了,因为调用是在画布上运行的。所以你很可能需要修改Canvas.paint
以便它调用Engine
。有可能有一些时髦的监听器,你可以添加到Canvas
,但我认为这可能比你需要的更复杂。
Engine
的实例传递给Canvas
:
public class Engine {
private Canvas canvas;
public Engine() {
Canvas = new Canvas(this);
}
public void render(Graphics g) {
// do stuff
}
}
public class Canvas extends JPanel {
private Engine engine;
public Canvas(Engine engine) {
this.engine = engine;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
engine.render(g);
}
}