• 締切済み

javaでのコンテントペインの使い方についてです

public class GameTestMain { JFrame frame1; BufferStrategy bstrategy; int count = 0; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setResizable(false); frame1.setLocationRelativeTo(null); Container pane = frame1.getContentPane(); pane.setBackground(Color.WHITE); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); Timer t = new Timer(); t.schedule(new MyTimerTask(), 0, 500); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } class MyTimerTask extends TimerTask{ public void run () { Graphics g = bstrategy.getDrawGraphics(); if (bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.translate(insets.left, insets.top); g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 100); bstrategy.show(); g.dispose(); } } } } (文字数の関係でimport文は省略) 四角形を表示させる部分を追記したところ、背景が白でなくなってしまいました。 以前、Jframeに直接描写するのではなく、コンテントペインという透明レイヤーのインスタンスを取得し、そこに色々と表示させていくということを耳にしました。 背景を白にしたのが反映されないのは、四角形をコンテントペインのインスタンスでなくframe1に直接表示させているからではないかと思うのですが、背景の時に作製した「pane」とは別に新しくコンテントペインのインスタンスを取得し、そこに描写するのがいいでしょうか? どちらにしてもコンテントペインのインスタンスに四角形を描写する方法がわかりません。 背景の部分についてはネットで同じような質問をされている方がいたので、 その回答を元に記入しました。 今読んでいる入門本、「JAVAわくわくゲームプログラミング教室」だとコンテントペインなしで解説されているのですが、せっかくなのでコンテントペインも同時に導入しながら進めたいです。 これからこの本で簡単なゲームを作成するところまでやっていきますので、 コンテントペインの大まかな仕組みや使い方を理解していなければ同じように躓くと思います。 なので、今この場を切り抜ける方法も教えて欲しいのですが、コンテントペインの使い方がわかる書籍なども知っている方がいれば教えていただけないでしょうか。 よろしくお願いします。

みんなの回答

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。  BufferStrategyを使う場合は、コンテントペインやルートペインは、もう関係なくなっちゃうので、使わないんだと思います。  背景は、自分で塗りつぶすのが普通みたいですね。  いろんなサイトを見てみたら、fillRectメソッドを使って塗りつぶしているので一般的みたいですね。  でも、実験してみたらclearRectメソッドも機能するみたいです。  その際は、JFrameに直接設定されたバックグラウンドカラーが使用されるみたいです。  ちょっと、遊んでいたので、コードが変わってます。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) public class GameTestMain {   JFrame frame1;   BufferStrategy bstrategy;   int count = 0;   GameTestMain() {     frame1 = new JFrame("ゲームテスト");     frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame1.setVisible(true);     Insets insets = frame1.getInsets();     frame1.setSize(600 + insets.left + insets.right,         400 + insets.top + insets.bottom);     frame1.setResizable(false);     frame1.setLocationRelativeTo(null);     frame1.setBackground(Color.RED);     frame1.setIgnoreRepaint(true);     frame1.createBufferStrategy(2);     bstrategy = frame1.getBufferStrategy();     Timer t = new Timer();     t.schedule(new MyTimerTask(), 0, 33);   }   public static void main(String[] args) {     GameTestMain gtm = new GameTestMain();   }   class MyTimerTask extends TimerTask {     private int x = 0;     private int y = 0;     private int dx = 3;     private int dy = 3;          public void run() {       Graphics g = bstrategy.getDrawGraphics();       Insets insets = frame1.getInsets();       int width = frame1.getWidth() - insets.left - insets.right;       int height = frame1.getHeight() - insets.top - insets.bottom;       if (bstrategy.contentsLost() == false) {         g.translate(insets.left, insets.top);         g.clearRect(0, 0, width, height);         g.setColor(Color.BLUE);         g.fillRect(x, y, 100, 100);         bstrategy.show();         g.dispose();       }       if (x < 0)         dx = 3;       else if (x > width - 100)         dx = -3;       if (y < 0)         dy = 3;       else if (y > height - 100)         dy = -3;       x += dx;       y += dy;     }   } }