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 );
}
}
お礼
Yanch さん、 早速の ご教示、ありがとうございます。 なるほど、やっぱり取れないのですね。 setFocusTraversalKeysEnabled(false); の使い方などのヒントが見れるURLを ご存知でしたら、教えていただけると、 助かります。 よろしくお願いします。