• ベストアンサー

ダブルバッファリング

ダブルバッファリングを使ったつもりですが、キー操作するたびに画面がチカチカします。 特に <applet code="test.class" width="1600" height="600"> とした場合、repaint()メソッドを何回も呼んだ時に激しいです。 以下、ソースですが間違っているでしょうか? // ダブルバッファリング private Image imgOff; // オフイメージ private Graphics graOff; // オフグラフィックス public void paint(Graphics g){ if (imgOff == null) { Dimension dim = getSize(); imgOff = createImage( dim.width, dim.height ); graOff = imgOff.getGraphics(); } // ここに何か書く 例) graOff.setColor( new Color(255,255,255) ); graOff.fillRect(0, 0, 1600, 600); // 画面に反映 g.drawImage(imgOff,0,0,this); }

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • jyugemu55
  • ベストアンサー率68% (11/16)
回答No.2

多分 paint() メソッド内で imgOff を作成していることが原因だと思います。 paint() メソッドは、g.drawImage(imgOff,0,0,this); だけにして、 imgOff の作成はほかの場所でやってみてください。

その他の回答 (1)

  • shred
  • ベストアンサー率35% (25/70)
回答No.1

updateメソッドはオーバーライドしていますか?

関連するQ&A

  • java ダブルバッファリングするがちらつく

    javaでゲームをつくろうかと考えています。 そこで、ダブルバッファリングを実装したのですが、ちらついてしまいます。 いろいろ検索をかけて調べたのですが、これ以上改善が見込めないので 質問します。 以下がソースコードです。 画面がちらつくので、画面のリフレッシュレートが関係しているのかわからず、 しかし、ふつうにjava applet でゲームがあるので、多分どこかが間違っていると思います。 ご指摘をお願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.net.URL; /*<applet code="applet01" width="320" height="480"></applet>*/ public class applet01 extends Applet implements KeyListener, Runnable { String text = ""; Image image; int x = 100, y = 100; KeyInput key; Image image弾; Bullet bullet; int flag_x = 1; Image backbuffer; Graphics ct; Dimension dim; // 初期化 public void init() { // image = getImage( getDocumentBase(), "test.jpg" ); image = getImage( getCodeBase(), "test.jpg" ); image弾 = getImage( getCodeBase(), "弾.jpg" ); bullet = new Bullet(); key = new KeyInput(); dim = getSize(); backbuffer = createImage( dim.width, dim.height ); ct = backbuffer.getGraphics(); Thread th = new Thread( this ); th.start(); addKeyListener( this ); requestFocus(); } // public void run() { try { while(true) { repaint(); Thread.sleep(1000/60); if( x>640 ) flag_x = 1; if( x<0 ) flag_x = 0; if( 1 == flag_x ) x--; if( 0 == flag_x ) x++; } } catch( Exception err ) { } } // 描画 public void paint( Graphics g ) { ct.setColor( Color.white ); ct.fillRect( 0, 0, dim.width, dim.height ); ct.setColor( Color.red ); ct.fillRect( (dim.width/2)-50 , (dim.height/2)-50, x, y ); // 裏画面に描画 ct.drawString( "画面をクリックしてキーボードで操作できます。", 0, 20 ); ct.drawString( "Hello from Java!", 60, 100 ); ct.drawImage( image, x, y, this ); bullet.Draw( ct, this, image弾 ); // 裏画面を表に反映 g.drawImage( backbuffer, 0, 0, this ); } // キーの入力があったとき public void keyTyped( KeyEvent e ) { repaint(); } // キーが押されたとき public void keyPressed( KeyEvent e ) { key.keyPressed( e ); if( key.isPressing( KeyEvent.VK_UP ) ) y = y - 5; if( key.isPressing( KeyEvent.VK_DOWN ) ) y = y + 5; if( key.isPressing( KeyEvent.VK_LEFT ) ) x = x - 5; if( key.isPressing( KeyEvent.VK_RIGHT ) ) x = x + 5; if( KeyEvent.VK_UP == e.getKeyCode() ) y = y - 5; if( KeyEvent.VK_Z == e.getKeyCode() ) { bullet.x = x; bullet.y = y; } repaint(); } // キーが放されたとき public void keyReleased( KeyEvent e ) { key.keyReleased( e ); } }

    • ベストアンサー
    • Java
  • Javaのダブルバッファリングについてお伺いしたいのですが、

    Javaのダブルバッファリングについてお伺いしたいのですが、 Thred.sleep(20) ペイント部 public void paint(Graphics g) { g.drawImage(wbuffer, int x, int y, this); } アップデートメソッド public void update(Graphics g) { paint(g); } 他のクラスからもこのwbufferの中にいったん書き込むようにしています。 チラつきが出る要因として考えられるのはどんなことがあるのでしょうか? ・オブジェクトの数が多い というのが原因でしょうか。 だいたい5秒おきくらいにチラつきが生じます。

    • ベストアンサー
    • Java
  • ダブルバッファリングについて

    Javaで時計を作成していますが、 裏画面への作画がうまくいきません。 コンパイルはできますが、実行すると以下のエラーがでます。  Exception in thread "main" java.lang.NullPointerException   at AnalogClock.<init>(AnalogClock.java:22)   at AnalogClock.main(AnalogClock.java:54) オブジェクトが必要なときに、アプリケーションがnullを返すと、この例外がでることはわかりましたが、どうしてアプリケーションがnullを返すのかがわからず困っています。 プログラムは、表画面に直接表示するとちゃんとでます。 どなたか教えて頂けるとうれしいです。よろしくお願いします。 7)public class AnalogClock extends Frame implements Runnable { 8) 9) Calendar cal; 10) Image backimg; 11) Graphics bg; 中略 19) AnalogClock() { 20)//ダブルバッファリング用裏画面 21) backimg = createImage(width,height); 22) bg = backimg.getGraphics(); 23) setBackground(Color.black); 24) } 25) 26) public void paint(Graphics g) { 27)//カレンダーの取得(時・分・秒) 28) cal = Calendar.getInstance(); 29) hour = cal.get(cal.HOUR); 30) min = cal.get(cal.MINUTE); 31) sec = cal.get(cal.SECOND); 32)//時計の文字盤を作画 33) //文字盤の作画開始座標 34) x = 50; 35) y = 50; 36) //文字盤の直径 37) across = 200; 38) bg.setColor(Color.yellow); 39) bg.fillOval(x,y,across,across); 40)//裏画面のイメージを面画面に作画 41) g.drawImage(backimg,0,0,null); 42) } 中略 53) public static void main(String[] args) { 54) final AnalogClock ac = new AnalogClock(); 55) Thread th = new Thread(ac); 56) th.start(); 57) ac.setSize(300,300); 58) ac.setVisible(true); 以下略 (左の数字は行数です)

  • Appletのrepaint()が動作しません

    import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

  • ダブルバッファによるチラつきの軽減具合

    こんばんわ。 私は今、課題研究としてJava appletでゲームを作っています。 キー入力でキャラクターを動かすという所を作っているんですが キーを押すたびに背景であるマップのチラつきがあります。 一応ネットに上がっていつダブルバッファの処理は書きました。 (プログラム) //宣言     Image ura_cimg;     Graphics buff_c; //ダブルバッファ     ura_cimg = this.createImage(32,32);     buff_c = ura_cimg.getGraphics(); でもまだ完全に無くなった訳ではありません。 ダブルバッファの処理をしたら、チラつきは完全に無くせますか? 無くせない場合は、どこまで減るかアバウトでいいので教えてください。 回答お願いします。

  • ウインドウを大きくしてもボールの動きが変わらない

     今晩は、java初心者です。  宜しくお願い致します。  "ComponentListener"でウインドウを"componentResized"してもボールの動く範囲 は変わりません、何故でしょうか。    "componentResized"では確かに"Resized"されたウインドウの大きさをとっていますが、 何故かボールの動きには反映されません。  宜しくお願いします。 ======================================================================================== public class Ball2 extends Applet implements Runnable , ComponentListener { public static final long serialVersionUID = 1L ; int width , height ; Thread thread ; boolean  LoopFlag = false  ; int x = 30 , y = 100 ; Image  offScreen ; Graphics screen ; int vx = 2 , vy = 2 ; public void init() { width = getSize().width ; height = getSize().height ; thread = new Thread( this ); thread.start(); offScreen = createImage( width, height ) ; screen = offScreen.getGraphics() ; addComponentListener(this) ; } public void componentResized( ComponentEvent e ) { width = getSize().width ; height = getSize().height ; } public void run() { while( LoopFlag == false ) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } private void move() { if( x >= width - 50 ) { vx =- vx ; } if( y >= height - 50 ) { vy =- vy ; } if( x < 0 ) { vx =- vx ; } if( y < 0 ) { vy =-vy ; } x += vx; y += vy; } public void update( Graphics g) { paint(g) ; } public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; screen.setColor( Color.blue ) ; screen.fillOval( x , y , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; } public void destroy() { LoopFlag = true ; } public void componentHidden( ComponentEvent e ){} public void componentMoved( ComponentEvent e ){} public void componentShown( ComponentEvent e ){} }

    • ベストアンサー
    • Java
  • .Net Compact でのダブルバッファリング

    .Net Comapct Frameworkを利用してのC#プログラミングで、 ダブルバッファリングを利用して画面を描画しようとしていますが、 ちらつきが解消されません。 どこがおかしいかご指摘いただけると幸いです。 【環境】 Visual Studio 2005 C# .Net Compact Framework 2.0 【コード(抜粋)】 public partial class Form1 : Form { private Bitmap m_offScr; // オフスクリーンイメージ private Graphics m_offG; // オフスクリーングラフィックス private System.Windows.Forms.Timer timer1; public Form1() { this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); ~略~ this.m_offScr = new Bitmap(400, 200); this.m_offG = Graphics.FromImage(this.m_offScr); } private void Form1_Paint(object sender, PaintEventArgs e) { m_offG.FillRectangle(new SolidBrush(Color.Red), 10, 10, 100, 100); e.Graphics.DrawImage(this.m_offScr, 0, 0); } // イベントハンドラ private void timer1_Tick(object sender, EventArgs e) { // 秒の更新 this.Refresh(); } } よろしくお願いいたします。

  • 画面の大きさに合わせてボールを動かせたい

    今日は。 javaの初心者です、宜しくお願いします。 下のようなボールが動くアプレットを組んでみましたが、画面の大きさを変えても ボールの動く範囲はかわりません。 画面の大きさに合わせて、動く範囲を自動的に変えてやるには、このプログラムの 何処をどのように書き換えてやるといいのでしょうか。  宜しくお願いします。 ========================================================================== import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; public class BallMove_1p extends Applet implements Runnable { private int width , height ; private Thread thread ; private boolean LoopEnd = false ; private int x1 = 30 , y1 = 100 ; private Image offScreen ; private Graphics screen ; private int vx = 2 , vy = 2 ; // アプレット初期化処理 public void init() { // アプレット画面サイズ取得 width = getSize().width ; height = getSize().height ; // スレッド起動 thread = new Thread( this); thread.start(); // オフスクリーンの初期化 offScreen = createImage( width, height); // オフスクリーンを作成 screen = offScreen.getGraphics(); // オブジェクトを取得 } // スレッドループ処理 public void run() { while(LoopEnd == false) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } // ボール移動 private void move() { if( x1 >= width - 50 ) { vx =- vx ; } if( y1 >= height - 50 ) { vy =-vy ; } if( x1 < 0 ) { vx =- vx ; } if( y1 < 0 ) { vy =-vy ; } x1 += vx; y1 += vy; } // 再描画時処理 public void update( Graphics g) { paint(g) ; } // 描画処理 public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; // 画面消去 screen.setColor( Color.blue ) ; screen.fillOval( x1 , y1 , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; // イメージを描画 } // アプレット終了時処理 public void destroy() { LoopEnd = true ; } }

    • ベストアンサー
    • Java
  • 意味がわかりません

    この部分の意味がわからなくて困っています。わかる方いましたら解説をお願いします。m(_ _)m public void paint(Graphics g){ int w,h; w = (int)getSize().width; h = (int)getSize().height; if(f==0){ bufferGraphics.drawImage(image,0,0,this); bufferGraphics.setColor(Color.white); for(int i=0;i<h;i+=2){ bufferGraphics.drawLine(0,i,w,i); } g.drawImage(buffer,0,0,null); f = 1; } else if(f==1) { bufferGraphics.drawImage(image,0,0,this); bufferGraphics.setColor(Color.white); for(int i=1;i<h;i+=2){ bufferGraphics.drawLine(0,i,w,i); } g.drawImage(buffer,0,0,null); f = 0; } }

    • ベストアンサー
    • Java
  • Graphicsについて

    Graphicsで描かれた線や図形は、ダブルバッファリングを使用しないと、ウィンドウのサイズを変更したり、別のウィンドウで覆ったりすると、描かれたものは消えてしまいます。 そこで今回JPanelを用いて、消えてしまわないようにしたいですが、 JPanel p = new JPanel(); Graphics g = p.getGraphics(); g.drawLine( x, x, y, y); のようにして、を実行すると上記の行為をすると消えてしまいます。JPanelはデフォルトでダブルバッファリングを備えているはずですよね。なぜなのでしょうか? どなたかご教授願います。宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう