2015-05-12 2 views
0

Я пишу код в C, который случайно отображает спрайты на ЖК-экране на микропроцессоре. В настоящее время, когда я запускаю этот код, он выводит 8 строк, идущих сверху вниз. Поэтому он печатает что-то в случайном порядке, но не спрайт. Почему это? Может ли кто-нибудь мне помочь? (Примечание: рэнд засевают в отдельную функцию, которая работает нормально, проблема только в этом коде.)Что случилось с моей функцией print_random_sprites?

void zombies() { 

    Sprite zombie_sprite; 
    Sprite * zombie_sprite_pointer = &zombie_sprite; 
    byte zombie_bitmap [] = { 
    BYTE(11100000), 
    BYTE(01000000), 
    BYTE(11100000) 
}; 

    for (int i = 0; i < 8; i++) { 
     Sprite * zombie_sprites = &zombie_sprites[i]; 
     init_sprite(zombie_sprites, rand()%76, rand()%42, 3, 3, zombie_bitmap); 
     } 
    create_zombies();  
} 

void create_zombies(Sprite * zombie_sprites) { 
    while(1) { 
    clear(); 
    draw_sprite(&zombie_sprites); 
    refresh(); 
    } 
    return 0; 
} 
+1

Вы вызываете 'create_zombies()' без предоставления аргумента. –

+0

Эта строка 'Sprite * zombie_sprites = & zombie_sprites [i];' генерирует предупреждение компилятора. Правильно: это саморегуляция. –

+0

Случайные линии выглядят по-другому, но пока не отображаются спрайты –

ответ

0

Основная проблема заключается в том, что 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.
  • Замена массива более сложным абстрактным типом данных, например списком или дважды связанным списком, чтобы зомби можно было добавлять или удалять во время выполнения.
  • Переименование функций и реструктуризация там, где каждый звонит.