Java初心者のためのイメージの移動方法

このQ&Aのポイント
  • Java初心者が背景となるビットマップをCanvas上に描画し、移動する方法について教えてください。
  • 描画したビットマップを削除することなく、新しい位置に移動させる方法を教えてください。
  • 現在表示されているビットマップのみを移動させることは可能でしょうか?可能であれば、その方法を教えてください。
回答を見る
  • ベストアンサー

イメージの移動

Java初心者です。 現在、ある背景となるビットマップ(image1)とその背景上に 描画するビットマップ(image2)をdrawImageメソッドにて Canvas上に描画させております。 image2のビットマップを画面上で移動出来る様にしたいと思っております。 移動といっても、おそらく、以前あったimage2の削除、新たな場所に描画 の繰り返しだと思います。 そこで質問です。 現在表示されているimage2だけを背景はそのままで 削除するという事は可能なのでしょうか? 可能であれば、そのメソッド、サンプル等教えていただければ幸いです。 最悪、 image1の描画→image2の描画→image1の描画→新たな位置のimage2描画 という繰り返しで出来ることは確認したのですが、なんとなくかっこ悪い 気がします。以上よろしくお願いします。

  • Vargas
  • お礼率85% (174/204)
  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

たびたび失礼します。補足です。 AWTの場合は、ダブルバッファリングはちらつきを押さえる意味がありましたが、 Swingでは自動的にダブルバッファリングされるので、必要なくなります。 それから、ダブルバッファリングを使うときには、 update()のオーバライドをしなければなりませんでした。 (絶対ではないけど) public void update(Graphics g){ paint(g); } と書いておいてください。 オライリーの『Javaプログラムクイックリファレンス』 の 「グラフィックス:ダブルバッファリングでアニメーション」のところに ダブルバッファリング・クリッピングのサンプルがありました。 (もっとも、私の持ってるのは古い版です)

Vargas
質問者

お礼

何度もご丁寧にありがとうございました。 MediaTrackerを使用して、見事解決しました。 それ以外の様々なご回答についても、大変勉強になりました。

その他の回答 (2)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

あーすいません。 黒いイメージで試していたもので、気づきませんでした。 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)
回答No.1

本質的には、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を作り出すことができます。

Vargas
質問者

補足

ご回答ありがとうございました。BufferedImageを使用して、描画する様にしました。 ところで、質問とちょっとずれますが、drawImageにて、描画しておりますが、 アプリケーション起動後、必ず一度目は描画されないイメージがあります。(二度目は必ず描画されます。) 調査した所、drawImageの返却値としてfalseが返って来ていました。これはどういう事なのでしょうか。 ロードに時間がかかったという事でしょうか。それで、drawImageの部分のドキュメントを見ると、 「イメージが完全にロードされていない場合、drawImage は false を返します。イメージのより多くが利用可能になると、イメージを描画するプロセスが、指定されたイメージオブザーバに通知します。 」 とあります。イメージオブザーバーに通知されます、でその後、対応としてはどうすればいいのでしょうか。全くわかりません。 もし、おわかりになりましたら、回答をお願いします。先の件はありがとうございました。

