的主要問題是,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
它沒有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
替換動態分配的陣列中的靜態陣列。
- 用更復雜的抽象數據類型(如列表或雙向鏈表)替換數組,以便在運行時添加或刪除殭屍。
- 重命名函數並重構每個被調用的地方。
您已經在不提供參數的情況下調用'create_zombies()'。 –
這行'Sprite * zombie_sprites =&zombie_sprites [i];'產生一個編譯器警告。正確的是:它是自引用的。 –
隨機線現在看起來不同,但它仍然沒有顯示精靈 –