Основная проблема заключается в том, что 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
-й элемент в массиве. Кроме того, вы увидите, что для функции 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
.
- Замена массива более сложным абстрактным типом данных, например списком или дважды связанным списком, чтобы зомби можно было добавлять или удалять во время выполнения.
- Переименование функций и реструктуризация там, где каждый звонит.
Вы вызываете 'create_zombies()' без предоставления аргумента. –
Эта строка 'Sprite * zombie_sprites = & zombie_sprites [i];' генерирует предупреждение компилятора. Правильно: это саморегуляция. –
Случайные линии выглядят по-другому, но пока не отображаются спрайты –