- ベストアンサー
Java初心者のためのイメージの移動方法
- Java初心者が背景となるビットマップをCanvas上に描画し、移動する方法について教えてください。
- 描画したビットマップを削除することなく、新しい位置に移動させる方法を教えてください。
- 現在表示されているビットマップのみを移動させることは可能でしょうか?可能であれば、その方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
たびたび失礼します。補足です。 AWTの場合は、ダブルバッファリングはちらつきを押さえる意味がありましたが、 Swingでは自動的にダブルバッファリングされるので、必要なくなります。 それから、ダブルバッファリングを使うときには、 update()のオーバライドをしなければなりませんでした。 (絶対ではないけど) public void update(Graphics g){ paint(g); } と書いておいてください。 オライリーの『Javaプログラムクイックリファレンス』 の 「グラフィックス:ダブルバッファリングでアニメーション」のところに ダブルバッファリング・クリッピングのサンプルがありました。 (もっとも、私の持ってるのは古い版です)
その他の回答 (2)
- liar_adan
- ベストアンサー率48% (730/1515)
あーすいません。 黒いイメージで試していたもので、気づきませんでした。 Imageを完全に読み込むには、 ImageIconのロード機能を使うと話が早いのですが、 これはSwingパッケージの中にあります。 AWTでやろうとするならば、 コンストラクタの中でMediaTackerを使うといいと思います。 -------------------- BufferedImageSample(){ MediaTracker mt = new MediaTracker(this); mt.addImage(image1, 0); mt.addImage(image2, 1); try{ mt.waitForAll(); }catch(InterruptedException e){} } ---------------------- それから、描画の効率化のためには、ダブルバッファリングの他にも 「update()のオーバライド」 「描画領域のクリッピング」 などの手法があります。 『just Java2』Peter van der Linden著 アスキー に書いてありました。
- liar_adan
- ベストアンサー率48% (730/1515)
本質的には、Image1とImage2の描画の繰り返しになるのですが、 Java2であれば、BufferedImageを使うことで、 オフラインで(画面とははなれたところで)イメージを描画し、 できあがったところで一度に画面に描画することができます。 これによってちらつきがなくなります。 サンプルを掲げます。 ------------ import java.awt.*; import java.awt.image.*; import java.awt.event.*; class BufferedImageSample extends Canvas{ Image image1 = Toolkit.getDefaultToolkit().getImage("image1.jpg"); Image image2 = Toolkit.getDefaultToolkit().getImage("image2.jpg"); BufferedImage buffer = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); int x, y; public void paint(Graphics g){ Graphics offg = buffer.getGraphics(); offg.drawImage(image1, 0, 0, null); offg.drawImage(image2, x, y, null); x += 10; y += 10; x %= 100; y %= 100; g.drawImage(buffer, 0, 0, this); } public static void main(String[] args){ Frame f = new Frame("BufferedImageSample"); Canvas canvas = new BufferedImageSample(); WindowListener l = new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }; f.addWindowListener(l); canvas.setSize(100, 100); f.add(canvas); f.pack(); f.setVisible(true); } } ------------------- ウィンドウのサイズを何度か変えてみてください。 Java2でなければ、ComponentクラスのcreateImage()で、 ダブルバッファリング用のImageを作り出すことができます。
補足
ご回答ありがとうございました。BufferedImageを使用して、描画する様にしました。 ところで、質問とちょっとずれますが、drawImageにて、描画しておりますが、 アプリケーション起動後、必ず一度目は描画されないイメージがあります。(二度目は必ず描画されます。) 調査した所、drawImageの返却値としてfalseが返って来ていました。これはどういう事なのでしょうか。 ロードに時間がかかったという事でしょうか。それで、drawImageの部分のドキュメントを見ると、 「イメージが完全にロードされていない場合、drawImage は false を返します。イメージのより多くが利用可能になると、イメージを描画するプロセスが、指定されたイメージオブザーバに通知します。 」 とあります。イメージオブザーバーに通知されます、でその後、対応としてはどうすればいいのでしょうか。全くわかりません。 もし、おわかりになりましたら、回答をお願いします。先の件はありがとうございました。
お礼
何度もご丁寧にありがとうございました。 MediaTrackerを使用して、見事解決しました。 それ以外の様々なご回答についても、大変勉強になりました。