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

问题描述:

我有一个游戏,每40帧实例化一个新的结构并将其添加到链接列表。然后,它使用SDL循环显示每个结构到屏幕的链接列表,然后将这些圆圈绘制到屏幕上,然后再次消失而不是停留在屏幕上。c链接列表绘制结构到屏幕

此功能使得新的结构,称为每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速度和ay速度。然后,我再次遍历列表,并通过速度变量更新位置变量,以便圆圈缓慢地在屏幕上移动。然而没有看到移动。

此功能列表循环

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

[C链接列表内容的C调用函数]的可能重复(http://*.com/questions/43441064/c-calling-function-on-contents-of-linked-list) – ptomato

你加入一个指向局部变量到列表中。局部变量超出范围并在函数返回时消失。

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

您需要使用malloc来动态分配堆的结构。请记住free节点完成后。


在不相关的说明中,您将每次调用spawnAsteroid时的随机数发生器复位。如果您在一秒钟内打两次电话,您将使用相同的随机数字序列进行两次通话。致电srand一次在程序开始时。

+0

我已经更新了问题,并带来了进一步的问题。任何帮助,将不胜感激 –

问题接缝要与线

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

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

而应该做的:

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

我已更新问题与进一步的问题。任何帮助,将不胜感激 –