1

我正在用 Java 制作游戏,我有一个画布类,它有游戏标记,我在画布上使用

public void paint(Graphics g) {
    // draw stuff here
}

我想将所有绘图功能移至我的 Engine 类。我的引擎中有这个方法:

@Override
public void render(Graphics scene) {
 // draw stuff here
}

在我的 Canvas 中,我不必调用 paint 方法,但在 Engine 中我必须调用 render 方法,但由于它以图形场景作为参数,我有点不知所措。我如何能够从我的 Engine 类(使用 render 方法)而不是从 Canvas 类中绘制组件。

引擎类不扩展任何 JComponent,但它确实初始化了 Canvas 对象

4

2 回答 2

1

我正在用 Java 制作游戏,我有一个画布类,它有游戏标记,我在画布上使用

笔记

公共无效油漆(图形g){用于awt.Canvas,awt.Panel

公共无效paintComponent(图形g){用于swing.JComponent,swing.JPanel

  • 任何绘画都只能为 J/Component 完成,好的做法不能将此方法移到 J/Component 声明之外

我想将所有绘图功能移至我的 Engine 类。我的引擎中有这个方法:

  • 在执行paint/paintComponent 之前准备所有对象是个好主意,
  • 在那里将所有对象放入数组
  • 在paint/paintComponent 内部仅循环在准备好的Obects 数组中,从Swing Timer、鼠标/键事件调用
  • 必须在 Event Dispatch Thread 上完成对 AWT/Swing GUI 的所有绘制事件
  • 今天的 GUI 使用 Swing JComponent、JPanel 和覆盖paintComponent
  • 这里有一些非常好的代码示例,由 paintComponent 标记
于 2013-06-07T15:44:51.593 回答
0

One problem is that there is no way for Engine to know that paint(g) is called, since the call is run on the canvas. So you will most likely need to modify Canvas.paint so that it calls the Engine. It's possible there is some funky listener you could add to Canvas but I think that's probably more complicated than you need.

One way that would work would be to pass an instance of Engine to the Canvas on construction:

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);
    }
}
于 2013-06-07T15:47:30.657 回答