アニメーション制御のプログラムについての説明 dm_game_anime_main.c // プログラム本体 dm_game_anime_main.h // ヘッダーファイル マリオ・ノコノコ等のアニメーションの制御は、game_anime( evsworks.hで定義 )と game_anime_data ( evsworks.hで定義 ) で行います。 typedef struct{ u8 cnt_charcter_no; u8 cnt_now_anime; u8 cnt_now_frame; u8 cnt_anime_count; u8 cnt_anime_loop_count; s8 cnt_anime_flg; u32 cnt_anime_address; game_anime_data **anime_charcter; game_anime_data *cnt_now_type; }game_anime; cnt_charcter_no :キャラクター番号( DMC_??? )が入ります。 cnt_now_anime :現在表示中のアニメーション番号( ANIME_??? )が入ります。 cnt_now_frame :現在表示中のアニメーションの配列番号( ?コマ )が入ります。 cnt_anime_count :次のコマまでのカウンター。 cnt_anime_loop_count :ループ用のカウンタ。 cnt_anime_flg :割り込み( アニメーションの途中でも、違うアニメーションに切りかえる )を許可するためのフラグ。 cnt_anime_address :アニメーションデータを読み込んだ先のアドレス(0x80340000or0x803a0000)が入る。 anime_charcter :キャラクターのアニメーション配列を集めた配列の先頭を指す。 cnt_now_type :現在表示中のアニメーションの配列を指す。 typedef struct{ u16 *anime_pal; u8 *anime_dat; s8 pos_an_x, s8 pos_an_y; u8 def_w_size; u8 def_h_size; u8 h_size[3]; u8 aniem_wait; s8 aniem_flg; }game_anime_data; anime_pal :パレットへのポインタ。 anime_dat :グラフィックへのポインタ。 pos_an_x :X座標(表示したい座標に、この座標の値を足す)。 pos_an_y :Y座標(表示したい座標に、この座標の値を足す)。 def_w_size :横幅。 def_h_size :縦幅。 h_size[3] :3分割した縦幅。 aniem_wait :表示時間。 aniem_flg :制御用フラグ。( anime_???が入る ) *ソース説明 ------------------------------------------------------------------------------------------------------------------------------------ u32 dm_anime_address_set( u32 address_bss,u32 address ) 行番号 30 〜 36行 アニメーション用アドレス設定関数 アニメーションデータは SPECファイルの中で number で宣言されているため、 実際のアドレスに変換する処理をしている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_char_set( game_anime *ani ,game_anime_data **ani_dat) 行番号 38 〜 45行 アニメーションキャラクター設定関数 各キャラクターの全アニメーションを統括する配列を設定する関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_set( game_anime *ani ,u8 ani_type) 行番号 47 〜 58行 アニメーション強制設定関数 アニメーション(ANIME_???)をうけてそのアニメに変更する。 アニメーションの途中でも、新しいものに変える。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_set_cnt( game_anime *ani ,u8 ani_type) 行番号 60 〜 68行 アニメーション設定関数 アニメーション(ANIME_???)をうけてそのアニメに変更する。 cnt_anime_flg のフラグを見て、変更可能な場合、アニメーションを変更する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_restart( game_anime *ani ) 行番号 70 〜 78行 アニメーション再稼動関数 アニメーションを最初のコマから動かすための設定を行う。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_control( game_anime *ani ) 行番号 80 〜 121行 アニメーション制御関数 86行 そのコマの表示時間用カウンタを足す。 87行 もし、表示時間を過ぎた場合、以下の処理を行う。 88行 表示時間のクリア 89行 現在表示中のデータの aniem_flg を調べて、次の処理を設定する。 91 〜 93行 anime_next だった場合、次のコマに進める。 94 〜 104行 anime_loop だった場合、ループ(指定回数)の処理を行います。次のフレームの aniem_flg がループするコマになっています。 指定回数ループすると、基本アニメーションにもどります。次のフレームの aniem_wait がループ回数になっています。 105 〜 109行 anime_loop_infinity だった場合、ループ(無限)の処理を行います。次のフレームの aniem_flg がループするコマになっています。 110 〜 114行 anime_stop はそれ以降アニメーションの進行をしません。anime_no_write も同様です。ただし、anime_stop は、 他のアニメーションの割り込みを許可します。 115 〜 118行 anime_end だった場合、通常アニメーションにもどります。主に ANIME_opening・ANIME_attack・ANIME_damage (登場・攻撃・ダメージ)のアニメーションは、最後が anime_end になっていて、通常アニメーションに戻るようになっています。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_anime_draw( game_anime *ani,s16 x_pos,s16 y_pos,s8 flip_flg ) 行番号 123 〜 159行 アニメーション描画関数 136行 現在のフレーム(コマ)のaniem_flg が anime_no_write だった場合、描画しない。(主に巨大ウイルスの消滅に使用) 138 〜 139行 反転の制御 141 〜 144行 テクスチャロード時のグラフィック値を計算するため。 146行 パレットデータのロード。 148 〜 149行 描画X座標の計算(反転の場合も有るので) 150行 アニメーションデータは SPECファイルの中で number で宣言されているため、 実際のアドレスに変換する処理をしている。 151 〜 157行 描画部分。1枚の絵が大きさがバラバラで、色数も256色のため、3回で描画するように統一している。 ------------------------------------------------------------------------------------------------------------------------------------