関連するQ&A

  • drawImageの描画順序の指定について

    いつもお世話になっております。 drawImageメソッドを使用し、Canvasへ画像を描画するプログラムを作成しています。 画像は全部3枚あり、座標をずらしてすべて重ねて表示します。 画像のファイルサイズはすべて異なります。 画像描画のタイミングは選択中のセレクトボックスの項目に変更があった場合です。 この際、フォームの情報によって描画順序を決定します。 本題ですが、現在のコーディングですと、指定した描画順序のとおりに描画されません。 複数の画像に対してonloadを使用しており、画像の読み込みが完了した順番に描画 されているような気がします。指定したとおりに描画できる方法はないでしょうか? ・html <canvas id=main width=160 height=160 style=border:1px solid gray></canvas> <form> <hr> 描画順序 <select name=order onChange=Main(this.form)> <option value=0>1,2,3</p> <option value=1>1,3,2</p> <option value=2>2,1,3</p> <option value=3>2,3,1</p> <option value=4>3,1,2</p> <option value=5>3,2,1</p> </select> </form> ・外部ファイル(js) function Main(f) { var canvas = document.getElementById('main'); if (!canvas || !canvas.getContext) { return false; } var Canvas = canvas.getContext('2d'); Canvas.clearRect(0, 0, 320, 240); var Image1 = new Image(); var Image2 = new Image(); var Image3 = new Image(); if (f.order.value == 0) { Image1.onload = function() { Canvas.drawImage(Image1, 0, 0); } Image2.onload = function() { Canvas.drawImage(Image2, 20, 20); } Image3.onload = function() { Canvas.drawImage(Image3, 40, 40); } Image1.src = GetImageFileName(1); Image2.src = GetImageFileName(2); Image3.src = GetImageFileName(3); } else if (f.order.value == 1) { Image1.onload = function() { Canvas.drawImage(Image1, 0, 0); } Image3.onload = function() { Canvas.drawImage(Image3, 20, 20); } Image2.onload = function() { Canvas.drawImage(Image2, 40, 40); } Image1.src = GetImageFileName(1); Image3.src = GetImageFileName(3); Image2.src = GetImageFileName(2); } else if (f.order.value == 2) { Image2.onload = function() { Canvas.drawImage(Image2, 0, 0); } Image1.onload = function() { Canvas.drawImage(Image1, 20, 20); } Image3.onload = function() { Canvas.drawImage(Image3, 40, 40); } Image2.src = GetImageFileName(2); Image3.src = GetImageFileName(3); :(以降省略) よろしくお願いいたします。

  • Graphics等のイメージの描画

    こんばんわ。 GraphicsクラスのdrawImageメソッドをつかっているですが 描画したあとでイメージだけを消す方法はあるのでしょうか。 APIはみてみましたがGraphicsクラスにはないようでした。 消すとしたら画面全体を消すのしかわからなく、使い勝手が悪いので困ってます。 ちなみにauのオープンアプリを作ろうとしているのでCLDCで使えるのを教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Canvas等の図形を移動する時,直前のその図形のみを削除する方法

    Canvas等で描画された図形を十字キー操作で移動する時,プログラムの処理(負担)を減らすために,Canvas等に描かれている全図形を再描画するのではなく,移動するその図形"だけ"を再描画しつつ,移動させたいのです. そのためには,どのような事をしなければならないのでしょうか? アドバイスを宜しくお願いします. 例: Canvas上のある所に○を描くとします.これをキーボードの↑↓←→キーに合わせて,移動させたいのです. しかし,私のプログラムでは,上記のプログラムは大体出来ているのですが,以下の不満があります. Canvas上には,上記の○以外にも,△や□等が散らばって描画されていますので,○の移動毎に,Canvas上の全図形を再描画しています。これで,Canvas上で変更点がない図形も再描画され,処理的に無駄を感じていますので,○だけについて,移動を表現する描画をしつつ,移動前の○図形を削除したいのです. また,GraphicsのclearRect(x,y,width,height)メソッドで,移動直前の○を消せばよいと思ったのですが,これを使用した場合,図形○に図形△が少しでも重なっていた場合,○だけでなく△の図形も一部消されてしまい上手くいきません. ○をCanvas上に描いたGraphicsインスタンスを記憶しておく事は出来るのでしょうか? 出来るのであれば,そのインスタンスから自分が描画した図形○を消す事で,○だけを削除できる...かな....と思っています.... 上記の私の要望が満たされるのであれば,CanvasやGraphicsの範囲外の手法で全くかまいませんので,是非アドバイスを宜しくお願いします。 参考URLもご提示いただければ,なお有難いです.

    • ベストアンサー
    • Java
  • MIDP JavaでメモリイメージをCanvasに表示させたい

    MIDP2.0で携帯ゲームを製作しております。 メモリイメージをCanvasに表示させたいのですが、 できないのでしょうか。 PCのJavaの場合には、MemoryImageSourceというクラスがあるようなの ですが・・・。 一度、GIFやPNG,JPEGに変換してcreateImageメソッドを呼ぶしか ないのでしょうか。もしくは描画メソッドでこつこつ描画する しかないのでしょうか。 何かアドバイスいただければと思います。

    • ベストアンサー
    • Java
  • PBoxのGraphicsをImageに書き込む

    お世話になります PictureBoxを2枚使用して以下の様に現状はなっております。 PictureBox AAは背景となる画像を描画 AA->Image = bmpGazou; PictureBox BBはAAのオーバーレイとして、文字や図形をGraphicsオブジェクトに描画したり編集したりしています。 主にg->FillEllipse等で円を描画しています ※文字や図形以外は透過 やりたいこと 保存用のBMPを作成して、そこにAAとBBを書き込んで、Jpeg保存したい 保存用BMPを定義して Bitmap^ bmp = gcnew Bitmap(ixSize, iySize); Graphics^ g = Graphics::FromImage(bmp); そこにAAを書き込む g->DrawImage(AA->Image,・・・ ここまでは正常にできたのですが、 BBのImageプロパティが未定義なので、g->DrawImageではBBを書き込めませんでした。 GraphicsオブジェクトをBMPに上書き(重ね書き)したいのですが、 どの様にすればよいのか教えていただけないでしょうか。 ↓等も見てはいるのですが、前提条件のBBの使い方が違うので、やり方が判りませんでした。 http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html ※PCの画面上はAAの上にBBが表示され、背景のAA画像に文字や図形を重ねて描画できております。

  • C# DrawImage 物理サイズでなく、ピクセルサイズでの描画

    C# で、 Image img = new Bitmap(fileName); Point p = this.PointToClient( new Point( e.X, e.Y ) ); で画像と描画位置を決め、 e.Graphics.DrawImage(img, p); で、そこに画像を描画するのですが、写真によって、同じ1024*768ピクセルなのに、表示される大きさがばらばらです。 Graphics.DrawImage メソッド (Image, Point)の説明を読むと、「指定した位置に、指定した Image を元の物理サイズで描画します」とあり、「元の物理サイズで描画」に問題があることがわかりました。 質問ですが、「指定した位置に、指定した Image をピクセルサイズで描画」するメソッドは何でしょう?探し方が悪いのか、見つけられません。

  • Windowsビットマップイメージ削除しても良い?

    マイコンピュータ⇒ローカルディスク⇒Windowsフォルダ Windowsフォルダの中のフォルダ直ぐ下にあるもの(5つ)と、1番下にある(11)「ビットマップイメージ」を削除しても問題はないでしょうか? 背景は「なし」にしています。使わなければ削除しても良いでしょうか? 「マイピクチャ」は削除してしまうと問題があるようです・・・「ビットマップイメージ」はそのような事はないでしょうか? 検索してみると「良い」という、1つのページがありましたが・・・フォルダの直ぐ下にあるもの(IBM)の2つは、400KB以上と700KB以上もあります。大きいですよね?何だか心配です。 よろしく、お願いします。

  • drawimageを使いつつ背景を綺麗に表示させる方法について

    ぶしつけで申し訳ありません。 タイマー処理でdrawimageを使いキャラクターを規則的に動かしてるのですが、 drawimageにてアイテムを動かす場合には、現状g.clear(color.black)で背景を塗りつぶし 再描画する事によって動いているように見せている状況です。 ですがこの方法だとクリアした時に切れ目が出来、背景を表示させたいのにチカチカしてしまいます。 理想的な形としてはdrawimageだけを再描画出来れば背景が消えずにすむ筈なのですが 知らない構文が多すぎて出来るのか出来ないのかわからない状況です。 私が対処した方法(もちろん駄目でしたが)としては (1)g.clear(color.tranceparent) 透明色で削除 結局切れ目が出来ました (2)タイマーに背景描画処理を直書 これも気休めでぶつ切りになってしまいました このまま解決しないととてもシンプルなものになってしまい寂しいので 何とか背景を表示させたいと思っています。 詳しい方がいらっしゃいましたら教えてください。

  • javaコンポーネントデザイン

    java超初心者です。 htmlであればcss使って、(画像を背景に使ったり、グラデかけたり等々)要素を柔軟にデザインできますが、javaでそのような事が可能なのでしょうか?そのようなパッケージ等存在するのでしょうか? canvas使って描画するような事をしないと不可能でしょうか?

  • javascriptで困っています。教えてください

    canvasタグの画像の描画で困っています。 Imageオブジェクトを生成して、画像ファイルを先読みしておいて var aaa = new Image(); aaa.src = "img/item00.png"; var bbb = new Image(); bbb.src = "img/item01.png"; 配列に入れる var i = [aaa,bbb] 描画コンテキストの取得s取得して、画像を表示させる var canvas = document.getElementById('sample'); if (canvas.getContext) { var context = canvas.getContext('2d'); 座標(10, 10)(50, 50)の位置にイメージを表示 context.drawImage(aaa, 10, 10); context.drawImage(bbb, 50, 50); } としています。このあとクリックなどのきっかけで、画像の絵を入れ替えたいと思い、 var cha1 = i[0].src; var cha2 = i[1].src; i[0].src = cha2; i[1].src = cha1; もう一度描画させているのですが、うまくいきません。 cha1,cha2が取得できているかチェックすると、undifineとでます。 これでは、入れ替えることがでないのでしょうか? 入れ替えるとしたらどのような方法があるのでしょうか。 よろしくお願いします。

専門家に質問してみよう