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();
}
}
}
}
|