9 アニメーション入門

9.1 学習目標

9.2 アニメーションの基本

ここからはオブジェクト指向プログラミングを使って、アニメーションを作っていきたいと思います。

9.2.1 回る車

まず、下のプログラムを実行してみましょう。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.2.1.1 車_回転.dama
  1: ※プログラム名:車を回すプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.28
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する
  9: ウィンドウを初期化する。
 10: 
 11: ※画像を生成する
 12: 画像を新規作成して、車と名付ける。
 13: 車のファイル名を「car.gif」と設定する。
 14: ウィンドウに車を追加する。
 15: 
 16: ※アニメーションループ
 17: 無条件で{
 18: 	※0.1秒待つ
 19: 	ウィンドウは0.1秒待機する。
 20: 	
 21: 	※処理を行う
 22: 	車を右に5度回す。
 23: 
 24: 	※再描画する
 25: 	ウィンドウを再描画する。
 26: }を繰り返す。

ここでは、画像オブジェクトを生成しています。

画像オブジェクトを生成するには、次のような命令文を書きます。

画像を新規作成して、車と名付ける。
車のファイル名を「car.gif」と設定する。
画像を使うときの注意

例えば上記のアニメーションで「car.gif」を使う場合は、 同じフォルダに置く必要があります。

同じフォルダに置いていないと画像が表示されません。

使える画像の種類は「.gif」「.jpg」「.jpeg」のどれかです。 「.bmp」の画像は使えないので注意してください。

9.2.2 アニメーションの基本構造

RotateHouse.javaをもう一度よく見てみましょう。 特に、

無条件で{

	※処理

	※再描画

	※待つ

}を繰り返す。

ここの部分が、今までと異なる所で、アニメーションをするプログラムの特徴です。 どのようなアニメーションをするプログラムでも基本構造は同じです。 図解すると下のようになります。

図 9.2.2.1 アニメーションプログラムの構造

9.2.3 アニメーションをするための新しい命令

ウィンドウは[数値]秒待機する。
指定された秒数だけ、待機します。1を入れれば1秒止まり、0.1入れれば0.1秒止まります。
ウィンドウを再描画する。
画面を書き換えます。画面を書き換えないと、オブジェクトを進めたり回しても、画面は書き換わらない(動かない)ので注意してください。
何秒眠るか

待機する命令の中の数字を小さくすることによって、アニメーションを早くすることができます。 しかし、コンピュータの能力にも限界があります。 軽いアニメーションならば0.01秒(秒間100コマ)ぐらいまでならなんとか動きますが、 画像などを使うといくら小さい値を入れても、コンピュータの計算が追いつかなくなります。

人間が目に分かるのは、秒間30コマまでといわれています(テレビがそれぐらいです)ので、 それぐらいを目安に数値を決めると良いでしょう。

9.2.4 円を描く車

オブジェクトになっても、基本的な亀の命令はどれでも使うことができます。 次のプログラムは、円を描く車のプログラムです。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.2.4.1 車_円描画.dama
  1: ※プログラム名:車で円を描くプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.28
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する
  9: ウィンドウを初期化する。
 10: 
 11: ※車を生成する
 12: 画像を新規作成して、車と名付ける。
 13: 車のファイル名を「car.gif」と設定する。
 14: ウィンドウに車を追加する。
 15: 
 16: ※軌跡を描く準備
 17: 車の筆を有効化する。
 18: 
 19: ※アニメーションループ
 20: 無条件で{
 21: 	※待つ
 22: 	ウィンドウは0.1秒待機する。
 23: 
 24: 	※処理を行う
 25: 	車を5度右に回す。
 26: 	車を5ドット進める。
 27: 
 28: 	※再描画する
 29: 	ウィンドウを再描画する。
 30: 
 31: }を繰り返す。

「筆を有効化する」命令で、筆を下ろして軌跡が描かれるようになっています。

