跳ね返るようにする

dxの値の正負で動く向きが変わる

2つの変更をします。

1.一つ前の円を消して軌跡を残さない

2.右端までいったら左へ進むようにし、左端へいったら右へ進むようにする

moveDisk

MoveDisk2.javaをもとに、スレッドを使う MoveDisk の部分だけ変わります。

ファイル名 AnimeDisk3.java の一部

class MoveDisk extends Thread {
    int x;
    int y;
    int d, dx;
    int xmax, ymax;
    Graphics2D thg;
    MyPanel mypnl; 
    BufferedImage buffimg;

    public MoveDisk(MyPanel mypnl) {
        this.mypnl = mypnl;
        this.buffimg = mypnl.buffimg;
        thg  = buffimg.createGraphics();
        thg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                 RenderingHints.VALUE_ANTIALIAS_ON);
        xmax = buffimg.getWidth();
        ymax = buffimg.getHeight();
        x = xmax/4;  //100
        y = (int)(ymax*Math.random());
        d = xmax/40;  //円の大きさ 10
        dx = xmax/40; //動きの大きさ 10
    }
    @Override
    public void run() {
        //thg.setColor(Color.red);
        while ( true ){
            thg.setColor(mypnl.bgcolor);
            thg.fillOval(x-d/2,y-d/2,d,d);
            x+=dx;
            if (x >xmax){
                x  = 2*xmax-x;
                dx = -dx;
            }
            if (0 > x){
                x  = -x;
                dx = -dx;
            }
            thg.setColor(Color.red);
            thg.fillOval(x-d/2,y-d/2,d,d);
            mypnl.repaint();
            //100ms(0.1秒)停止
            try {
                Thread.sleep(100);
            }
            catch(InterruptedException ex) {
                System.err.println(ex);
            }
        }
    }
} //end of MoveDisk

強調部分が主要な変更です。

次の円を描くまえにそれを背景色で塗りつぶしてから x を dx だけ増やして新しく円を描きます。

RenderingHintで境界をぼかしているため、完全に消えずに残ってしまっていますが、消して描いているという説明には好都合なのでそのままにしています。

moveDisk

画面から出てしまうような x になったら、dx の正負を変えています。これが跳ね返ったということになります。

moveDisk

やはり複数の●を動かせますし、green, blue の残りのボタンも生きています。

moveDisk

課題

1.

左右で跳ね返ることを確認しなさい。

ファイル名 AnimeDisk3.java

2.

消した後を残さないようにするにはどうすればいいでしょうか。改良してみましょう。

ファイル名 AnimeDisk3.java


Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Oct.2010
Oct.2012