/*********************************/ /* */ /* 色の指定とダブルバッファ */ /* */ /* 1997/ 4/ 1 宍戸 輝光 */ /* */ /*********************************/ import java.awt.*; import java.util.Random; public class cldemo extends java.applet.Applet implements Runnable { Image screen,buf; Graphics g_screen,g_buf; Panel bg_panel,ball_panel; Label bg_c,ball_c; Choice bg_color,ball_color; Thread runner; Random rnd=new Random(); int i,j,r,g,b,br,bg,bb,x,y,dx,dy,c,wait,dc; boolean bp; public void init(){ setBackground(Color.black); setFont(new Font("TimesRoman",Font.PLAIN,12)); r=2; /* 背景色スケール初期値 */ g=0; b=0; br=0; /* ボール色スケール初期値 */ bg=0; bb=1; c=128; /* ボール色明度初期値 */ dc=1; x=64; /* ボール座標初期値 */ y=64; dy=4; wait=30; /* ボール表示関係初期値 */ bp=true; screenInit(); /* 画面作成 */ bg_color.select(0); /* 背景・ボール色選択メニュー初期化 */ ball_color.select(2); repaint(); runner=new Thread(this); /*スレッド生成*/ runner.start(); } public void stop() { /*終了時にスレッド破棄*/ runner.stop(); runner=null; } public void run() { Color cl; while (true) { /* メインループ */ g_screen.drawImage(buf,1,1,this); if (bp) { /* ボール表示 */ if (c<=1) dc=1; else if (c>=254) dc=-1; c+=dc; /* ボールの色変更 */ dx=(int)(rnd.nextDouble()*9)-4; x+=dx; /* ボールの座標更新 */ y+=dy; if (x<4) x=2; if (y<4) { y=2; dy=4; } if (x>222) x=222; if (y>220) { y=220; dy=-3; } cl=new Color(br*c,bg*c,bb*c); g_screen.setColor(cl); g_screen.fillOval(x+1,y+1,32,32); } repaint(); try { Thread.sleep(wait); } /*ウエイト*/ catch (InterruptedException e) {} } } public void screenInit() { /*画面作成*/ screen=createImage(258,258); /* 表示用イメージ */ g_screen=screen.getGraphics(); buf=createImage(256,256); /* 背景用イメージ */ g_buf=buf.getGraphics(); g_screen.setColor(Color.white); g_screen.drawRect(0,0,257,257); bg_panel=new Panel(); ball_panel=new Panel(); bg_c=new Label("BG"); ball_c=new Label("Ball"); bg_color=new Choice(); ball_color=new Choice(); bg_color.setBackground(Color.white); ball_color.setBackground(Color.white); bg_color.addItem("Red"); bg_color.addItem("Green"); bg_color.addItem("Blue"); bg_color.addItem("Magenta"); bg_color.addItem("Gray"); ball_color.addItem("Red"); ball_color.addItem("Green"); ball_color.addItem("Blue"); ball_color.addItem("Magenta"); ball_color.addItem("Gray"); ball_color.addItem("Off"); this.setLayout((LayoutManager)null); add(bg_panel); bg_panel.reshape(272,128,96,64); bg_panel.setBackground(Color.cyan); add(ball_panel); ball_panel.reshape(272,200,96,64); ball_panel.setBackground(Color.cyan); bg_panel.add(bg_c); bg_panel.add(bg_color); ball_panel.add(ball_c); ball_panel.add(ball_color); drawBG(); } public void drawBG() { /* 背景を描く */ Color cl; for (i=0;i<128;i++) { /* グラテーション作成 */ cl=new Color(r*i,g*i,b*i); /* 色設定 */ g_buf.setColor(cl); g_buf.fillRect(0,i,256,1); /* 上から中央へ */ g_buf.fillRect(0,255-i,256,1); /* 下から中央へ */ } } public boolean action(Event evt,Object what) { if (evt.target==bg_color) { /* 背景色スケール */ r=0; g=0; b=0; switch (bg_color.getSelectedIndex()) { case 0: r=2; break; case 1: g=2; break; case 2: b=2; break; case 3: r=2; b=2; break; case 4: r=2; g=2; b=2; break; } drawBG(); return true; } if (evt.target==ball_color) { /* 背景色スケール */ br=0; bg=0; bb=0; bp=false; switch (ball_color.getSelectedIndex()) { case 0: br=1; bp=true; break; case 1: bg=1; bp=true; break; case 2: bb=1; bp=true; break; case 3: br=1; bb=1; bp=true; break; case 4: br=1; bg=1; bb=1; bp=true; break; case 5: bp=false; break; } return true; } return false; } public void paint(Graphics g){ g.drawImage(screen,7,7,this); } public void update(Graphics g){ paint(g); } }