- PR -

コードの問題なのですが…

1
投稿者投稿内容
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-09-12 18:05
まだまったくの作成途中です。どなたか教えていただけないでしょうか。
kemuri()メソッドで行き詰まってしまい、かなり時間をかけたのですが抜け出せません。kemuri_moto()メソッドで、新しいけむりのもとの座標を作り出し、kemuri()メソッドで徐々に大きく(楕円)、徐々に透明度を増すことを今やろうとしています。kemuri()メソッド内のコメント行に書いたコードのように(自分では正しいつもり)、発生させたけむりが重なると、重なった部分の透明度が重なり、2つ重なったところは2重に、3つ重なったところは三重に見える、というようにしたいです。思ったようにならないので、とりあえず、あとに発生させたけむりが優先で表示されるようにしてあります。重なったことがわかるような表示にしたいです。何か勘違いをしているだけのように思うのですが、どのようにしたらよいでしょうか。

コード:
import java.awt.*;
import java.applet.Applet;
import java.awt.image.PixelGrabber;
import java.awt.image.MemoryImageSource;
/*
<applet code="Sannma",width=200 height=200>
</applet>
*/
public class Sannma extends Applet implements Runnable{
	Graphics og;
	Image offs;
	Image hitirinn_sumi;
	Image sumi;
	Image saba;
	Image ami;
	MediaTracker mt;
	PixelGrabber pg1;
	PixelGrabber pg2;
	int w=200;//七輪画像
	int h=200;
	int sw=167;//炭画像
	int sh=169;
	int org_hs[];
	int pixels_hs[];
	int org_s[];
	int pixels_s[];
	int pixels_k[];	//けむり用
	MemoryImageSource mis1;
	MemoryImageSource mis2;
	MemoryImageSource mis3;
	Image new_hitirinn_sumi;
	Image new_sumi;
	Image kemuri;
	Thread th;
	int t1=11;//七輪と炭のぼかし段階数
	int t2=11;//炭のぼかし段階数
	boolean bo1=false;//七輪と炭のフラグ
	boolean bo2=true;//炭のフラグ
	int r1=0;//七輪と炭用
	int g1=0;
	int b1=0;
	int r2=250;
	int g2=35;
	int b2=0;
	int R12=r2-r1;
	int G12=g2-g1;
	int B12=b2-b1;
	int r3=64;//上の炭用
	int g3=64;
	int b3=64;
	int r4=231;
	int g4=55;
	int b4=1;
	int R34=r4-r3;
	int G34=g4-g3;
	int B34=b4-b3;
	int count;//けむりのカウント
	int alf[];
	int kw=200;//けむり画像w
	int kh=200;
	int vx[];
	int vy[];
	int radias[];
	int k;//けむりの発生回数	
	public void init(){
		vx=new int[20];
		vy=new int[20];
		vx[0]=120;
		vy[0]=100;
		alf=new int[20];
		radias=new int[20];
		for(int i=0;i<20;i++){
			alf[i]=255;
			radias[i]=-1;	
		}
		hitirinn_sumi=getImage(getCodeBase(),"hitirinn_sumi.gif");
		sumi=getImage(getCodeBase(),"sumi.gif");
		saba=getImage(getCodeBase(),"saba-s.gif");
		ami=getImage(getCodeBase(),"ami.gif");
		mt=new MediaTracker(this);
		mt.addImage(hitirinn_sumi,0);
		mt.addImage(sumi,0);
		mt.addImage(ami,0);
		mt.addImage(saba,0);
		try{
			mt.waitForID(0);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		offs=createImage(w,h);
		org_hs=new int[w*h];
		pixels_hs=new int[w*h];
		org_s=new int[sw*sh];
		pixels_s=new int[sw*sh];
		pixels_k=new int[kw*kh];
		pg1=new PixelGrabber(hitirinn_sumi,0,0,w,h,org_hs,0,w);
		pg2=new PixelGrabber(sumi,0,0,sw,sh,org_s,0,sw);
		try{
			pg1.grabPixels();
			pg2.grabPixels();
		}	catch(InterruptedException e){
			e.printStackTrace();
		}
		mis1=new MemoryImageSource(w,h,pixels_hs,0,w);
		mis1.setAnimated(true);
		new_hitirinn_sumi=createImage(mis1);
		mis2=new MemoryImageSource(sw,sh,pixels_s,0,sw);
		mis2.setAnimated(true);
		new_sumi=createImage(mis2);
		mis3=new MemoryImageSource(kw,kh,pixels_k,0,kw);
		mis3.setAnimated(true);
		kemuri=createImage(mis3);
		th=null;
		System.arraycopy(org_hs,0,pixels_hs,0,w*h);
		System.arraycopy(org_s,0,pixels_s,0,sw*sh);
	}
	public void start(){
		if(th==null){
			th=new Thread(this);
			th.start();
		}
	}
	public void stop(){
		th=null;
	}
	public void moeru(){
		if(bo1){
			t1++;
			if(t1>=20){bo1=false;}	
		}
		else{
			t1--;
			if(t1<=2){bo1=true;}
		}
		int r12=(int)(R12/t1);
		int g12=(int)(G12/t1);
		int b12=(int)(B12/t1);
		System.arraycopy(org_hs,0,pixels_hs,0,w*h);
		for(int a=0;a<t1;a++){//七輪と炭をぼかす
			int rgb=0xff000000|((r2-r12*a)<<16)|((g2-g12*a)<<|(b2-b12*a);
			for(int i=30;i<h-30;i++){
				for(int j=30;j<w-30;j++){
					if(org_hs[i*w+j]==0xff000000&&org_hs[i*w+j+1]==0xfffa2300){
						if(pixels_hs[i*w+j-a]==0xff000000){
							pixels_hs[i*w+j-a]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[i*w+j-1]==0xfffa2300){
						if(pixels_hs[i*w+j+a]==0xff000000){
							pixels_hs[i*w+j+a]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i+1)*w+j]==0xfffa2300){
						if(pixels_hs[(i-a)*w+j]==0xff000000){
							pixels_hs[(i-a)*w+j]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i-1)*w+j]==0xfffa2300){
						if(pixels_hs[(i+a)*w+j]==0xff000000){
							pixels_hs[(i+a)*w+j]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i-1)*w+j-1]==0xfffa2300){
						if(pixels_hs[(i+a)*w+j+a]==0xff000000){
							pixels_hs[(i+a)*w+j+a]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i+1)*w+j+1]==0xfffa2300){
						if(pixels_hs[(i-a)*w+j-a]==0xff000000){
							pixels_hs[(i-a)*w+j-a]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i-1)*w+j+1]==0xfffa2300){
						if(pixels_hs[(i+a)*w+j-a]==0xff000000){
							pixels_hs[(i+a)*w+j-a]=rgb;
						}
					}
					if(org_hs[i*w+j]==0xff000000&&org_hs[(i+1)*w+j-1]==0xfffa2300){
						if(pixels_hs[(i-a)*w+j+a]==0xff000000){
							pixels_hs[(i-a)*w+j+a]=rgb;
						}
					}
				}
			}
		}
		if(bo2){
			t2++;
			if(t2>=20){bo2=false;}
		}
		else{
			t2--;
			if(t2<=2){bo2=true;}
		}
		int r34=(int)(R34/t2);
		int g34=(int)(G34/t2);
		int b34=(int)(B34/t2);
		System.arraycopy(org_s,0,pixels_s,0,sw*sh);
		for(int a=0;a<t2;a++){//上の炭をぼかす
			int rgb=0xff000000|((r4-r34*(a+1))<<16)|((g4-g34*(a+1))<<|(b4-b34*(a+1));
			for(int i=15;i<sh-15;i++){
				for(int j=15;j<sw-15;j++){
					if(org_s[i*sw+j]==0xff404040&&org_s[i*sw+j+1]==0xffe73701){
						if(pixels_s[i*sw+j-a]==0xff404040){
							pixels_s[i*sw+j-a]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[i*sw+j-1]==0xffe73701){
						if(pixels_s[i*sw+j+a]==0xff404040){
							pixels_s[i*sw+j+a]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i+1)*sw+j]==0xffe73701){
						if(pixels_s[(i-a)*sw+j]==0xff404040){
							pixels_s[(i-a)*sw+j]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i-1)*sw+j]==0xffe73701){
						if(pixels_s[(i+a)*sw+j]==0xff404040){
							pixels_s[(i+a)*sw+j]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i-1)*sw+j-1]==0xffe73701){
						if(pixels_s[(i+a)*sw+j+a]==0xff404040){
							pixels_s[(i+a)*sw+j+a]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i+1)*sw+j+1]==0xffe73701){
						if(pixels_s[(i-a)*sw+j-a]==0xff404040){
							pixels_s[(i-a)*sw+j-a]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i-1)*sw+j+1]==0xffe73701){
						if(pixels_s[(i+a)*sw+j-a]==0xff404040){
							pixels_s[(i+a)*sw+j-a]=rgb;
						}
					}
					if(org_s[i*sw+j]==0xff404040&&org_s[(i+1)*sw+j-1]==0xffe73701){
						if(pixels_s[(i-a)*sw+j+a]==0xff404040){
							pixels_s[(i-a)*sw+j+a]=rgb;
						}
					}
				}
			}
		}
	}
	public void kemuri_moto(){
		if(count==20){
			k++;
			if(k>=20){k=0;}			
			count=0;
			vx[k]=(int)(Math.random()*120+40);
			vy[k]=(int)(Math.random()*40+80);
			radias[k]=0;
		}
		count++;
	}
	public void kemuri(){
		for(int i=0;i<kw*kh;i++){pixels_k[i]=0;}
		for(int i=0;i<20;i++){
			if(radias[i]!=-1){
				alf[i]=alf[i]-2;//楕円のalfa値を徐々に上げ透明度を増す
				if(alf[i]<=0){alf[i]=0;}
				radias[i]++;//楕円のサイズを徐々に大きくする
				//楕円を塗りつぶす
				for(int a=radias[i];a>0;a--){
					for(int b=0;b<360;b++){
						int x=(int)(vx[i]+(a*Math.cos(Math.toRadians(b))));
						int y=(int)(vy[i]+((a*0.6)*Math.sin(Math.toRadians(b))));
						pixels_k[y*kw+x]=0x00e0e0e0|(alf[i]<<24);

						//下のようなコードで行いたいのですが、変な表示になってしまいます。なので、とりあえず、上のコードにしています。

						//pixels_k[y*kw+x]=alf[i]+(pixels_k[y*kw+x]>>>24);
						//if(pixels_k[y*kw+x]>=255){pixels_k[y*kw+x]=255;}
						//pixels_k[y*kw+x]=0x00e0e0e0|(pixels_k[y*kw+x]<<24);
					}
				}
				//楕円の外側を徐々に透明度をつけてぼかす
				for(int a=radias[i]+1;a<=radias[i]+10;a++){
					for(int b=0;b<360;b++){
						int x=(int)(vx[i]+(a*Math.cos(Math.toRadians(b))));
						int y=(int)(vy[i]+((a*0.6)*Math.sin(Math.toRadians(b))));
						
						pixels_k[y*kw+x]=0x00e0e0e0|((int)(alf[i]-(alf[i]/10*(a-radias[i])))<<24);

						//下のようなコードで行いたいのですが、変な表示になってしまいます。なので、とりあえず、上のコードにしています。

						//pixels_k[y*kw+x]=(int)(alf[i]-(alf[i]/10*(a-radias[i])))+(pixels_k[y*kw+x]>>>24);
						//if(pixels_k[y*kw+x]>=255){pixels_k[y*kw+x]=255;}
						//pixels_k[y*kw+x]=0x00e0e0e0|(pixels_k[y*kw+x]<<24);
					}
				}
			}
		}
	}
	public void run(){
		Thread thisThread=Thread.currentThread();
		while(thisThread==th){
			moeru();
			mis1.newPixels();
			mis2.newPixels();
			kemuri_moto();
			kemuri();
			mis3.newPixels();
			repaint();
			try{
				th.sleep(50);
			}catch(InterruptedException e){}
		}
	}
	public void update(Graphics g){
		paint(g);
	}
	public void paint(Graphics g){
		og=offs.getGraphics();
		if(og!=null){
			try{
				og.drawImage(new_hitirinn_sumi,0,0,this);
				og.drawImage(new_sumi,16,17,this);
				og.drawImage(ami,-5,0,this);
				og.drawImage(saba,37,77,this);
				og.drawImage(kemuri,0,0,this);
				g.drawImage(offs,0,0,this);
			}catch(Exception e){}
			finally{
				og.dispose();
			}
		}
	}
}

1

スキルアップ/キャリアアップ(JOB@IT)