作成 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);
}