//
/* ----------------------------------------------------------------------------------------------
counter.java カウンタ ver. 1.01 (JDK 1.02)
ueyama@infonet.co.jp 2000.03.11
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class counter extends Applet implements Runnable
{
int Dec; // カウンタの値
int Wait=16, N=0;
boolean Run=false;
Image Img;
Graphics gr;
Thread th=null;
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("gif"));
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
gr=getGraphics();
Random rnd=new Random();
Dec=Math.abs(rnd.nextInt())%256; // カウンタ初期値(乱数)
}
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_p(int x, int y, int n, int c)
{
Graphics gx=gr.create();
int w=0, h=0, ox=0, oy=0;
switch(n)
{
case 0: w=177; h=30; ox= 0; oy= 0; break; // カウンタ
case 1: w= 15; h=22; ox=177; oy= 0; break; // 2進数 (0〜1)
case 2: w= 10; h=14; ox=207; oy= 0; break; // 10進数 (1〜9, =)
case 3: w= 47; h=11; ox=207; oy= 14; break; // "(10進数)"
case 4: w= 44; h=11; ox=254; oy= 14; break; // "(2進数)"
case 5: w= 26; h=23; ox= 0; oy= 30; break; // UP ボタン
case 6: w= 26; h=23; ox= 52; oy= 30; break; // DOWN ボタン
case 7: w= 26; h=23; ox=104; oy= 30; break; // RUN ボタン
case 8: w= 26; h=23; ox=156; oy= 30; break; // STOP ボタン
case 9: w= 26; h=23; ox=208; oy= 30; break; // FAST ボタン
case 10: w= 26; h=23; ox=286; oy= 30; break; // SLOW ボタン
case 11: w= 52; h=13; ox=298; oy= 14; break; // "カウンタ"
}
gx.clipRect(x,y,w,h);
gx.clearRect(x,y,w,h);
gx.drawImage(Img,x-(ox+c*w),y-oy,this);
gx.dispose();
}
public void dsp_s() // 数値の表示
{
int i,j,m,n=0,x=0;
for(j=128, i=0; i<8; i++,j/=2) // カウンタの値表示
{
m=((Dec & j)==0)?0:1;
dsp_p(42+22*i,24,1,m);
dsp_p(x+13*i,70,2,m);
}
x+=13*i;
dsp_p(x,73,4,0); // "(2進数)" の表示
dsp_p(x+49,70,2,10); // = の表示
m=Dec/100; dsp_p(x+64,70,2,(m>0)?m:11); if(m>0) n++; // 10進数表示
m=Dec/10; m%=10; dsp_p(x+77,70,2,(m+n>0)?m:11);
m=Dec%10; dsp_p(x+90,70,2,m);
dsp_p(x+103,73,3,0); // "(10進数)" の表示
}
public void paint(Graphics g)
{
g.clearRect(0,0,size().width,size().height);
dsp_p(101,0,11,0); // "カウンタ" の表示
dsp_p(38,20,0,0); // カウンタの表示
dsp_p( 54,100,6,0); // DEC ボタン
dsp_p( 84,100,5,0); // INC ボタン
dsp_p(114,100,10,0); // SLOW ボタン
dsp_p(144,100,9,(Wait==1)?2:0); // FAST ボタン
dsp_p(174,100,(Run)?8:7,0); // RUN ボタン
dsp_s();
}
public boolean mouseDown(Event e, int x, int y)
{
int i,m,n=99;
if(inside(y,20,50) && inside(x,38,215)) // カウンタ数値変更
{
m=7-(x-38)/22; n=1;
for(i=0; i< m; i++) n*=2;
if((Dec & n) ==0) Dec+=n;
else Dec-=n;
}
if(y>100 && inside(x,54,200))
{
if((x-54)%30<26) n=(x-54)/30;
switch(n)
{
case 0: dsp_p( 54,100,6,1); Dec+=255; Dec%=256; break;
case 1: dsp_p( 84,100,5,1); Dec++; Dec%=256; break;
case 2: dsp_p(114,100,10,1); Wait*=2; break;
case 3: if(Wait>1){dsp_p(144,100,9,1); Wait/=2;} break;
case 4: dsp_p(174,100,(Run)?8:7,1); Run=!Run; break;
}
}
dsp_s();
return true;
}
public boolean mouseUp(Event e, int x, int y)
{
int n=99;
if(y>100 && inside(x,54,200))
{
if((x-54)%30<26) n=(x-54)/30;
switch(n)
{
case 0: dsp_p( 54,100,6,0); break;
case 1: dsp_p( 84,100,5,0); break;
case 2: dsp_p(114,100,10,0); dsp_p(144,100,9,0); break;
case 3: dsp_p(144,100,9,(Wait==1)?2:0); break;
case 4: dsp_p(174,100,(Run)?8:7,0); break;
}
}
return true;
}
public void run()
{
while(true)
{
N++;
try
{
th.sleep(100);
}
catch (InterruptedException e){}
if(Run && N%Wait==0)
{
Dec++; Dec%=256;
dsp_s();
}
}
}
public void stop()
{
if(th!=null)
{
th.stop();
th=null;
}
}
}
//戻る