Javaでゲーム - 2Dグラフィックメモ

作成 2004/9/26

フルスクリーンとウィンドウ

こんなの(FirstFrame.java)があったとして。

ウィンドウモード
WindowMain.java

フルスクリーンモード
FullScreenMain.java

画像読み込み

MediaTrackerクラスを利用して画像を読み込める

Image image = Toolkit.getDefaultToolkit().getImage(path);
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 1);

MediaTrackerは、非同期で画像を読み込む。読み込み完了までブロックしたいときは、以下のようにする。

tracker.waitForAll();

その他に、ImageIconを使うというて抜き技?もある。

Image image = new ImageIcon(path).getImage();

画像フォーマットと透過

透明、半透明。とりあえず画像をそう作ればそのまま読み込まれるが。

GIFには半透明はないのね。

アニメーション

アニメーション

ペラペラまんが的なアニメーション。参考のページにAnimationクラスというサンプルがあります。Animationクラスでは、Imageと表示時間をフレームとして、Animationが複数のフレームをもってます。経過時間によって表示するイメージを切り替える作り。

ダブルバッファリング

アニメーションを普通に表示しているとちらつきが起こる。ちらつきの回避には、ダブルバッファリングという手法を使う。ダブルバッファは自分で書いてもいいが、BufferStrategyクラスも使える。

BufferStrategy strategy = getBufferStrategy();
Graphics g = strategy.getDrawGraphics();
g.drawImage(bgImage, 0, 0, null);
...
g.dispose();
strategy.show();

スプライト

上のアニメーションに座標と速度を持たせるとSpriteクラスが出来上がる。参考ページ参照。ここで使っている「スプライト」という言葉の定義が一般に言うスプライトかどうか分かりませんが。

作ってみたスプライトが飛び回るサンプル

アンチエイリアス

Graphics2D#setRenderingHint()で。

public void paint(Graphics g) {
    if(g instanceof Graphics2D){
        Graphics2D d2 = (Graphics2D)g;
        d2.setRenderingHint(
            RenderingHints.KEY_TEXT_ANTIALIASING, 
            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    }
    
    g.drawXXX...
}

座標変換

AffineTransformクラスを使って回転、拡大、縮小が簡単に行える。パフォーマンスはいかほどまんえん。

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;

    int x = 50;
    int y = 50;
    int w = image.getWidth(null);
    int h = image.getHeight(null);

    //g2.drawImage(image, x, y, this);
    
    AffineTransform transform = new AffineTransform();

    //内部的にはたぶん変換行列の連結で、適用は後が先
    transform.translate(100, 100);
    transform.scale(2,2);
    transform.rotate(Math.PI * 45 / 180, w/2, h/2);

    g2.drawImage(image, transform, null);
}

参考

Developing Games in Java


BACK | TOP