図 9.2.4.1 円を描く家
初期値

いままでの亀では「筆を有効化する」命令をしなくても、 最初は筆を下ろした状態から始まっていました。

しかしアニメーションでは軌跡は要らないことが多いので、 初期状態では筆を上げた状態になっています。

プログラムを書くときには、"最初の状態"を意識する必要があります。 これを「初期値」や「デフォルト値」といいます。

9.3 座標の制御

9.3.1 上向きのまま右に動かす

次に示すのは、車が右に動いていくプログラムです。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.3.1.1 車_右移動1.dama
  1: ※プログラム名:車を右に動かすプログラム
  2: ※       其の1:右に向けて動かす
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する
 10: ウィンドウを初期化する。
 11: 
 12: ※車を生成する
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 車を90度右に回す。
 18: 
 19: ※アニメーションループ
 20: 無条件で{
 21: 	※待つ
 22: 	ウィンドウは0.1秒待機する。
 23: 
 24: 	※処理を行う
 25: 	車を5ドット進める。
 26: 
 27: 	※再描画する
 28: 	ウィンドウを再描画する。
 29: }を繰り返す。

今までの方法では、前か後ろにしか進めませんが、 車は上向きのまま、右に動かしたい場合があります。

いままでの方法でも、下のように工夫することによって目的は達成できますが、 ここでは、XY座標設定命令を使ったエレガントな解決方法を考えます。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.3.1.2 車_右移動2.dama
  1: ※プログラム名:車を右に動かすプログラム
  2: ※       其の2:上を向いたまま動かす
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※車を生成する
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: ※アニメーションループ
 18: 無条件で{
 19: 	※待つ
 20: 	ウィンドウは0.1秒待機する。
 21: 	
 22: 	※処理を行う
 23: 	車を90度右に回す。
 24: 	車を5ドット進める。
 25: 	車を90度左に回す。
 26: 
 27: 	※再描画する
 28: 	ウィンドウを再描画する。
 29: }を繰り返す。

9.3.2 XY座標設定命令を使う

XY座標設定命令を使うと、回転せずに、好きな所にオブジェクトを移動することができます。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.3.2.1 車_ワープ.dama
  1: ※プログラム名:4台の車をワープを使って配置するプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.28
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 
 11: ※車を4台生成する
 12: 画像を新規作成して、車Aと名付ける。
 13: 画像を新規作成して、車Bと名付ける。
 14: 画像を新規作成して、車Cと名付ける。
 15: 画像を新規作成して、車Dと名付ける。
 16: 車Aのファイル名を「car.gif」と設定する。
 17: 車Bのファイル名を「car.gif」と設定する。
 18: 車Cのファイル名を「car.gif」と設定する。
 19: 車Dのファイル名を「car.gif」と設定する。
 20: ウィンドウに車Aを追加する。
 21: ウィンドウに車Bを追加する。
 22: ウィンドウに車Cを追加する。
 23: ウィンドウに車Dを追加する。
 24: 
 25: ※アニメーションループ
 26: 無条件で{
 27: 	※待つ
 28: 	ウィンドウは0.1秒待機する。
 29: 
 30: 	※処理を行う
 31: 	車AのX座標を100に設定する。
 32: 	車AのY座標を100に設定する。
 33: 	車BのX座標を100に設定する。
 34: 	車BのY座標を200に設定する。
 35: 	車CのX座標を200に設定する。
 36: 	車CのY座標を100に設定する。
 37: 	車DのX座標を200に設定する。
 38: 	車DのY座標を200に設定する。
 39: 
 40: 	※再描画する
 41: 	ウィンドウを再描画する。
 42: 
 43: }を繰り返す。

このプログラムの実行結果は以下のようになります。

図 9.3.2.1 WarpHouse.javaの実行結果
座標に関する新しい命令
[オブジェクト]のX座標を[値]に設定する。
[オブジェクト]のY座標を[値]に設定する。

