!!! ボールプロジェクト !! プロジェクト説明 泡のようなはかないボールは, クリック音で目覚め, 無敵ボールと出会って消える. 無敵ボールは,キーボード入力によろめく. 見守るペンギン達の行進は続く. !! ものと操作の洗い出し 泡のようなはかないボール * (無敵ボールと出会って)消える * 時間とともに動く * 壁にぶつかると跳ね返る * 目覚める 無敵ボール * 生まれる * 時間とともに動く * 壁にぶつかると跳ね返る * 衝突すると,泡ボールを消す 見守るペンギン達 * 行進は続く * クリックされると泡ボールを生む 壁 * ボールがぶつかる !! モジュール分けと階層化 {{image_url(http://wiki.cis.iwate-u.ac.jp/~suzuki/Soft/example/ball_layers.png,left,50%,ball_layers)}} !! ライブラリ モノと操作を実現するために, 直接 GTK, GDKを使ってプログラムするのでは, 抽象度が低く,考えにくく,間違えやすいので, アニメーションとイベントを提供する層を作成する. * ボールたちはスプライト * ペンギンは時間で変化する背景画像 * 背景画像でのマウスとキーボードイベント ! アニメーション 一定時間毎に,背景描画,スプライト描画を行う アニメーション領域データ構造 * 描画領域 * 背景画像 * 中にいるスプライト達 * イベント * タイムアウト関数 6< * ライブラリを変更することなく, * ライブラリを使う側で関数を用意できるように >9 アニメーション領域API * アニメーション領域の作成 * 背景画像を設定する * アニメーション領域の消去 ! スプライト 一定時間毎に背景の上を動く スプライトのデータ構造 * のっているアニメーション領域 * 画像,大きさ,位置,向き,速さ * タイムアウト関数 スプライトAPI * 新しく生まれる * 動く * 消去 ! マイイベント アニメーション領域で起こるマウスとキーボードイベントを取得し, ユーザ指定プログラムを呼び出す仕組みを提供する. マイイベントのデータ構造 * マウス移動イベントと処理関数へのポインタ * マウスボタンイベントと処理関数へのポインタ * キーボードイベントと処理関数へのポインタ マイイベントのAPI * 新しいマイイベントを作る * アニメーション領域にマイイベントを設定する !! モノと操作の検討 モジュール 泡のようなはかないボール * (無敵ボールと出会って)消える * 時間とともに動く * 壁にぶつかると跳ね返る * 目覚める 無敵ボール * 生まれる * 時間とともに動く * 壁にぶつかると跳ね返る * 衝突すると,泡ボールを消す 見守るペンギン達 * 行進は続く * クリックされると泡ボールを生む 壁 * ボールがぶつかる モノと操作の検討 !! モジュール化 * はかないボール, ball/ 6< 生成,動き,消える >9 * 無敵ボール, mighty/ 6< マイティの生成,動き >9 * 背景, bg/ 6< 背景を動かす >9 * ゲーム, ball_and_mighty/ 6< ゲームの生成 * 背景の生成 ** イベントの生成 * ボールとマイティの生成 * イベントループ >9 !! ヘッダファイル ! ball/ball.h 泡のようなはかないボール '''データ構造''' 8< typedef mySprite *ball; >8 としているが本当は, 8< typedef struct { mySprite sprite; ball独自の情報 } *ball >8 '''API''' * (無敵ボールと出会って)消える 8< void ball_remove(ball self) >8 * 時間とともに動く 8< void ball_move(ball self) >8 6< * 中で壁にぶつかると跳ね返る * 一定時間間隔で呼ばれる >9 * 目覚める 8< ball ball_new(void) >8 ! mighty/mighty.h 無敵ボール '''mightyのデータ構造''' 8< typedef (mySprite + alpha) *mighty; >8 '''mightyのAPI''' * 生まれる 8< mighty mighty_new(area) >8 * 時間とともに動く 8< void mighty_mov(mighty self) >8 6< * 壁にぶつかると跳ね返る >9 ! bg/bg.h 見守るペンギン達 '''データ構造''' 8< typedef myAnimeArea *bg; >8 '''API''' * 生まれる 8< bg_new(area) bg_set(bg_pixmap) >8 * 行進は続く 8< 複数の背景をtimeoutで描く >8 * クリックされる(と泡ボールを生む) 8< 背景のイベント構造体 >8