xと同じことをyにもしてやればいいわけです。あとで横と縦を入れ替えることを予定しているので、xの記述は残してdx=0としておいて横には動かないようにします。
dx同様dyを設けて縦に動かすこと。dxは0にして残す。
横に動かすときは動かす高さをランダムに決めたが、縦に動かすときは横位置をランダムに決めた方がよい。
上下で跳ね返るようにする。
AnimeDisk3.javaをもとに、MoveDisk というクラスの部分だけ変わります。
class MoveDisk extends Thread {
int x;
int y;
int d, dx, dy;
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
x = (int)(xmax*Math.random());
//y = (int)(ymax*Math.random());
y = ymax/4; //100
d = xmax/40; //円の大きさ 10
//dx = xmax/40; //動きの大きさ 10
dx = 0;
dy = ymax/40; //動きの大きさ 10
}
@Override
public void run() {
//thg.setColor(Color.red);
while ( true ){
thg.setColor(mypnl.bgcolor);
thg.fillRect(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;
}
y+=dy;
if (x >xmax){ //現在はxのコピー。ここを変える
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
強調部分が主要な変更です。
縦に動くこと以外はAnimeDisk3と同じです。
縦に動くことを確認しなさい。