指定されたxy座標の位置に、そのオブジェクトをワープ(瞬間的に移動)させます。

[オブジェクト]のX座標を取得して、それを[変数名]に入れる。
[オブジェクト]のY座標を取得して、それを[変数名]に入れる。

現在のxy座標を取得します。

ちなみに、一般にコンピュータ環境では、数学とはちょっと違った座標体系が使われます。 亀の場合もそうです。以下のようになっているので気をつけてください。

図 9.3.2.2 亀の座標体系

さあ、XY座標設定命令を使って、車を右に移動しましょう。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.3.2.2 車_右移動3.dama
  1: ※プログラム名:車を右に動かすプログラム
  2: ※       其の3:上を向いたまま右に動かす(ワープを使う)
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※車を生成
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 整数型を新規作成して、xと名付ける。※x座標を入れる変数
 18: 整数型を新規作成して、yと名付ける。※y座標を入れる変数
 19: 
 20: ※アニメーションループ
 21: 無条件で{
 22: 	※待つ
 23: 	ウィンドウは0.1秒待機する。
 24: 
 25: 	※処理を行う
 26: 	車のX座標を取得して、それをxに入れる。※車のx座標を取得する
 27: 	車のX座標を取得して、それをyに入れる。※車のy座標を取得する
 28: 	車のX座標をx+5に設定する。※右に移動する
 29: 
 30: 	※再描画する
 31: 	ウィンドウを再描画する。
 32: }を繰り返す。

さらに、右端までいったら左端にワープするように改造します。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.3.2.3 車_右移動4.dama
  1: ※プログラム名:車を右に動かすプログラム
  2: ※       其の4:右端に行ったら左端に戻す(ワープを使う)
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※車を生成
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 整数型を新規作成して、xと名付ける。※x座標を入れる変数
 18: 
 19: ※アニメーションループ
 20: 無条件で{
 21: 	※ --- 待つ ---
 22: 	ウィンドウは0.1秒待機する。
 23: 
 24: 	※ --- 処理を行う ---
 25: 	車のX座標を取得して、それをxに入れる。※車のx座標を取得する
 26: 
 27: 	※右に移動する
 28: 	車のX座標をx+5に設定する。
 29: 
 30: 	※右端だったら左端にワープ
 31: 	x≧300であるならば{
 32: 		車のX座標を0に設定する。
 33: 	}をする。
 34: 
 35: 	※ --- 再描画する --- 
 36: 	ウィンドウを再描画する。
 37: }を繰り返す。

だんだんアニメーションらしくなってきました。

9.4 大きさの変更(拡大/縮小)

9.4.1 大きさを変更するプログラム

オブジェクトは、大きさを変更することもできます。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.4.1.1 車_巨大化1.dama
  1: ※プログラム名:車を大きくするプログラム
  2: ※       其の1:大きさを測る
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※車を生成
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 無条件で{
 18: 	※ --- 待つ ---
 19: 	ウィンドウは0.1秒待機する。
 20: 
 21: 	※ --- 処理を行う ---
 22: 	車の横幅を200に設定する。
 23: 	車の縦幅を200に設定する。
 24: 
 25: 	※ --- 再描画 ---
 26: 	ウィンドウを再描画する。
 27: }を繰り返す。
大きさに関する新しい命令
[オブジェクト]の横幅を[値]に設定する。
[オブジェクト]の縦幅を[値]に設定する。

そのオブジェクトを横幅と縦幅を、指定された大きさにします。

[オブジェクト]の横幅を取得して、それを[変数名]に入れる。
[オブジェクト]の縦幅を取得して、それを[変数名]に入れる。

現在の横幅と縦幅を取得します。

9.4.2 徐々に大きくする

アニメーションループをうまく利用すれば、徐々に大きくなっていくプログラムが書けます。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.4.2.1 車_巨大化2.dama
  1: ※プログラム名:車を大きくするプログラム
  2: ※       其の2:徐々に大きくする
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※画像を生成する
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「car.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 整数型を新規作成して、横幅と名付ける。※横幅を入れる変数
 18: 整数型を新規作成して、縦幅と名付ける。※縦幅を入れる変数
 19: 
 20: 無条件で{
 21: 	※ --- 待機する ---
 22: 	ウィンドウは0.1秒待機する。
 23: 
 24: 	※ --- 処理を行う ---
 25: 	車の横幅を取得して、それを横幅に入れる。
 26: 	車の縦幅を取得して、それを縦幅に入れる。
 27: 
 28: 	※車を大きくする
 29: 	車の横幅を横幅+2に設定する。
 30: 	車の縦幅を縦幅+2に設定する。
 31: 
 32: 	※ --- 再描画 ---
 33: 	ウィンドウを再描画する。
 34: 
 35: }を繰り返す。

大きくなりすぎたら、小さく戻してあげましょう。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 9.4.2.2 車_巨大化3.dama
  1: ※プログラム名:車を大きくするプログラム
  2: ※       其の3:大きくなりすぎたら小さくする
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.28
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 
 12: ※家を生成
 13: 画像を新規作成して、車と名付ける。
 14: 車のファイル名を「CAR.gif」と設定する。
 15: ウィンドウに車を追加する。
 16: 
 17: 整数型を新規作成して、横幅と名付ける。
 18: 整数型を新規作成して、縦幅と名付ける。
 19: 
 20: 無条件で{
 21: 	※ --- 待機する ---
 22: 	ウィンドウは0.1秒待機する。
 23: 
 24: 	※ --- 処理を行う ---
 25: 	車の横幅を取得して、それを横幅に入れる。
 26: 	車の縦幅を取得して、それを縦幅に入れる。
 27: 
 28: 	※車を大きくする
 29: 	車の横幅を横幅+2に設定する。
 30: 	車の縦幅を縦幅+2に設定する。
 31: 
 32: 	※横幅が大きくなりすぎたら小さくする
 33: 	横幅≧300であるならば{
 34: 		車を0.25倍する。
 35: 	}をする。
 36: 
 37: 	※縦幅が大きくなりすぎたら小さくする
 38: 	縦幅≧300であるならば{
 39: 		車を0.25倍する。
 40: 	}をする。
 41: 
 42: 	※再描画
 43: 	ウィンドウを再描画する。
 44: }を繰り返す。
大きさ変更に便利な命令
[オブジェクト]を[数値]倍する。

そのオブジェクトを指定された倍率の大きさにします。

[オブジェクト]を[数値]ドット大きくする。

指定した長さだけ縦横を幅を大きくします。

[オブジェクト]を[数値]ドット小さくする。

指定した長さだけ縦横の幅を小さくします。

[オブジェクト]を[数値]ドット長くする。

指定した長さだけ横幅を大きくします。

[オブジェクト]を[数値]ドット短くする。

指定した長さだけ横幅を小さくします。

[オブジェクト]を[数値]ドット高くする。

指定した長さだけ縦幅を大きくします。

[オブジェクト]を[数値]ドット低くする。

指定した長さだけ縦幅を小さくします。

9.5 練習問題

9.5.1 流れ星アニメーションを作ろう

星の画像を使って、流れ星のプログラムを書いてみて下さい。

ダウンロードはこちらから

流れ星は、次の手順で進めていくとうまくできます。

  1. 星の画像をダウンロードする
  2. 流れ星.damaを新しく作る
  3. 流れ星.damaに、星を表示するプログラムを書く
  4. 星を回してみる
  5. 座標を使って、星を右に動かしてみる
  6. 一番右端にいったら、左端に戻るようにする
  7. 星を下にも動かす
  8. 一番下にいったら、上に戻るようにする
  9. 星の大きさを変える
  10. 星を増やす