top > Programing2 Report6



課題内容
  1. Java Applet/AWTについて学習し、Java Appletのオリジナルプログラムを作成し解説せよ



目次
  1. Star.java
  2. Star2.java
  3. 実行結果
  4. 考察とまとめ
  5. 参考文献・参考Webページ



    オリジナルプログラム
  1. Star.java
    import java.applet.Applet;
    import java.awt.*;
    
    //星がきらめいているようなアニメーションをさせるクラス
    public class Star{
      private Color col1;  //指定された色
      private Color col2;  //白色
      private int   an[];  //アニメーションの順序
      
      public Star(int cr,int cg,int cb){
        col1 = new Color(cr,cg,cb);        //指定された色に設定
        col2 = Color.white;                     //白色
        an   = new int[6];                       //アニメーションの順序
        for(int i = 0 ; i < 6 ; i++){
          an[i] = i;
        }
      }
      public void star0(Graphics g,int x,int y){ //1段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x     ,y     ,x     ,y    );
      }
      public void star1(Graphics g,int x,int y){ //2段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x - 1 ,y     ,x - 1 ,y    );
        g.drawLine(x + 1 ,y     ,x + 1 ,y    );
        g.drawLine(x     ,y - 1 ,x     ,y - 1);
        g.drawLine(x     ,y + 1 ,x     ,y + 1);
        g.setColor(col2);
        g.drawLine(x     ,y     ,x     ,y    );
      }
      public void star2(Graphics g,int x,int y){ //3段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x - 2 ,y     ,x - 2 ,y    );
        g.drawLine(x + 2 ,y     ,x + 2 ,y    );
        g.drawLine(x     ,y - 2 ,x     ,y - 2);
        g.drawLine(x     ,y + 2 ,x     ,y + 2);
        g.setColor(col2);
        g.drawLine(x - 1 ,y     ,x + 1 ,y    );
        g.drawLine(x     ,y - 1 ,x     ,y + 1);
      }
      public void star3(Graphics g,int x,int y){ //4段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x - 3 ,y     ,x - 2 ,y    );
        g.drawLine(x + 2 ,y     ,x + 3 ,y    );
        g.drawLine(x     ,y - 3 ,x     ,y - 2);
        g.drawLine(x     ,y + 2 ,x     ,y + 3);
        g.setColor(col2);
        g.drawLine(x - 1 ,y     ,x + 1 ,y    );
        g.drawLine(x     ,y - 1 ,x     ,y + 1);
      }
      public void star4(Graphics g,int x,int y){ //5段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x - 5 ,y     ,x - 3 ,y    );
        g.drawLine(x + 3 ,y     ,x + 5 ,y    );
        g.drawLine(x     ,y - 5 ,x     ,y - 3);
        g.drawLine(x     ,y + 3 ,x     ,y + 5);
        g.setColor(col2);
        g.drawLine(x - 1 ,y - 1 ,x - 1 ,y - 1);
        g.drawLine(x + 1 ,y + 1 ,x + 1 ,y + 1);
        g.drawLine(x + 1 ,y - 1 ,x + 1 ,y - 1);
        g.drawLine(x - 1 ,y + 1 ,x - 1 ,y + 1);
        g.drawLine(x - 2 ,y     ,x + 2 ,y    );
        g.drawLine(x     ,y - 2 ,x     ,y + 2);
      }
      public void star5(Graphics g,int x,int y){ //6段目の星をx,yを中心に書く
        g.setColor(col1);
        g.drawLine(x - 8 ,y     ,x - 5 ,y    );
        g.drawLine(x + 5 ,y     ,x + 8 ,y    );
        g.drawLine(x     ,y - 8 ,x     ,y - 5);
        g.drawLine(x     ,y + 5 ,x     ,y + 8);
        g.setColor(col2);
        g.drawLine(x - 2 ,y - 2 ,x - 1 ,y - 1);
        g.drawLine(x + 1 ,y + 1 ,x + 2 ,y + 2);
        g.drawLine(x + 1 ,y - 1 ,x + 2 ,y - 2);
        g.drawLine(x - 2 ,y + 2 ,x - 1 ,y + 1);
        g.drawLine(x - 4 ,y     ,x + 4 ,y    );
        g.drawLine(x     ,y - 4 ,x     ,y + 4);
      }
      //(x,y)を中心としてn番目の絵を描写
      public void starnum(Graphics g,int n,int x,int y){
        switch(n){
          case 0:
          star0(g,x,y);
          break;
          case 1:
          star1(g,x,y);
          break;
          case 2:
          star2(g,x,y);
          break;
          case 3:
          star3(g,x,y);
          break;
          case 4:
          star4(g,x,y);
          break;
          case 5:
          star5(g,x,y);
          break;
        }
      }
      public void twinkle(Graphics g,int n,int x,int y){
        if(n >= an.length) n = an.length - 1;
        else if(n < 0)     n = 0;
        starnum(g,an[n],x,y);
      }
      public void setAnimation(int a[]){//アニメーションの順序を指定
        an = a;
      }
      public int getFrameNum(){         //アニメーションのフレーム数を返す
        return an.length;
      }
    }
    

  2. Star2.java
    import java.applet.Applet;
    import java.awt.*;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.MouseEvent;
    
    public class Star2 extends Applet
                       implements Runnable, MouseMotionListener{
      public  Image     img;          //ダブルバッファリング用イメージ
      public  Graphics  gr;           //バッファ上のイメージのGC
      public  Star      star[];       //星
      public  int       width;        //画面の横幅
      public  int       height;       //画面の縦幅
      public  final int anum = 14;
      public  Point     mp;
      public  int       ssize;        //星の初期位置の直径
      public  int       svel;         //星が散らばる速度
      public  int       dvel;         //速度割合
      public  int       p[];          //アニメーションのフェーズ
      public  Point     r[][];        //ランダムな座標
      public  Point     v[][];        //ランダムな速度
      private boolean   RUN;          //スレッドのループを制御する
      
      public void init(){
      //Appletがシステムに読み込まれたタイミングで呼ばれる。
      //startメゾットが呼ばれる前に必ずよばれる、
      //スレッド等を用いる場合は、ここで生成し、destroyで破棄
      int    st1,st2;
        try{                   //HTMLからパラメータ取得
          ssize = Integer.parseInt(getParameter("s_size"));
          if(ssize < 1)ssize = 1;
        }
        catch(Exception e){
        //HTMLからパラメータが取得できなかった場合に
        //ssizeを指定する。
            ssize = 20;
        }
        try{                   //HTMLからパラメータ取得
          svel = Integer.parseInt(getParameter("s_vel"));
          if(svel < 0)svel = 0;
        }
        catch(Exception e){
        //HTMLからパラメータが取得できなかった場合に
        //svelを指定する。
          svel = 4;
        }
        dvel = (svel<<4)/(ssize/2);      //速度/出現範囲 の2^4倍
        addMouseMotionListener(this);    //マウスモーションリスナーを追加
        Dimension size = getSize();      //画面サイズ取得
        width          = size.width;         //画面の幅を取得
        height         = size.height;        //画面の高さ取得
        mp             = new Point(width/2,height/2);  //最初の星の出現場所を真ん中に指定
        star           = new Star [6];               //キラキラ光る星を6種類設定する
        star[0]        = new Star(255,0,0);   //赤
        star[1]        = new Star(0,255,0);   //緑
        star[2]        = new Star(0,0,255);   //青
        star[3]        = new Star(255,255,0); //黄
        star[4]        = new Star(0,255,255); //青緑
        star[5]        = new Star(255,0,255); //紫
        for(int i=0;i<6;i++){
          star[i].setAnimation(new int[] {1,2,3,5,4,3,2,2,1,1,1,0,0,0});
        }
        p              = new int   [anum];     //アニメーションのフェーズ
        r              = new Point [anum][6];  //ランダムな座標
        v              = new Point [anum][6];  //ランダムな速度
        for(int i=0;i>4;
            v[i][j].y = (st2*dvel)>>4;
          }
        }
        setBackground(Color.black);     //バックグラウンドを黒に
        img = createImage(width,height);//バッファイメージを作成
        gr  = img.getGraphics();        //バッファに対するGCを取得
      }
      public void start(){
      //Applet表示の最初に呼ばれ、
      //アニメーションの開始などの処理をする
        RUN = true;
        Thread th = new Thread(this);
        th.start();                     //無限ループスレッドを起動
      }
      public void stop(){
      //非表示になる直前、又はAppletが破棄される直前に呼び出され、
      //アニメーションの終了などの処理をする
        RUN = false;                    //無限ループの終了
      }
      public void paint(Graphics g){
      //描写する必要がある時に呼ばれる。
      //引数gはアプレット表示領域のグラフィックコンテキストで、
      //このクラスを使って表示部分を実装する
      //このメゾットはオーバーライトする場合、
      //内部でsuper.paint(g)を呼ぶのが正しいスタイルだが、
      //しなくてもたいてい上手く動く
        g.drawImage(img,0,0,this);
      }
    //イメージを描写するときバックグラウンドカラーでのクリアによる
    //ちらつきを押さえるためにオーバーライド
      public void update(Graphics g){
        paint(g);
      }
    //マルチスレッドで起動される無限ループ
      public void run(){
        int    i,j;
        int    st1,st2;
        while(RUN){
          gr.clearRect(0,0,width,height);
          for(i=0;ianum){        //フェーズが最後まできたら位置を変える
              p[i] = 0;
              for(j=0;j<6;j++){
                st1       = (int)((Math.random() - 0.5) * ssize);
                st2       = (int)((Math.random() - 0.5) * ssize);
                r[i][j].x = st1 + mp.x;
                r[i][j].y = st2 + mp.y;
                v[i][j].x = (st1*dvel)>>4;
                v[i][j].y = (st2*dvel)>>4;
              }
            }
          }
          repaint();
          try{
            Thread.sleep(33);//フレームレート指定用の待ち
            }
          catch(Exception e){
          }
        }
      }
      public void mouseDragged(MouseEvent e){
      //マウスがドラックされた時の動作を指定する
        mp = e.getPoint();  //星の出現位置をマウスのある場所に設定
      }
      public void mouseMoved  (MouseEvent e){
      //マウスが動いた時の動作を指定する
        mp = e.getPoint();  //星の出現位置をマウスのある場所に設定
      }
    }
    

  3. 実行結果

  4. 考察とまとめ
    動作の流れを簡単に説明すると、
    まず、Star.javaで星がきらきらとしているように見せる動作を設定する。
    で、Star2.javaでjavaアプレットとして星を動かす。
    MouseMotionLisnerでマウスのある位置をし、
    そこに、星を出現させ、あたかもマウスを追いかけているように見せている。
    
    ・・・どんなのにするか悩んで、これにしました。
    凝りはじめたら止まらなさそうですw
    
  5. 参考文献・参考サイト








Copyright since-2006 j06008 All rights reserved.