我有一个游戏,每40帧实例化一个新结构并将其添加到链表中。然后循环遍历链接列表,使用SDL将每个结构绘制为一个圆圈。但是,圆圈被绘制到屏幕然后再次消失而不是停留在屏幕上。
此函数生成新结构,每40帧调用一次
void spawnAsteroid(){
srand(time(NULL));
int maxRad = 60;
int minRad = 20;
Asteroid asteroidddd = {0,0,rand()%SCREEN_WIDTH , rand()%SCREEN_HEIGHT, (rand()%(maxRad-minRad))+minRad};
asteroidList = g_list_prepend(asteroidList, &asteroidddd);
}
这个循环遍历链表
void drawAsteroids(){
GList *list = asteroidList;
//loop through the list
while(list != NULL){
GList *next = list->next;
//draw each asteroid
drawAsteroid(list->data);
list = next;
}
}
此函数将结构绘制为圆
void drawAsteroid(void *asteroid){
//cast the void pointer so it can be dereferenced
Asteroid *newAsteroid = (Asteroid *)asteroid;
circleRGBA(renderer, newAsteroid->xPos, newAsteroid->yPos, newAsteroid->r, 0, 255, 0, 255);
}
现在我给结构一个x速度和一个y速度。然后我再次遍历列表并通过速度变量更新位置变量,以便圆圈在屏幕上缓慢移动。但是没有看到任何动作。
此功能循环遍历列表
void updateAsteroids(){
GList *list = asteroidList;
//loop through the list
while(list != NULL){
GList *next = list->next;
//draw each asteroid
updateAsteroid(list->data);
list = next;
}
}
此功能然后更新位置
void updateAsteroid(void *asteroid){
//cast so it can be dereferenced
Asteroid *newAsteroid = (Asteroid *)asteroid;
newAsteroid -> xPos += newAsteroid -> xSpeed / 60;
newAsteroid -> yPos += newAsteroid -> ySpeed / 60;
}
答案 0 :(得分:1)
您正在向列表添加指向本地变量的指针。局部变量超出范围并在函数返回后消失。
这意味着你有一个指向不存在对象的指针列表,并且每次取消引用这些指针时都会有未定义的行为。
您需要使用malloc
分配堆的动态结构。一旦完成了节点,请记住free
节点。
在不相关的注释中,您在每次调用spawnAsteroid
时重置随机数生成器。如果您在一秒钟内调用两次,则将使用相同的随机数序列进行两次调用。在程序开头调用srand
一次 。
答案 1 :(得分:0)
问题与行
接触Asteroid asteroidddd = {0,0,rand()%SCREEN_WIDTH , rand()%SCREEN_HEIGHT, (rand()%(maxRad-minRad))+minRad};
由于没有分配内存,asteroidddd一旦超出spawnAsteroid()的范围就会被销毁。
你应该这样做:
Asteroid *asteroidddd = malloc(sizeof(Asteroid));
// Populate properties..