縦方向に跳ね返るようにする

xと同じことをyにも

xと同じことをyにもしてやればいいわけです。あとで横と縦を入れ替えることを予定しているので、xの記述は残してdx=0としておいて横には動かないようにします。

moveDisk

主な変更点

lx同様lyを設けて前の位置を覚えておくこと

dx同様dyを設けて縦に動かすこと。dxは0にしておく。

横に動かすときは動かす高さをランダムに決めたが、縦に動かすときは横位置をランダムに決めた方がよい。

前の位置の●を消すのにはlxの他にlyも使う

上下で跳ね返るようにする。

MoveDisk3.javaをもとに、moveDisk というクラスの部分だけ変わります。

ファイル名 MoveDisk5.java の一部

    //円を動かすクラス
    class moveDisk extends Thread{
        MyPanel pnl;
        BufferedImage image;
        int x ;
        int y ;
        int lx =0;
        int ly =0;
        int d = 10;
        int dx = 0;
        int dy = 10;
        
        //constructor
        public moveDisk(MyPanel pn, BufferedImage im) {
            this.pnl   = pn;
            this.image = im;
            //y = (int)(image.getHeight()*Math.random());
            y = 100;
            x = (int)(image.getWidth()*Math.random());
        }
        
        @Override
        public void run() {
           Graphics thg = image.createGraphics();
           Color bc= new Color(255,255,191);  //背景の色
           thg.setColor(Color.red);
           thg.drawString(getName(),x,y);
           while ( true  ){
                thg.setColor(bc);
                thg.fillOval(lx-d/2,ly-d/2,d,d);
                thg.setColor(Color.red);
                thg.fillOval(x-d/2,y-d/2,d,d);            
                pnl.repaint();
                lx = x;
                ly = y;
                x += dx;
                y += dy;
                if (x >image.getWidth()){
                    x  = 2*image.getWidth()-x;
                    dx = -dx;
                }
                if (0 > x){
                    x  = -x;
                    dx = -dx;
                } 
                if (x >image.getWidth()){//現在はxのコピー。ここを変える
                    x  = 2*image.getWidth()-x;   *
                    dx = -dx;                    *
                }                       *
                if (0 > x){                      *
                    x  = -x;                     *
                    dx = -dx;                    *ここまで
                }
                //100ms(0.1秒)停止
                try {
                   Thread.sleep(100);
                }
                catch(InterruptedException ex) {
                   System.err.println(ex);
                }
            }//end of while
        }//end of run
    }//end of class moveDisk

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

縦に動くこと以外はMoveDisk3と同じです。

moveDisk

課題

1.

縦に動くことを確認しなさい。

ファイル名 MoveDisk5.java

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified