//
/* ----------------------------------------------------------------------------------------------
    stars.java		GIFアニメ							ver. 1.10 (JDK 1.02)
    														ueyama@infonet.co.jp  2002.02.25
    														update: 2009.11.12
---------------------------------------------------------------------------------------------- */

import java.applet.*;
import java.awt.*;
import java.util.*;


public class stars extends Applet implements Runnable
{
	int			Xs=304, Ys=170;											// スクロールバー表示位置
	int			Xb=378, Yb=193;											// Run/Stop ボタン表示位置
	int			Fn=0;													// フレーム No.
	int			Wt[]={200,100,100,300,100,100,100,100,100,100,100,100,700,100,100,100};	// 表示時間
	boolean		Run=false;
	Image		Img;
	Thread		th=null;
	Graphics	gr;
	
	public void init()
	{
		String	Bg=getParameter("bgcolor");
		int bgc=Integer.valueOf(Bg,16).intValue();
		setBackground(new Color(bgc)); 
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	public boolean inside(int x, int a, int b)
	{
		return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_img(int x, int y, int m, int n, int c)				// 画像の表示
	{
		int			w=0, h=0, ox=0, oy=0;
		Graphics	gx=gr.create();
		switch(c)
		{
			case 0: w=48; h=59; ox=  0; oy= 0; break;					// 踊る人
			case 1: w=48; h= 9; ox=  0; oy=59; break;					// フレーム No.
			case 2: w=16; h=15; ox=820; oy= 0; break;					// <| & |>
			case 3: w=16; h=13; ox=820; oy=30; break;					// スクロールバーつまみ
			case 4: w=26; h=23; ox=768; oy= 0; break;					// Run/Stop
		}
		gx.clipRect(x,y,w,h);
		if(c==1) gx.clearRect(x, y, w, h);
		gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
		gx.dispose();
	}

	public void dsp_anm()												// アニメ画像表示
	{
		gr.setColor(new Color(0xe5e5de));								// スクロールバーの色
		gr.fillRect(Xs+20, Ys+1, 136, 13);								// スクロールバーの表示
		dsp_img(367, 102, Fn, 0, 0);									// 踊る人の表示
		dsp_img(Xs+20+Fn*8, Ys+1, 0, 0, 3);								// スクロールバーつまみの表示
		dsp_img(415, 152, Fn, 0, 1);									// フレーム No. の表示
	}
	
	public void paint(Graphics g)
	{
		int i;
		for(i=0;i<16;i++)
		{
			dsp_img(i*49,  0, i, 0, 0);									// 踊る人の表示
			dsp_img(i*49, 61, i, 0, 1);									// フレーム No. の表示
		}
		dsp_img(Xs, Ys, (Fn>0)?0:2, 1, 2);								// <| ボタンの表示
		dsp_img(Xs+160, Ys, (Fn<15)?0:2, 0, 2);							// |> ボタンの表示
		dsp_img(Xb, Yb, 0, (Run)?1:0, 4);								// Run/Stop ボタンの表示
		dsp_anm();														// アニメ画像表示
	}
	
	public void run()
	{
		while(th!=null)
		{
			if(Run) dsp_anm();											// 画像の表示
			try
			{
				th.sleep((Run)?Wt[Fn]:256);
			}
			catch (InterruptedException e){}
			if(Run) { Fn++; Fn%=16; }
		}
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
	
	public boolean mouseDrag(Event e, int mx, int my)					// スクロールバーの操作
	{
		if(inside(my, Ys-10, Ys+25) && inside(mx, Xs+28, Xs+148))
		{
				Fn=(mx-(Xs+28))/8;										// フレーム No.
				dsp_img(Xs, Ys, (Fn>0)?0:2, 1, 2);						// <| ボタンの表示
				dsp_img(Xs+160, Ys, (Fn<15)?0:2, 0, 2);					// |> ボタンの表示
				dsp_anm();												// アニメ画像の表示
		}
		return true;
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		if(inside(my, Ys, Ys+15) && inside(mx, Xs, Xs+176))			// <| or |> ボタンをクリック
		{
			if(inside(mx, Xs, Xs+16) && Fn>0)						// <| ボタンをクリック
			{
				Fn--;
				dsp_img(Xs, Ys, 1, 1, 2);							// <| ボタンの表示
			}
			if(inside(mx, Xs+160, Xs+176) && Fn<15)					// |> ボタンをクリック
			{
				Fn++;
				dsp_img(Xs+160, Ys, 1, 0, 2);						// |> ボタンの表示
			}
			dsp_anm();												// アニメ画像の表示
		}
		if(inside(mx, Xb, Xb+26) && inside(my, Yb, Yb+23))			// Run/Stop ボタンをクリック
		{
			dsp_img(Xb, Yb, 1, (Run)?1:0, 4);						// Run/Stop ボタンの表示
			Run=!Run;
		}
		return true;
	}
	
	public boolean mouseUp(Event e, int mx, int my)
	{
		if(inside(my, Ys, Ys+15) && (inside(mx, Xs, Xs+16) || inside(mx, Xs+160, Xs+184)))	// <| or |> ボタン
		{
			dsp_img(Xs, Ys, (Fn>0)?0:2, 1, 2);						// <| ボタンの表示
			dsp_img(Xs+160, Ys, (Fn<15)?0:2, 0, 2);					// |> ボタンの表示
		}
		if(inside(mx, Xb, Xb+26) && inside(my, Yb, Yb+23))			// Run/Stop ボタン
		{
			dsp_img(Xb, Yb, 0, (Run)?1:0, 4);						// Run/Stop ボタンの表示
			if(!Run) dsp_anm();
		}
		return true;
	}
}
//
戻る