ログ・ページ/y04/後期PS2班/2007-01-15

ログ・ページ/y04/後期PS2班/2007-01-15

[ログ・ページ/y04/後期PS2班]

# 2006年中に行ったこと (編集者:045719B 小野裕作)

とりあえず、思い出した順にメモ

# 複数キャラクターの表示、操作

Character構造体をノードとした線形リストを作成し、 while文でループさせる。ループ内でコントローラからの キー入力の受付とキャラクターの表示を行う (N体のキャラクターの表示、操作に対応できる)

リストの作成(gundam_smash/schedule.c)

1
2
3
4
5
6
7
8
9
               // 最初のキャラを初期化
               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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
               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;
               }

# キャラクターごとの関数の違いを吸収

キャラクターごとに処理が異なる関数は、基本的に

1
(キャラクター名)_(処理内容)

という関数名にしてある(例:gaplant_create()、rickdias_walk_front())

これに対して、

1
character_(処理内容)

という名前の関数を作成し、引数に応じてキャラクターごとの関数を呼び出すようにした

まず、character構造体にキャラクターを示す character_id という変数を持たせる

また、キャラクターごとに番号を割り振る

(gundam_smash/character.h)

1
2
3
4
#define GAPLANT 0
#define RICKDIAS 1
#define SLAUGHTER_DAGGER 2
#define ZAKU 3

関数内で character_id を参照し、値によって呼び出す関数を変える

Character構造体を生成する関数の場合(gundam_smash/character_action.c)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 生成 */
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;
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy