//
/* ----------------------------------------------------------------------------------------------
    adder_r.java	半加算器 (リレー)						ver. 2.10 (JDK 1.02)
    														ueyama@infonet.co.jp  2003.10.27
    														update: 2007.10.18
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;


public class adder_r extends Applet
{
	int			A=0, B=0, S=0, C=0;  	 								// 入出力値
	int			Tt[][]={{0,0,0,0},{0,1,0,1},{1,0,0,1},{1,1,1,0}};		// 真理値表
	int			Ax[]={22, 22, 22, 22, 33, 33, 34, 33,163};				// スイッチ・文字の表示 X座標 (for A)
	int			Ay[]={20,132,192,237,115,168,164,220, 29};				// スイッチ・文字の表示 Y座標
	int			At[]={0,1,2,1,4,4,5,4,4};								// 表示パーツ
	int			Bx[]={80, 80, 80, 80, 91, 92, 91, 91,163};				// スイッチ・文字の表示 X座標 (for B)
	int			By[]={73,139,185,237,115,111,168,220, 82};				// スイッチ・文字の表示 Y座標
	int			Bt[]={0,2,1,1,4,5,4,4,4};								// 表示パーツ
	int			Xt[]={315,339,372,396};									// 真理値表 数値表示 X座標
	Image		Img;
	
	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){};
	}
	
	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_g(int x, int y, int m, int n, int c)				// gif 画像の部分表示
	{
		int w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w= 31; h=21; ox=420; oy=  0; break;				// 押しボタンスイッチ の表示
			case	 1:	w= 31; h=16; ox=420; oy= 21; break;				// a接点 の表示
			case	 2:	w= 31; h=16; ox=420; oy= 37; break;				// b接点 の表示
			case	 3:	w= 25; h=25; ox=420; oy= 53; break;				// 電球 の表示
			case	 4:	w= 12; h=14; ox=420; oy= 78; break;				// A の表示
			case	 5:	w=  9; h= 2; ox=420; oy=106; break;				//  ̄ の表示
			case	 6:	w= 12; h=16; ox=420; oy=110; break;				// 数字 の表示
		}
		Graphics gx=getGraphics();
		gx.clipRect(x,y,w,h);
		gx.clearRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
		gx.dispose();
	}
	
	public void dsp_p()													// 画面の表示
	{
		int i,j;
		for(i=0;i<9;i++) dsp_g(Ax[i],Ay[i],A,0,At[i]);					// 接点と文字 A の表示
		for(i=0;i<9;i++) dsp_g(Bx[i],By[i],B,(i<4)?0:1,Bt[i]);			// 接点と文字 B の表示
		dsp_g(156,157,S,0,3);											// 電球 S
		dsp_g(156,236,C,0,3);											// 電球 C
		for(i=0;i<4;i++) for(j=0;j<4;j++) dsp_g(Xt[j],131+i*25,Tt[i][j],(i==A*2+B)?1:0,6);	// 真理値表
	}

	public void paint(Graphics g)
	{
		int i;
		g.clearRect(0,0,size().width,size().height);
		g.drawImage(Img,0,0,this);
		dsp_p();
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int	m;
		if(inside(x,14,64) && inside(y, 2, 50)) A=(A==0)?1:0;			// スイッチ A をクリック
		if(inside(x,70,120) && inside(y,54,103)) B=(B==0)?1:0;			// スイッチ B をクリック
		if(x>Xt[0]-10 && inside(y,127,227))								// 真理値表をクリック
		{
			m=(y-127)/25;
			A=m/2; B=m%2;
		}
		S=Tt[A*2+B][3];
		C=Tt[A*2+B][2];
		dsp_p();
		return true;
	}
}
//
戻る