解説 (関連の深いクラスを線で区切りました。)


MovingShapeクラスについて
 このクラスでは上下左右に動く物体の動きなどを宣言する。
 フィールドの宣言やコンストラクタについてはごく一般的なので解説を省略する。
 updataPositionLR(),updatePositionUD(),updatePositionUR_DL(),updatePositionUL_DR()の4つのメソッドは、位置を示すlocxやlocyに速さを示すvxやvyを加えることで物体を移動させる。また、一定の値(上下左右それぞれの最大値最小値)を超えると状態を示すstateを変更して方向を転換させる。
 paint()メソッドは、このクラス内で形を宣言していないので(速さや大きさ、色などは宣言した)ここでは実装しない。

MovingRectクラスについて
 このクラスはMovingShapeクラスを拡張してまだ実装されていないpaint()メソッドを実装する。
 コンストラクタについてはsuperキーワードを使ってMovingShapeクラスのものをそのまま利用する。
 paint()メソッドではsetColor()によって物体の色を設定し、位置やサイズを受け取ってfillRect()を使いその長方形を描く。

MovingOvalクラスについて
 このクラスはほとんどMovingRectクラスと同じである。
 唯一違っている点はfillRect()の部分がfillOval()に変わっていることであり、これによって位置やサイズを受け取ってそこに収まる最も大きい楕円を描く。



BouncingShapeクラスについて
 このクラスでは物体が大きさを変えながら直線的に動き回って壁にぶつかったらバウンドしたように見せるようなメソッドを宣言する。動き以外でMovingShapeと違っている点は物体自身が大きさを変えることと、物体の内部を塗らないようにもできることである。
 まず、フィールドの宣言は一般的だが、コンストラクタは引数の数を変えて2つつくってみた。一つは動かない物体のためのコンストラクタで、もう一つは動く物体のコンストラクタである。
 setVelocity()メソッドでは速さを示すvx,vyを設定する(MovingShapeのときは速さの設定はコンストラクタ内に含んでいる)。
 updatePosition()メソッドは位置を示すlocx,locyに、vx,vyを加えることによって位置を更新している。
 setMoveSpeed()メソッドは物体の大きさの変化の速さを示すmove_speed_width,move_speed_heightを設定する(今回はコンストラクタ内に物体の大きさの変化の速さの設定を含ませてしまったので使っていない)。
 updateSize()では物体の大きさを示すwidth,heightにmove_speed_width,move_speed_heightを加えることによって大きさを更新する。
 update()では初めの2つのifは、物体が動ける範囲を超えてしまったときにvxまたはvyの符号を逆にすることで逆の方向に移動させる(これによって弾んだように見える)。また、残りの2つのifに関しては物体のサイズがその物体の大きさの範囲を超えてしまったときにmove_speed_widthまたはmove_speed_heightの符号を反転させる(これによって物体が大きくなったり小さくなったりする)。
 MovingShapeのときと同様、このクラス内で形を宣言していないのでpaint()メソッドは実装しない。

BouncingRectクラスについて
 このクラスではBouncingShapeクラスを拡張してまだ実装していないpaint()メソッドを実装する。
 コンストラクタはBouncingShapeのものを使う。
 このクラスのペイントがMovingShapeのペイントと違っている点は、初めに物体の内部を塗るか塗らないかを決めるfillについて判断し、fillがtrueのときにはfillRect()を、fillがfalseのときにはdrawRect()を呼んで物体を描く。drawRect()は位置や大きさを受け取ってその長方形を線で描く。

BouncingOvalクラスについて
 このクラスはほとんどBouncingRectクラスと同じである。
 唯一違っているのはfillRect()の代わりにfillOval()を、drawRect()の代わりにdrawOval()を使用していることである。



Bounceクラスについて
 このクラスが今まで解説してきたクラスを使ってアニメーションを実行するためのクラスである。
 まず、すべてのアプレットのスーパークラスであるAppletをインポートし、それを拡張する。またThreadを作成するためにRunnableをインプリメントする。
 初めにThreadのanimation、Graphicのoffscreen、Imageのimageを宣言する。offscreen,imageはオフスクリーン作成のために使う。次にそれぞれの物体の個数や配列を宣言する。
 init()メソッドではアプレットの初期化を行う。まず、setBacground()を使って背景の色を決め、getBounds()を使ってアプレットのサイズを決定する。initShapes()は物体をインスタンス化するためのメソッドである。次の2行ではcreateImage(),getGraphics()を使用してオフスクリーンを割り当てる。
 initShapes()はinit()のなかででてきたものだが、このメソッドでは物体の配列を宣言し、それぞれ値を設定しながらインスタンス化していく。今回は初めに宣言しているようにBouncingRect5個、BouncingOval9個、MovingRect2個をインスタンス化している。
 start()では実際スレッドを作成し開始する。
 updateShapes()ではそれぞれのクラス、または形に対応するupdate()を呼ぶ。ここで位置が更新される。。
 update()ではアプレットウィンドウを消さないようにpaint()だけを呼ぶようにオーバーライドする(詳しくは考察に示します)。
 paint()では設定した物体をすべてオフスクリーンに描き、最後にdrawImageを使ってウィンドウを更新する(ここについても詳しくは考察に示します)。ここで早く描かれたものは画面では後ろにいってしまうため、すべてループを使わずにわざわざ変な順番にしている。
 run()では実際に描く、ウィンドウの更新、休止という作業を行っている。repaint()では画面をクリアしpaint()を呼ぶ。また、updateShapes()を呼び位置や大きさを更新する。そして、sleep()でREFRESH_RATE分だけ休止する。これを何度も繰り返す。
 stop()ではanimationのstop()を呼びアプレットを停止させる。


TOPに戻る