主な問題は、Sprite zombie_sprite
オブジェクトが 1 つしかないことです。これをオブジェクトの配列にすると、他の問題を調べ始めることができます。次に、オブジェクトへのポインタに関してかなりの混乱がありSprite
ます。物事を少し単純化するために、関数内の変数を微調整し、zombies
ベスト プラクティスのためにいくつかの「整理」を行うことができます。
// Start by using a compile-time constant to define the number of zombies.
// This could be changed to a vriable in the, once the simple case is working.
#define NUMBER_OF_ZOMBIES 8
void zombies()
{
// Eight zombies are required, so define an array of eight sprites.
Sprite zombie_sprites[NUMBER_OF_ZOMBIES];
byte zombie_bitmap [] =
{
BYTE( 11100000 ),
BYTE( 01000000 ),
BYTE( 11100000 )
};
// Continued below...
これにより、スプライトを初期化する関数の残りの部分が簡単になります。今回はi
、配列の th 要素へのポインタを取得することができます。create_zombies
また、関数には引数が必要であることがわかります。Sprite
オブジェクトのアドレスです。そのため、初期化されたばかりの同じ配列内の最初のスプライトのアドレスを渡します。
繰り返しますが、少し整理すると、関数の残りの部分は次のようになります。
// ...continued from above
for (int i = 0; i < NUMBER_OF_ZOMBIES; i++)
{
// Initialise the ith sprite using the address of its element
// in the zombie_sprites array.
init_sprite(&zombie_sprites[i], rand()%76, rand()%42,
3, 3, zombie_bitmap);
}
// Animate the zombies in the array.
create_zombies(&zombie_sprites[0]);
}
最後に、create_zombies
関数自体に小さな変更を加えて、パラメーターとして渡された配列内のすべてのスプライトをループ処理する必要があります。また、タイプvoid
であるため、return ステートメントはありません。
void create_zombies(Sprite * zombie_sprites)
{
while(1)
{
clear();
// loop round drawing all of the sprites.
for(int zombie_index = 0; zombie_index < NUMBER_OF_ZOMBIES; zombie_index++)
{
draw_sprite( &zombie_sprites[zombie_index] );
}
refresh();
}
}
今後の機能強化には、次のものが含まれる可能性があります。
- NUMBER_OF_ZOMBIES を変数に変更します。
malloc
と を使用して、静的配列を動的に割り当てられた配列に置き換えますfree
。
- 実行時にゾンビを追加または削除できるように、配列をリストや双方向リンク リストなどのより複雑な抽象データ型に置き換えます。
- 関数の名前を変更し、それぞれが呼び出される場所を再構築します。