我在C中编写一些代码,在微处理器的LCD屏幕上随机显示精灵。目前,当我运行此代码时,它会生成从上到下运行的8行。所以它以随机顺序打印一些东西但不是精灵。为什么是这样?谁能帮助我? (注意:rand是在一个单独的函数中播种,工作正常,问题就在这段代码中。)
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;
}
答案 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
函数本身需要一个小的改动来循环遍历作为参数传递的数组中的所有sprite。此外,属于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();
}
}
未来的增强功能可能包括:
malloc
和free
替换动态分配的数组静态数组。