ソフトウェア演習Ⅲ(Java)〔課題 6:アニメーション〕担当:青野雅樹

ソフトウェア演習Ⅲ(Java)〔課題 6:アニメーション〕担当:青野雅樹
以下の内容を満たす Java プログラムと、アニメーションの静止画像(キーボードの適
当なキーでストップした状態の画像)を Moodle にアップせよ。締切は 11 月 18 日(火)
の夜までとする。プログラムの動作テストができるように必要なプログラムを全部アッ
プすること。
プログラム 6-17 を以下のように改良せよ。まず、(1) Ball.java というボールクラスを作
成せよ。(2) main 関数を含むクラス(Kadai6.java)では、Ball クラスのオブジェクトを 10
個~30 個の範囲で生成し、以下の条件を満たすアニメーションプログラムを作成せよ。
【条件】
(1) Ball.java には、ボールの半径(1~80 のランダムな半径)、色(0.0~1.0 のランダムな
色), 位置(x,y ともに[0-400]のランダムな初期位置かスタート)、方向ベクトル(dx,
dy と も に 、 [-1.0~+1.0] の 間 の ラ ン ダ ム な ベ ク ト ル ) 、 速 度 ベ ク ト ル
(speedX=speedY=40 で固定)、直前の位置(lastx, lasty)(初期値は x,y にそれぞれ等し
い)をもたせること。データ型は float、または double のいずれかとする。
(2) JFrame ではキーボードのイベントを検出させること。イベントとしては、(2-1)ESC
キーで終了、(2-2) S キーでアニメーションを静止、(2-3)R キーでアニメーションを
再開させる。なお、JFrame のラベルに各自の名前と日付を加えること。
(3) Ball.java クラス内で定義するボールの移動を制御する部分は『コメントとヒント』
を参照すること。
(4) 実行結果は、S キーを押したところでスクリーンコピーをとり、jpg か png 画像とす
ること。
(5) main プログラムで作成する JFrame のウィンドウは、600×600 とし、起動時の引
数でボール個数を入力させること。
(例:javau Kadai6
30 )
(6) Thread の sleep 時間は 10ms~100ms で適宜固定してよいとする。
コメントとヒント:
条件(3)のボールの移動制御は animate 関数または、Ball.java 内の適当な関数(例:public
void move(java.awt.Rectangle bounds)のような関数 )で、以下のように行うとよいです。
これは、プログラム 6-17 では、animate 関数で行っていましたが、Ball クラスを作るので、
その中で、move 関数のようなものを生成して行うほうが簡単かと思います。
if ((x – radius + speedX * dx < 0 || x + radius + speedX * dx > bounds.width))
dx = -dx;
if ((y – radius + speedY * dy < 0 || y + radius + speedY * dy > bounds.height))
dy = -dy;
x = lastx + speedX * dx;
y = lasty + speedY * dy;
lastx = x;
lasty = y;
以下の図が実行例です。S キーでアニメーションを止めたものです。この課題では、Ball ク
ラスのオブジェクトを複数生成することになりますが、たとえば、配列で生成する場合は、
Ball [ ] balls = null;で宣言しておいて、コンストラクタか public void init()
メソッドのような 1 回だけ初期化用に呼び出す関数を準備して、そこで、
Balls = new Ball[numBalls];
for (int i = 0 ; i < numBalls ; i++){
balls[i] = new Ball();
saveBalls[i] = new Ball(); /* ストップ、再開時の退避用 */
}
のように、オブジェクトを作成しておくといいかと思います。個々のオブジェクト作成時に、
条件(1)の個々のメンバー変数の初期化を行えば結構です。