c链表绘制结构到屏幕

c linked list drawing struct to the screen

我有一个游戏,每 40 帧实例化一个新结构并将其添加到链表中。然后循环遍历链表,使用 SDL.However 将每个结构作为一个圆圈绘制到屏幕上,圆圈被绘制到屏幕上然后再次消失而不是停留在屏幕上。

此函数生成新结构并每 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;
}

问题与线

接缝
Asteroid asteroidddd = {0,0,rand()%SCREEN_WIDTH , rand()%SCREEN_HEIGHT, (rand()%(maxRad-minRad))+minRad};

由于没有分配内存,asteroidddd 一旦超出 spawnAsteroid() 的范围就会被销毁。

你应该这样做:

Asteroid *asteroidddd = malloc(sizeof(Asteroid));
// Populate properties..

您正在向列表中添加一个指向 局部变量 的指针。一旦函数 returns.

局部变量超出范围并消失

这意味着您有一个指向不存在对象的指针列表,并且每次取消引用这些指针时都会有未定义的行为

您需要使用malloc动态分配堆的结构。并记得在完成后 free 节点。


在一个不相关的注释中,您在每次调用 spawnAsteroid 时都重置了随机数生成器。如果您在一秒钟内调用它两次,您将使用相同的随机数序列进行两次调用。在程序开头调用srand一次