2017-04-17 2 views
1

J'ai un jeu qui instancie une nouvelle structure toutes les 40 images et l'ajoute à une liste chaînée. Il parcourt ensuite la liste chaînée en dessinant chaque structure à l'écran sous la forme d'un cercle à l'aide de SDL. Cependant, les cercles sont dessinés à l'écran puis disparaissent à nouveau plutôt que de rester à l'écran.c mappe de dessin de liste chaînée à l'écran

Cette fonction rend la nouvelle structure et est appelé toutes les 40 cadres

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); 
} 

Celui-ci boucle dans la liste chaînée

void drawAsteroids(){ 
GList *list = asteroidList; 
//loop through the list 
while(list != NULL){ 
    GList *next = list->next; 
    //draw each asteroid 
    drawAsteroid(list->data); 
    list = next; 
} 
} 

Cette fonction dessine la structure comme un cercle

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); 
} 

Maintenant, je donne aux structures une vitesse et une vitesse x. Ensuite, je boucle à nouveau la liste et mettre à jour les variables de position par les varibales de vitesse afin que les cercles se déplacent lentement à travers l'écran. Cependant, aucun mouvement n'est vu.

Cette fonction boucle dans la liste

void updateAsteroids(){ 
    GList *list = asteroidList; 
    //loop through the list 
    while(list != NULL){ 
     GList *next = list->next; 
     //draw each asteroid 
     updateAsteroid(list->data); 
     list = next; 
    } 
} 

Cette fonction met alors à jour la position

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

Possible duplication de [C fonction d'appel sur le contenu de la liste chaînée] (http://stackoverflow.com/questions/43441064/c-calling-function-on-contents-of-linked-list) – ptomato

Répondre

1

Vous ajoutez un pointeur vers une variable locale à votre liste. Les variables locales sortent de la portée et disparaissent une fois la fonction revenue. Cela signifie que vous avez une liste de pointeurs vers des objets non existants et que vous avez un comportement non défini chaque fois que vous déréférerez ces pointeurs.

Vous devez affecter les structures dynamiquement du tas en utilisant malloc. Et n'oubliez pas de free les nœuds une fois que vous avez terminé avec eux.


Sur une note sans rapport avec remise à zéro du générateur de nombres aléatoires dans chaque appel à spawnAsteroid. Si vous l'appelez deux fois en une seule seconde, vous aurez deux appels en utilisant la même séquence de nombres aléatoires. Appelez srandune fois au début du programme.

+0

J'ai mis à jour la question avec un autre problème. Toute aide serait appréciée –

0

Les coutures problème à la ligne

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

Comme aucune mémoire est allouée , asteroidddd sera détruit une fois hors de portée de spawnAsteroid().

Vous devriez plutôt faire:

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

J'ai mis à jour le question avec un autre problème. Toute aide serait appréciée –