ファイア〜



// ===================================================================
//	import
// ===================================================================
import java.applet.*;
import java.awt.*;
import java.util.*;
import java.awt.image.*;

// ===================================================================
//	draw
// ===================================================================
class KcFire {

	Image 				w_img;
	IndexColorModel		w_icm;
	MemoryImageSource	w_mi;
	
	int					w_width;
	int					w_hight;
	int					w_pixels[];
	
	int					COLOR_TABLE_SIZE = 256;


	public KcFire(Applet oya, int width, int hight) {
		w_width = width;
		w_hight = hight;
		
		
		// --------- color table
		byte r[] = new byte[COLOR_TABLE_SIZE];
		byte g[] = new byte[COLOR_TABLE_SIZE];
		byte b[] = new byte[COLOR_TABLE_SIZE];
		
		
	    for (int i=0; i<COLOR_TABLE_SIZE/4; i++) {
			r[i] = (byte) (i*4);
			g[i] = 0;
			b[i] = 0;

			r[i+32] = (byte) 255;
			g[i+32] = (byte) (i*4);
			b[i+32] = 0;

			r[i+64] = (byte) 255;
			g[i+64] = (byte) 255;
			b[i+64] = (byte) (i*4);

			r[i+96] = (byte) 255;
			g[i+96] = (byte) 255;
			b[i+96] = (byte) 255;			
			
	    }
				
		w_icm = new IndexColorModel(8 , COLOR_TABLE_SIZE , r , g , b);
	
		
		// --------- pixels
		w_pixels = new int[w_width*w_hight];
		
		for( int i = 0; i < w_width*w_hight; i ++ ) {
			w_pixels[i] = 0;
		}
		
		w_mi = new MemoryImageSource(w_width , w_hight , w_icm ,w_pixels , 0 , w_width);
		w_mi.setAnimated( true );
		w_img = oya.createImage(w_mi);

	}
	
	void drawFire() {
		int pix_num = (w_hight-1)*w_width;
		
		
		// --------- 火種
		for( int i = 0; i < w_width; i ++ ) {
			w_pixels[i+pix_num] = (int)(COLOR_TABLE_SIZE * Math.random());
		}
		
		
		// --------- ぼかし
		for( int i = w_width; i < (w_width * w_hight)-1; i ++ ) {
			w_pixels[i-w_width] = (w_pixels[i] +
									w_pixels[i-1] + 
									w_pixels[i+1] + 
									w_pixels[i-w_width])/4 ;
									
			if( w_pixels[i-w_width] > 0 ) {
				w_pixels[i-w_width] --;
			}
				
		}
	}
	
	
	public void paint() {	

		drawFire();

		// --------- ピクセルが変更されたでよ
		w_mi.newPixels();
  	}
	
	public Image getImage() {
		return	w_img;
	}
	
}

// ===================================================================
//	main
// ===================================================================
public class KcApp extends Applet implements Runnable {

	Thread 			w_thread = null;
	
	KcFire			w_draw;
	int				w_width;
	int				w_hight;
		

	// --------------------------------- アプレット起動時に実行
	public void init() {
	}

	// --------------------------------- アプレットがあるHTMLページに入ったときに実行
	public void start() {
		if (w_thread == null)
		{
			// スレッドの起動
			w_thread = new Thread(this);
			w_thread.start();
			
			Dimension dim = getSize();
			w_width = dim.width; //getWidth();
			w_hight = dim.height; //getHeight();
			w_draw = new KcFire( this, w_width, w_hight );
							
		}
	}

	// --------------------------------- アプレットがあるHTMLページから出たときに実行
	public void stop() {
		if (w_thread != null)
		{
			// スレッドの停止
			w_thread = null;
		}
	}
	
	// --------------------------------- アプレット終了時に実行
	public void destroy() {
	}

	// --------------------------------- 描画
	public void paint(Graphics g) {
      	
      	if( w_draw == null ) return;
        		
	    g.drawImage(w_draw.getImage() ,0,0,this);
	}

	// --------------------------------- 再描画
	public void update(Graphics g) {
		paint(g);
	}

	// --------------------------------- スレッドの実行
	public void run() {

        Thread thisThread = Thread.currentThread();

		while (w_thread == thisThread) {
			
			// 再描画
			repaint();
			
	     	if( w_draw != null ) {
	 	    	w_draw.paint();
	 		}
	        
 		
			try
			{
				// 0.01秒間の停止
				thisThread.sleep(10);
			}
			catch(Exception e) {
			}
			
			
		}
	}
}