Bonjours ,

Cela fait plus d'un moi que je suis sur ce problème , j'en ai marre .
Je suis actuellement sur un projet de Snake.
Collisions pixel par pixel , déplacement pixels par pixels .
La map est stocker dans un tableau a double [] .

Tout marche pour l'instant l'affichage de la map etc .
Mais une fonction que j'ai crée fait quitter le jeu.

En faite le principe ? :

Une tête , un corps et une queue .

La tête est le début de la chaîne , la queue la fin , a chaque fois que le serpent mange un fruit on rajoute un " morceau de corps " .

La fonction en question sert a définir les positions de tout les " morceaux " .
Pour l'instant je ne fais aucune variations parce que sa marche pas .

Je vous montre le code .

LISTE CHAINNE .H :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "SDL.h"
 
#ifndef LISTE_CHAINEE
#define LISTE_CHAINEE
 
typedef struct Element Element;
struct Element
{
    SDL_Rect posElement;
    int orientation;
    Element *suivant;
};
 
typedef Element* Liste;
 
typedef struct Serpent Serpent;
struct Serpent
{
    int direction;
    int vitesse;
    Liste chaine;
 
};
 
Liste initialisation();
void insertion(Serpent serpent);
 
#endif
LISTES CHAINNE .C :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "ressource.h"
#include "listes_chainees.h"
 
Liste initialisation()
{
    Liste liste = malloc(sizeof(Element));
    Element *element = malloc(sizeof(element));
 
    liste->orientation = HORIZONTALE;
    liste->posElement.x = 10;
    liste->posElement.y = 10;
 
    element->orientation = liste->orientation;
    element->posElement.x = liste->posElement.x +43 ;
    element->posElement.y = 0;
 
    element->suivant = NULL;
    liste->suivant = element;
 
    return liste;
}
 
 
void insertion(Serpent serpent)
{
    Element *nouveau = malloc(sizeof(Element));
    nouveau->orientation = serpent.chaine->orientation;
    nouveau->posElement.x = serpent.chaine->posElement.x+43;
    nouveau->posElement.y = serpent.chaine->posElement.y;
 
    nouveau->suivant = serpent.chaine->suivant;
    serpent.chaine->suivant = nouveau->suivant;
}
Fonction JEU.C : ( Que le début la fin n'es pas importante )

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
void jeu (void)
{
    // Declaration des variables nécessaires
    Input in ;
    Serpent serpent;
 
    int i = 0 , j = 0 , continuer = 1 , nbAleatoire = 60 , tempsActuel = 0, tempsPrecedent = 0;
    char map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {{0}} ;
    SDL_Rect positions , box , posSerpent ;
    SDL_Surface *teteSerpent, *corpSerpent, *queueSerpent, *arbre, *fruit[3], *caisse, *fond ;
 
    // Remplissages des variables
    if(!chargerNiveau(map)) // Chargement de la map , voir : fichier.c
    exit(0);
 
    serpent.chaine = initialisation();
    serpent.vitesse = 1;
    serpent.direction = DROITE;
 
    teteSerpent = init_img("Ressources\\Img\\teteSerpent.png",OUI);
    corpSerpent = init_img("Ressources\\Img\\corpSerpent.png",NON);
    queueSerpent = init_img("Ressources\\Img\\queueSerpent.png",OUI);
 
    fruit[CERISE] = init_img("Ressources\\Img\\cerise.png",NON);
    fruit[POMME] = init_img("Ressources\\Img\\pomme.png",OUI);
    fruit[POIRE] = init_img("Ressources\\Img\\poire.png",OUI);
 
    fond = init_img("Ressources\\Img\\fond.png",NON);
    caisse = init_img("Ressources\\Img\\caisse.png",OUI);
    arbre = init_img("Ressources\\Img\\arbre.png",NON);
 
    nbAleatoire = NB_Aleatoire(0 , 2);
 
    memset(&in,0,sizeof(in));
    while (continuer)
    {
        UpdateEvents(&in);
 
        if(in.quit)
            continuer= 0;
 
        if(in.key[SDLK_ESCAPE])
            continuer = 0 ;
 
        else if(in.key[SDLK_UP])
        {
            serpent.direction = HAUT;
            serpent.chaine->orientation = VERTICALE;
            in.key[SDLK_UP] = 0;
        }
        else if(in.key[SDLK_DOWN])
        {
            serpent.direction = BAS;
            serpent.chaine->orientation = VERTICALE;
            in.key[SDLK_DOWN] = 0;
        }
        else if(in.key[SDLK_LEFT])
        {
            serpent.direction = GAUCHE;
            serpent.chaine->orientation = HORIZONTALE;
            in.key[SDLK_LEFT] = 0;
        }
        else if(in.key[SDLK_RIGHT])
        {
            serpent.direction = DROITE;
            serpent.chaine->orientation = HORIZONTALE;
            in.key[SDLK_RIGHT] = 0;
        }
 
        tempsActuel = SDL_GetTicks();
        mouvementSerpent(serpent, tempsActuel, tempsPrecedent );
        definePosSerpent(serpent); // ICI LA FONCTION QUI BUGGGGGG
Et la fonction en question :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
void definePosSerpent (Serpent serpent)
{
    Element *actuel = serpent.chaine->suivant;
    actuel->posElement.x = serpent.chaine->posElement.x +43;
 
    while(actuel!= NULL)
    {
            if( actuel->suivant != NULL)
                actuel->suivant->posElement.x = actuel->posElement.x + 43;
 
            actuel = actuel->suivant;
    }
}
Voila merci , j’espère vous aurez le courage de m'aider .