!!! ball プロジェクト 以下は,((color red 平成24年度まで講義担当だった鈴木先生が完成させたプロジェクト))です. 今年も利用させていただいています. !! 開発の流れ [GDK2012::アニメーション@|http://wiki.cis.iwate-u.ac.jp/~wiki/Soft.cgi?]をもとに * ball1/ アニメーション領域とスプライトの作成 (ライブラリ化) * ball2/ スプライトとアニメーション領域の改良,異なる種類のスプライト (ball/mighty)が扱える * ball3/ ballとmightyの衝突 * ball4/ イベントライブラリの作成,マウスにより,ballの生成とmightyの操作ができる * ball5/ 背景を一定時間毎に変える * ball6/ すべてをモジュールに,[[プログラム::ball::モジュール化]] * ball7/ 三つのゲームを動かす !! make ball/ の取り出しとコンパイル 8< % svn export https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball % cd Ball/ball1 ; make % ball_anime % ball_anime 10 600 400 >8 ball2/, ball3/, ball4/, ball5/, ball6/ も同様 !! [ball1/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball1] [[ball::アニメーションのライブラリ化]] anime.{h,c} はアニメーション用のライブラリとインタフェースです * アニメーション領域の提供 6< * drawing_area * 描画領域にのっかているスプライト(達) >9 * (同じ種類の)スプライトの提供 6< * 画像(pixbuf) * 描画領域 * 座標と速度 >9 !! [ball2/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball2] 複数のスプライトを動かす(ballとmightyモジュール作成のためのプロトタイプ) ボールとマイティの二種類のスプライトを動かす. * アニメライブラリを変更せずに * ball_anime.c 側で動きを制御できる * 異なる種類のスプライトの提供 6< * 画像(pixbuf) * 描画領域 * 座標と速度 * タイムアウトで呼ばれるコールバック関数 >9 !! [ball3/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball3] ballとmighty モジュールの作成 6< ボールとマイティに関し,ball_anime.c (main)から独立 ballモジュール * ball.h, ball.c mightyモジュール * mighty.h, mighty.c >9 !! [ball4/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball4] 描画領域にイベントを加える [[ball::イベントのライブラリ化]] * イベントライブラリの作成 event.h, event.c !! [ball5/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball5] ball4からの変更 * key_press, key_relese イベントを取得できるように ** my_event_setの第3引数に window を渡す 背景モジュール作成のためのプロトタイプ * 背景画像の変更を可能に (ball_anime.cのみ変更) ** ball_anime.c 中に背景画像の配列と ** 一定時間間隔で,背景を変える timeout コールバック関数を定義 !! [ball6/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball6] ! ball5/ の module 化 * main.c <- ball_anime.c を変更 * ball_and_mighty/ <- ball_anime.c を変更 * ball/ <- ball.{h,c} * bg/ <- ball_anime.c の中の背景に関する部分を独立したモジュールに * mighty/ <- mighty.{h,c} * lib/ <- gtk_lib.{h,c}, anime.{h,c}, event.{h,c} * image/ <- 画像 ! Makefile 機能を分割 * ball6/モジュール/Makefile ** .o を作る * ball6/Makefile ** main.o を作る ** モジュールの make を行う ** main.o, モジュール/モジュール.o をリンクする !! [ball7/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball7] 複数のゲームが同時に動くように,ゲーム全体をモジュールにする * キーボード・イベントのコールバック関数に (myAnimeArea *)area を渡すようになっている * 受け取ったarea から mighty を特定できるようにした[ball7/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/ball7/mighty/might.c] ** GHashTable 便利です。 !! [event/|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/event] ! 見せたいこと ball_and_mightyシリーズを使ってkeypressイベントを取得する方法 * myevent/myevent.c * lib/event.c gtk_main を繰り返し呼ぶ方法 * keypressイベントで一旦gtk_mainを抜けて, * 再度gtk_mainを呼び出す ! [event/myevent|https://svn.cis.iwate-u.ac.jp/svn/csd/Examples/gtk2/Ball/event/myevent] myevent/myevent.c <- ball6/(main.c+ball_and_mighty/ball_and_mighty.c) * ウィンドウとアニメ領域を作成し, * ウィンドウに対するキープレスイベントにより, * 背景を切り替え, * 一旦 gtk_main を終え, 繰り返す