縦に動いている場合、dx==0 で dy は0でない値を持っています。横に動いている場合、dy==0 で dx が0でない値を持っています。これを交換することで簡単に入れ替えることができます。
AnimeDisk5.javaをもとに変更していきます。
greenボタンをクリックしたら横に動くか縦に動くか入れ替わることにします。
(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に合わせます。
スクリーンショットは動きがわかるように、まず青い円を描いています。
AnimeDisk6.javaをもとに変更していきます。
greenボタンをクリックしたら横に動くか縦に動くか入れ替わるのは同じですが、横に動くものと縦に動くものが混ざります。
(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; } 以下略
このやり方では横に移動するものと縦に移動するものが混ざります。
greenボタンを上記の様に働くようにし、動作を確認しなさい。
greenボタンを上記の様に働くようにし、動作を確認しなさい。