1

私は Java でゲームを作成しており、ゲームの目盛りを持つキャンバス クラスがあり、使用してキャンバスに画像を描画します。

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

すべての描画機能を Engine クラスに移動したいと考えています。エンジンに次のメソッドがあります。

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

Canvas では paint メソッドを呼び出す必要はありませんでしたが、Engine では render メソッドを呼び出す必要がありましたが、Graphics シーンを引数として取るため、少し途方に暮れています。Canvas クラスからではなく、(render メソッドを使用して) Engine クラスからコンポーネントを描画するにはどうすればよいでしょうか。

エンジン クラスは JComponent を拡張しませんが、Canvas オブジェクトを初期化します

4

2 に答える 2

1

私は Java でゲームを作成しており、ゲームの目盛りを持つキャンバス クラスがあり、使用してキャンバスに画像を描画します。

ノート

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

public void paintComponent(Graphics g) { swing.JComponent、swing.JPanel 用

  • ペイントは J/Component に対してのみ行うことができ、このメソッドを J/Component 宣言の外に移動することは適切な方法ではありません。

すべての描画機能を Engine クラスに移動したいと考えています。エンジンに次のメソッドがあります。

  • paint/paintComponent が実行される前に、すべてのオブジェクトを準備することをお勧めします。
  • そこにすべてのオブジェクトを配列に入れる
  • Paint/paintComponent 内では、Swing Timer、Mouse/Key イベントから呼び出される、準備された Obects の配列内でのみループします。
  • AWT/Swing GUI への描画のためのすべてのイベントは、イベント ディスパッチ スレッドで実行する必要があります
  • 今日の GUI で Swing JComponent、JPanel を使用し、paintComponent をオーバーライドする
  • paintComponent によってタグ付けされた、いくつかの非常に優れたコード例がここにあります
于 2013-06-07T15:44:51.593 に答える
0

paint(g)1 つの問題は、呼び出しがキャンバス上で実行されるため、Engine が呼び出されたことを知る方法がないことです。そのため、おそらく をCanvas.paint呼び出すように変更する必要がありEngineます。追加できるファンキーなリスナーがいくつかある可能性がありますが、Canvasそれはおそらく必要以上に複雑だと思います。

Engine動作する 1 つの方法は、のインスタンスを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);
    }
}
于 2013-06-07T15:47:30.657 に答える