【问题标题】:Java Drawing GraphicsJava 绘图图形
【发布时间】:2013-06-07 15:24:39
【问题描述】:

我正在用 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 对象

【问题讨论】:

  • 你可以从绘画中调用渲染,不是吗...?
  • @pinkpanther 不,因为我的类实际上并没有扩展任何组件,但它初始化了 Canvas 对象。

标签: java swing awt


【解决方案1】:

我正在用 Java 制作游戏,我有一个画布类,它有 游戏滴答声,然后我使用

在画布上绘制图像

注意

public void paint(Graphics g) { for awt.Canvas, awt.Panel

public void paintComponent(Graphics g) { for swing.JComponent, swing.JPanel

  • 只能为 J/Component 进行任何绘制,不能将此方法移到 J/Component 声明之外

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

  • 在执行paint/paintComponent 之前准备所有对象是个好主意,
  • 将所有对象放入数组中
  • paint/paintComponent 内部仅在准备好的对象数组内循环,从 Swing 计时器、鼠标/键事件调用
  • 所有用于绘制到 AWT/Swing GUI 的事件都必须在事件调度线程上完成
  • 今天的 GUI 使用 Swing JComponent、JPanel 和覆盖paintComponent
  • 这里有几个非常好的代码示例,由 paintComponent 标记

【讨论】:

  • ok :) 所以基本上在我的引擎类中,我会将所有需要绘制的对象(播放器、ai 等)放入一个数组中。在画布类中,我将遍历绘制每个对象的数组。我想我明白了。
【解决方案2】:

一个问题是引擎无法知道调用了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);
    }
}

【讨论】:

  • 虽然这种方法可行,但我应该补充一点,正如另一个答案所表明的那样,将图形和后端分开是一个更好的主意。
猜你喜欢
  • 2010-11-19
  • 2015-01-23
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2013-06-02
  • 2012-01-31
相关资源
最近更新 更多