主要问题是Sprite zombie_sprite
只有一个对象。把它变成一个对象数组,你就可以开始研究其他问题了。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
,它没有返回语句。
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
。
- 用更复杂的抽象数据类型(例如列表或双向链表)替换数组,以便可以在运行时添加或删除僵尸。
- 重命名函数并重组每个函数被调用的地方。