//
/* ----------------------------------------------------------------------------------------------
scan.java ディスプレイ(走査) ver. 1.00 (JDK 1.02)
ueyama@infonet.co.jp 1998.09.09
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
public class scan extends Applet implements Runnable
{
int Bd=9; // ビーム直径
int Bx=0,By=0; // ビーム座標
int Wait=32; // 待ち時間 (msec)
int i;
int pixels[]=new int[320*240];
boolean Frun=false;
Button bt_fine,bt_rough,bt_fast,bt_slow,bt_run;
Color Col[][]=new Color[2][4];
Image scan_a;
Graphics gl,gs;
Thread th=null;
public void start()
{
if(th==null)
{
th=new Thread(this);
th.start();
}
}
public void init()
{
int r,g,b;
r=Integer.parseInt(getParameter("bg_red"));
g=Integer.parseInt(getParameter("bg_green"));
b=Integer.parseInt(getParameter("bg_blue"));
setBackground(new Color(r,g,b));
gl=getGraphics();
gs=getGraphics();
MediaTracker mt=new MediaTracker(this);
scan_a=getImage(getCodeBase(),"scan_a.gif"); // 画像ファイルの読込
mt.addImage(scan_a, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
PixelGrabber pg=new PixelGrabber(scan_a,0,0,320,240,pixels,0,320); // 画像データの取得
try
{
pg.grabPixels();
}
catch (InterruptedException ie) {return;}
if((pg.status() & ImageObserver.ABORT) != 0) {return;}
for(i=0,r=255,g=255,b=255; i<4; i++,r/=2,g/=2,b/=2) Col[1][i]=new Color(r,g,b);
for(i=0,r=0,g=96,b=224; i<4; i++,g=g*2/3,b=b*2/3) Col[0][i]=new Color(r,g,b);
Panel p=new Panel();
p.add(bt_fine= new Button("FINE"));
p.add(bt_rough= new Button("ROUGH"));
p.add(bt_slow= new Button("SLOW"));
p.add(bt_fast= new Button("FAST"));
p.add(bt_run= new Button("RUN"));
setLayout(new BorderLayout());
add("South",p);
}
public void paint(Graphics g)
{
g.setColor(Color.black);
if(Frun) g.fillRect(0,0,320,240); // 背景:真っ黒
else g.drawImage(scan_a,0,0,320,240,this); // 背景:GIF画像 (A)
disp_line();
}
public void disp_spot() // ビームスポットの描画
{
gs.clipRect(0,0,320,240);
for(int i=3;i>=0;i--) // 表示色を変えて残像の雰囲気 (?)
{
gs.setColor(Col[pixels[By*320+Bx] & 1][i]);
gs.fillOval(Bx-3-i*Bd/2,By,Bd,Bd);
}
}
public void disp_line() // 走査線の表示
{
gl.setColor(Color.black);
gl.fillRect(0,242,320,21);
if(Frun)
{
for(int i=0;i<320;i+=Bd*5/10) // 画像データの表示
{
gl.setColor(Col[pixels[By*320+i] & 1][0]);
gl.fillRect(i-3,252-Bd/2,Bd,Bd);
}
}
}
public void run()
{
while(th!=null)
{
if(Frun)
{
if(Bx==0) disp_line();
disp_spot();
}
try
{
Thread.sleep(Wait);
}
catch (InterruptedException e){}
if(Frun)
{
gs.setColor(Color.black);
gs.fillRect(Bx-3-i*Bd/2,By,Bd*3,Bd); // スポットを消去する
Bx+=Bd*5/10;
if(Bx>=320)
{
Bx=0; By+=Bd;
}
if(By>=240)
{
Frun=false; Bx=0; By=0;
repaint();
th.suspend();
}
}
}
}
public boolean action(Event e, Object o)
{
if(e.target==bt_fine && Bd>3) Bd-=2;
else if(e.target==bt_rough && Bd<21) Bd+=2;
else if(e.target==bt_fast && Wait>4) Wait=Wait*3/4;
else if(e.target==bt_slow) Wait=Wait*4/3;
else if(e.target==bt_run)
{
Frun=true;
repaint();
th.resume();
}
if(Wait==4) bt_fast.disable(); // ボタンの制御
else bt_fast.enable();
if(Bd==3) bt_fine.disable();
else bt_fine.enable();
if(Bd==21) bt_rough.disable();
else bt_rough.enable();
return true;
}
public void stop()
{
if(th==null)
{
th.stop();
}
}
}
//戻る