ログ・ページ/y04/後期PS2班? 2006年中に行ったこと (編集者:045719B 小野裕作) †とりあえず、思い出した順にメモ 複数キャラクターの表示、操作 †Character構造体をノードとした線形リストを作成し、 while文でループさせる。ループ内でコントローラからの キー入力の受付とキャラクターの表示を行う (N体のキャラクターの表示、操作に対応できる) リストの作成(gundam_smash/schedule.c) // 最初のキャラを初期化 character_top = character_init(1); character_current = character_top; // 他のキャラの初期化 for(id=2; id<=player_num; id++) { character_current->next = character_init(id); character_current = character_current->next; } リストを用いたループ(gundam_smash/schedule.c) character_current = character_top; while (character_current != NULL) { int loop = 0; get_enemy_obj(character_top, character_top->next); 省略 draw_obj(character_current->model->body); character_current = character_current->next; } キャラクターごとの関数の違いを吸収 †キャラクターごとに処理が異なる関数は、基本的に (キャラクター名)_(処理内容) という関数名にしてある(例:gaplant_create()、rickdias_walk_front()) これに対して、 character_(処理内容) という名前の関数を作成し、引数に応じてキャラクターごとの関数を呼び出すようにした まず、character構造体にキャラクターを示す character_id という変数を持たせる また、キャラクターごとに番号を割り振る (gundam_smash/character.h) #define GAPLANT 0 #define RICKDIAS 1 #define SLAUGHTER_DAGGER 2 #define ZAKU 3 関数内で character_id を参照し、値によって呼び出す関数を変える Character構造体を生成する関数の場合(gundam_smash/character_action.c) /* 生成 */ PartPtr create_character(float x, float y, float z, int character_id) { PartPtr top; switch (character_id) { case GAPLANT: top = create_gaplant(x, y, z); break; case RICKDIAS: top = create_rickdias(x, y, z); break; case SLAUGHTER_DAGGER: top = create_slaughter_dagger(x, y, z); break; case ZAKU: top = create_zaku(x, y, z); break; default: break; } return top; } |