c链接列表绘制结构到屏幕

时间:2017-04-17 14:33:42

标签: c linked-list sdl glib

我有一个游戏,每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;
}

2 个答案:

答案 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..