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