- - PR -
drawImageができない
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-08-26 06:15
ゴールデンさん頑張ってますね。
透明度の処理、24ビットまとめてシフトしてるようですが、 各色毎に処理するのでは? あとアルファ操作するなら、java.awt.AlphaCompositeのオブジ ェクト作って、java.awt.Graphics2D#setComposite(Composite comp) というのでは軟弱過ぎるでしょうかね。 |
|
投稿日時: 2004-08-26 22:49
ご返答ありがとうございます。Graphics2Dを理解すると、いろいろおもしろいことができそうですね。今のところGraphics2Dに関する本を持っていないので、自分のできる範囲で考えて、改良し、ほぼ完成しました。「晴れの日」ボタンを押すと、てるてるくんがゆれています。「雨の日」ボタンを押すと、雨が降っていて、てるてるくんががんばる(ふるえる)と雨が止み、バック画像の動きも止まります。〜というものです。ところが、「雨の日」の場合、バック画像の動きが止まるまで待つと(sm.Bo=falseでスレッドを動かないようにしている)、「リセット」ボタン(bt[0])をクリックしても動かなくなってしまいます。「晴れの日」ボタンは、何も問題ないです。ここのところをクリアしたいです。クリアしたら完成です。どこを直せばよいのでしょうか?
import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.geom.AffineTransform; import java.awt.image.MemoryImageSource; /* <applet code="teruteru"width=200 height=220> </applet> */ public class teruteru extends Applet implements ActionListener,Runnable{ MemoryImageSource mis; Image ametubu; Ame am; int w=200; int h=220; Graphics og; Image offs; Image teru[]; Image back[]; Thread th1; int x=0; Button bt[]; soramoyou sm; Panel p; int tw=75;//てるてるくんのw int th=140;//てるてるくんのh DrawImage di; int count=0; int point_x[]; int point_y[]; MediaTracker mt; public void init(){ back=new Image[4]; for(int i=0;i<4;i++){ back[i]=getImage(getCodeBase(),"sora"+i+".jpg"); } teru=new Image[5]; for(int i=0;i<=4;i++){ teru[i]=getImage(getCodeBase(),"teruteru"+i+".gif"); } am=new Ame(); mis=new MemoryImageSource(13,21,am.ame,0,13); mis.setAnimated(true); ametubu=createImage(mis); am.make_ametubu(); mis.newPixels(); amewotukuru(); offs=createImage(w,h); sm=new soramoyou(back[0],teru[0],false,false,false); BorderLayout bl=new BorderLayout(); setLayout(bl); p=new Panel(); add(p,"South"); bt=new Button[3]; bt[0]=new Button("リセット"); bt[1]=new Button("晴れの日"); bt[2]=new Button("雨の日"); for(int i=0;i<3;i++){ add(bt[i]); bt[i].addActionListener(this); p.add(bt[i]); } mt=new MediaTracker(this); for(int i=0;i<back.length;i++){mt.addImage(back[i],0);} for(int i=0;i<teru.length;i++){mt.addImage(teru[i],0);} th1=null; } public void start(){ if(th1==null){ th1=new Thread(this); th1.start(); } } public void stop(){ th1=null; } public void run(){ try { mt.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } Thread thisThread=Thread.currentThread(); while(thisThread==th1){ if(sm.Bo){ try{ th1.sleep(50); }catch(InterruptedException e){} repaint(); x++; if(x>=400){x=0;} count++; if(count>1000){count=0;} } } } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ og=offs.getGraphics(); if(!mt.checkID(0)){ g.drawString("てるてるくんの生活", 20, 50); } if(og!=null){ try{ Graphics2D g2d=(Graphics2D)og; if(x>=w&&x<2*w){ if(sm.kawaru){og.drawImage(back[3],0,0,w,h,-w*2+x,0,-w+x,h,this);} else{og.drawImage(sm.Back,0,0,w,h,-w*2+x,0,-w+x,h,this);} } back_kawaru(); og.drawImage(sm.Back,0,0,w,h,x,0,x+w,h,this); og.setColor(Color.blue); og.fillRect(0,30,w,5); teru_kawaru(); if(sm.yureru==false){ if(sm.kawaru&&sm.Img==teru[3]){ di.hurue(); g2d.drawImage(di.image,di.xform,this); } else{og.drawImage(sm.Img,62,30,tw,th,this);} if(sm.kawaru){ amewohuraseru(og); } } else{ di.kaitenn(); g2d.drawImage(di.image,di.xform,this); } g.drawImage(offs,0,0,this); }catch(Exception e){} finally{ og.dispose(); } } } public void actionPerformed(ActionEvent e){ x=0; count=0; if(e.getSource()==bt[0]){ sm=new soramoyou(back[0],teru[0],false,false,false); } else if(e.getSource()==bt[1]){ sm=new soramoyou(back[1],teru[1],true,true,false); di=new DrawImage("teruteru1.gif"); } else{ sm=new soramoyou(back[2],teru[2],true,false,true); di=new DrawImage("teruteru3.gif"); amewotukuru(); } } public void back_kawaru(){ if(sm.kawaru){ if(count>=0&&count<400){sm.Back=back[2];} else if(count>=400){sm.Back=back[3];} } } public void teru_kawaru(){ if(sm.kawaru){ if(count>=300&&count<500){sm.Img=teru[3];} else if(count>=500){ sm.Img=teru[4]; } if(count>=600){ sm.Bo=false; } } } public void amewotukuru(){ point_x=new int[20]; point_y=new int[20]; for(int i=0;i<20;i++){ point_x[i]=(int)(Math.random()*187); point_y[i]=(int)(Math.random()*200);//全雨粒の位置設定 } } public void amewohuraseru(Graphics g){ for(int i=0;i<20;i++){ int speed=(int)(Math.random()*2+1); point_y[i]=point_y[i]+speed; if(point_y[i]>200&&count<400){ point_x[i]=(int)(Math.random()*187); point_y[i]=-21; } else{g.drawImage(ametubu,point_x[i],point_y[i],this);} } } } class Ame{ teruteru teru; int speed; int ame[]=new int[13*21]; public void make_ametubu(){ int p=0; for(int i=0;i<13*21;i++){ ame[i]=0x00ffffff; } int px[]={6,6,6,5,7,5,7,5,7,4,8,4,8,3,9,3,9,2, 10,1, 11,1, 11,1, 11,0, 12,0, 12,0, 12,0, 12,1, 11, 2, 3, 9,10, 4, 5, 6, 7,8}; int py[]={0,1,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,19,19,20,20,20,20,20}; for(int i=0;i<py.length;i++){ ame[py[i]*13+px[i]]=0x6fffffff;//半透明白 } int v=(int)(111/6); int ppx[]={6,6,6,5,7,5,7,4,8,4,8,3,9,2,10,2,10,2,10,1,11,1,11,1,11,1,11,2,3,9,10,4,5,6,7,8}; int ppy[]={3,4,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18,18,19,19,19,19,19}; for(int i=0;i<ppy.length;i++){ p=v*5<<24|0x00ffffff;//透明度を増す ame[ppy[i]*13+ppx[i]]=p; } int pppx[]={6,6,5,7,5,7,4,8,3,9,3,9,3,9,2,10,2,10,2,10,2,3,9,10,4,5,6,7,8}; int pppy[]={6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,17,17,18,18,18,18,18}; for(int i=0;i<pppy.length;i++){ p=v*4<<24|0x00ffffff;//透明度を増す ame[pppy[i]*13+pppx[i]]=p; } int ppppx[]={6,6,5,7,4,8,4,8,4,8,3,9,3,9,3,9,4,5,6,7,8}; int ppppy[]={8,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,17,17,17}; for(int i=0;i<ppppy.length;i++){ p=v*3<<24|0x00ffffff;//透明度を増す ame[ppppy[i]*13+ppppx[i]]=p; } int pppppx[]={6,5,7,5,7,5,7,4,8,4,8,4,5,6,7,8}; int pppppy[]={10,11,11,12,12,13,13,14,14,15,15,16,16,16,16,16}; for(int i=0;i<pppppy.length;i++){ p=v*2<<24|0x00ffffff;//透明度を増す ame[pppppy[i]*13+pppppx[i]]=p; } int ppppppx[]={6,6,6,5,7,5,6,7}; int ppppppy[]={11,12,13,14,14,15,15,15}; for(int i=0;i<ppppppy.length;i++){ p=v<<24|0x00ffffff;//透明度を増す ame[ppppppy[i]*13+ppppppx[i]]=p; } } } class soramoyou{ Image Back; Image Img; boolean Bo;//スレッドを動かすかどうか boolean yureru;//てるてるくんをゆらすかどうか(晴れの日かどうか) boolean kawaru;//バック画像を変えるかどうか(雨の日かどうか) soramoyou(Image back,Image img,boolean bo,boolean Yureru,boolean Kawaru){ Back=back; Img=img; Bo=bo; yureru=Yureru; kawaru=Kawaru; } } class DrawImage extends Component{ AffineTransform xform; Image image; double r; double theta; int i; public DrawImage(String fileName){ Toolkit toolkit=Toolkit.getDefaultToolkit(); image=toolkit.getImage(fileName); r=2.0; i=0; xform=new AffineTransform(); } public void kaitenn(){ i=i+20; if(i>=360){i=0;} r=Math.cos(Math.toRadians(i)); theta=Math.toRadians(r); xform.rotate(theta,110,30); } public void hurue(){ r=-r; theta=Math.toRadians(r); xform.rotate(theta,110,30); } } |
|
投稿日時: 2004-08-26 23:44
連続ですみません。完成が近いのでそろそろブラウザ上でアプレットを出そうと思ったら、なんと…、Graphics2Dの画像だけ描画されないのです。プログラムを作るときは、いつもCドライブで行って、コマンドのappletviewerで見ながらやっているのですが、appletviewerではGraphics2Dが見られるのに、なぜでしょう。また、マイドキュメントにもすべてのファイルを入れて、ブラウザから見ると、Graphics2D画像が描画されないどころかGraphics2D画像が出る直前にかたまってしまうのです。せっかく教えていただきながら作って、かなり気に入っているので、何とかしたいです。アドバイスをよろしくお願いします。
|
|
投稿日時: 2004-08-27 08:56
ブラウザは何を使用していますか、稼働環境のJREのバージョンは何ですか。
IEにはじめから含まれている、JREを使用している場合、JDK1.2以前のことしかできないので、Graphics2Dは使えないような気がします。 この場合、JDK1.2以前のAPIのみで、作成しているのであれば、コンパイラオプション(source=1.2だったかな?)を指定すればいけそうな気がします。 J2SDK1.2以降のものを動かそうとした場合、pluginをインストールする必要があります。また、それに併せて、htmlの記述の変更が必要になるかもしれません。 htmlの記述は、sdkに含まれる、demoを参考にしてみてください。 |
|
投稿日時: 2004-08-27 18:45
ご返答ありがとうございます。リセットボタンの件については、repaint();を行うことで解決しました。
Graphics2Dが描画されない点についてです。 ブラウザは、IE6.0で、javaは、java2SDK1.4.0です。appletviewerでは描画されるのに、IEでは描画されないのです。どなたか教えてください。お願いします。 |
|
投稿日時: 2004-08-27 20:05
ゴールデンさん、
幾つか前の方でも書きましたが、DrawImageクラスのオブジェクトが ネイティブスクリーンリソースの階層に置いてないような気がする のですが、大丈夫でしょうか? つまり、Componentのサブクラスを Frame, Applet, Dialog等の中の どこかの階層にないと、Graphicsコンテキストは正常に機能しません よ。 画像処理だけ行う DrawImageクラスを作らず、そのメソッドを teruteruクラスの中にメソッド移動したら動きませんか? 私の勘違いだったら申し訳けありませんが。 |
|
投稿日時: 2004-08-27 20:37
何回もお返事ありがとうございます。ネイティブスクリーンリソースの意味がよくわからなかったので、せっかくアドバイスいただいたのに全然考えずにいました。さっそく、teruteruクラスの中にメソッドkaitenn()、hurue()を入れてみました。でも、やはり描画されません。なので、DrawIamgeクラスそのものをteruteruクラスの中に作り、インナークラスにしてみました。それもやはり描画されませんでした。JREのバージョンも最新のものにしました。でもだめでした。どうしたらよいのでしょう…。
|
|
投稿日時: 2004-08-27 21:02
あと、Graphicsコンテキストの取得方法も問題あった気が
しますが、今コードを読む時間が無いので帰宅したら 見てみようかと思います。(約束はできませんが。) |
