Canvasの利用(2つのアニメーションを同時に動かす)


アニメーションを表示するJava Applet


ソースコード

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

public class ja30a extends Applet
{
  ja30aMyC myc1,myc2;					//Canvasを2つ作る
  Image pic[] = new Image[6];				//アニメーション用画像の配列

  public void init(){
	setBackground(Color.white);			//Appletの背景色を白色に設定
	for(int i = 0;i < 6;i++){			//6枚のgifファイルを読み込む
	  pic[i] = getImage(getCodeBase(),"Sy" + i + ".gif");
	}

	myc1 = new ja30aMyC(pic,Color.black);	 //ja30aMyCのコンストラクタを呼び出し,Canvasを生成
	myc2 = new ja30aMyC(pic,Color.yellow);
	add(myc1);					//CanvasをAppletに配置
	add(myc2);
  }

  public void stop(){			//Appletが非表示になると,同時にスレッドも停止する
	myc1.stop();
	myc2.stop();
  }

  public void start(){			//Appletが再表示されると,スレッドも再開する
	myc1.start();
	myc2.start();
  }

  public void paint(Graphics g){
	g.setFont(new Font("TimesRoman",Font.ITALIC,18));
	g.drawString("2つのCanvas内をクリックすれば,",10,125);
	g.drawString("アニメーションの停止/再開を切り替えできる。",10,145);
  }
}

class ja30aMyC extends Canvas implements Runnable	//Canvasのサブクラスを定義
{
  Image pic[];
  Thread ani = null;				//スレッドオブジェクト
  int n = 0;					//配列画像の番号
  boolean flag = true;				//スレッドの動作状態を識別するフラグ

  public ja30aMyC(Image picA[],Color c){	//コンストラクタの定義
	resize(100,100);			//Canvasのサイズを設定
	setBackground(c);			//Canvasの背景色を設定
	pic = picA;
  }

  public void start(){
    if(ani == null){
	ani = new Thread(this);
	ani.start();				//run()メソッドを呼び出す
    }
  }

  public void run(){
    while(true){				//無限ループを繰り返す
	if(n > 5) n = 0;			//配列画像の番号が6になると,0にリセット
		repaint();			//paint()メソッドを呼び出す
		try{
		  Thread.sleep(1000);		//1秒だけスレッドを停止する。
		}catch (InterruptedException e){
		}
	n++;					//配列画像の番号を1増やす
    }
  }

  public void paint(Graphics g){
	g.drawImage(pic[n],30,20,this);	   	//画像の描画
  }

  public void stop(){
    if(ani != null){
	ani.stop();
	ani = null;
    }
  }

  public boolean mouseDown(Event evt,int x,int y){
    if(flag)
	ani.suspend();			//スレッドを一時停止
    else
	ani.resume();			//スレッドを再開する
    flag = !flag;			//flagのboolean値(true/false)を反転する
    return true;
  } 
}

末尾