クリックで縦横が入れ替わるようにする

縦横の違い

縦に動いている場合、dx==0 で dy は0でない値を持っています。横に動いている場合、dy==0 で dx が0でない値を持っています。これを交換することで簡単に入れ替えることができます。

moveDisk

全部揃って横または縦

AnimeDisk5.javaをもとに変更していきます。

greenボタンをクリックしたら横に動くか縦に動くか入れ替わることにします。

ファイル名 AnimeDisk6.java の一部

(1)〜(3)の3箇所を変更します。

(1) MyPanelクラスのフィールドに istate (縦だよ)という変数を宣言し、初期値をtrueにします。

class MyPanel extends JPanel{
    BufferedImage buffimg;
    Graphics2D bfg;
    Color bgcolor= new Color(255,255,191);  //背景の色
    boolean istate = true;

(2) AnimeDisk6クラスのactionPerformed()の緑ボタンの内容を変更します。「!」はtrueとfalseを反転させるということです。

    //イベント処理
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == rbtn) {
            //mypnl.moveDisk();    //●を描くメソッド
            MoveDisk disk = new MoveDisk(mypnl);
            disk.start();
        }
        if (e.getSource() == gbtn) {
            //mypnl.drawToBuff('g');
            mypnl.istate = ! mypnl.istate;
        }
        if (e.getSource() == bbtn) {
            mypnl.drawToBuff('b');
        }
    }

(3) MoveDiskクラスのフィールドにも istate (縦だよ)という変数を宣言します。初期値をtrueにするのはx,yの初期値を決めているところで一緒にやります。dxを0にし、dyを0でなくすれば縦に動きます。その時にはtrueということです。

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

    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 = (int)(xmax*Math.random());
        y = (int)(ymax*Math.random());
        d = xmax/40;  //円の大きさ 10
        dx = 0;
        dy = ymax/40; //動きの大きさ 10
        istate = true;
    }
    @Override
    public void run() {
        while ( true ){
            thg.setColor(mypnl.bgcolor);
            thg.fillRect(x-d/2,y-d/2,d,d);
            if ( istate != mypnl.istate ) {
		int tmp = dx;
		dx = dy;
		dy = tmp;
		istate = mypnl.istate;
	    }
            x+=dx;
            if (x >xmax){
                x  = 2*xmax-x;
                dx = -dx;
            }
            以下略

istate != mypnl.istate は、MoveDiskの中の istate と MyPanelの中の istate が同じかどうかチェックします。 mypnl.istate はMyPanelのインスタンスである mypnlのフィールドにあるistateという変数という意味です。 なにもつかないistateはここで定義されている istateという変数という意味で、MoveDiskのインスタンスのistateです。MoveDiskのインスタンスは円の数だけあり、それぞれ異なります。

mypnl.istate の初期値は true ですが、クリックするたびに false と true を行ったり来たりします。もし同じでないならdx,dyの値を交換し、istateの値をmypnl.istateに合わせます。

スクリーンショットは動きがわかるように、まず青い円を描いています。

moveDisk

それぞれ横または縦

AnimeDisk6.javaをもとに変更していきます。

greenボタンをクリックしたら横に動くか縦に動くか入れ替わるのは同じですが、横に動くものと縦に動くものが混ざります。

ファイル名 AnimeDisk7.java の一部

(1)〜(3)の3箇所を変更します。

(1) MyPanelクラスのフィールドに istate (縦だよ)という変数を宣言し、初期値をtrueにします。

class MyPanel extends JPanel{
    BufferedImage buffimg;
    Graphics2D bfg;
    Color bgcolor= new Color(255,255,191);  //背景の色
    //boolean istate = true;
    int greenct = 0;

(2) AnimeDisk6クラスのactionPerformed()の緑ボタンの内容を変更します。「!」はtrueとfalseを反転させるということです。

    //イベント処理
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == rbtn) {
            //mypnl.moveDisk();    //●を描くメソッド
            MoveDisk disk = new MoveDisk(mypnl);
            disk.start();
        }
        if (e.getSource() == gbtn) {
            //mypnl.drawToBuff('g');
            mypnl.greenct++;
            //mypnl.istate = ! mypnl.istate;
        }
        if (e.getSource() == bbtn) {
            mypnl.drawToBuff('b');
        }
    }

(3) MoveDiskクラスのフィールドにも istate (縦だよ)という変数を宣言します。初期値をtrueにするのはx,yの初期値を決めているところで一緒にやります。dxを0にし、dyを0でなくすれば縦に動きます。その時にはtrueということです。

class MoveDisk extends Thread {
    int x;
    int y;
    int d, dx,    dy ;
    int xmax, ymax;
    Graphics2D thg;
    MyPanel mypnl; 
    BufferedImage buffimg;
    int greenct = 0;
    //boolean istate;

    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 = (int)(xmax*Math.random());
        y = (int)(ymax*Math.random());
        d = xmax/40;  //円の大きさ 10
        dx = 0;
        dy = ymax/40; //動きの大きさ 10
        this.greenct = mypnl.greenct;
        //istate = true;
    }
    @Override
    public void run() {
        while ( true ){
            thg.setColor(mypnl.bgcolor);
            thg.fillRect(x-d/2,y-d/2,d,d);
            //if ( istate != mypnl.istate ) {
            if ( greenct != mypnl.greenct ) {
		int tmp = dx;
		dx = dy;
		dy = tmp;
                greenct = mypnl.greenct;
		//istate = mypnl.istate;
	    }
            x+=dx;
            if (x >xmax){
                x  = 2*xmax-x;
                dx = -dx;
            }
            以下略

このやり方では横に移動するものと縦に移動するものが混ざります。

moveDisk

課題

1.

greenボタンを上記の様に働くようにし、動作を確認しなさい。

ファイル名 AnimeDisk6.java

2.

greenボタンを上記の様に働くようにし、動作を確認しなさい。

ファイル名 AnimeDisk7.java


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