ce n'est pas utile que si il y a un pointeur vers un vaisseau dans la structure?? comme pour une liste chainée par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef struct vaisseau vaisseau;
ce n'est pas utile que si il y a un pointeur vers un vaisseau dans la structure?? comme pour une liste chainée par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef struct vaisseau vaisseau;
POurriez vous dvlper svp ? je ne comprends pas bien
SofEvans merci à toi j'applique ça rapidement
Non, du tout.
Le typedef permet de faire un alias. Cela n'a rien a voir avec les pointeurs.
Par exemple :
Ici, on a utilisé SDLK_LEFT.
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 int main() { ... switch(event.type) { case SDL_KEYDOWN : switch (event.key.keysym.sym) { case SDLK_LEFT : ... break; } break; } ... }
Si je fais ceci, c'est valide :
On utilise systematiquement les typedef avec les structures pour eviter de re-ecrire struct.
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 typedef SDLK_LEFT fleche_gauche; int main() { ... switch(event.type) { case SDL_KEYDOWN : switch (event.key.keysym.sym) { /* Tout a fait valide et fera la meme chose que SDLK_LEFT */ case fleche_gauche : ... break; } break; } ... }
Dans le cas des liste chainé, on utilise typedef pour la structure, et un typedef pour un pointeur vers la structure (ou un seul typedef, ca depend)
EDIT : C'est bon j'ai rien dit, ça marche
J'y comprend rien avec ces include :
constantes.h :
vaisseau.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #ifndef DEF_CONSTANTES #define DEF_CONSTANTES #define HAUTEUR_ECRAN 800 #define LARGEUR_ECRAN 800 #define VITESSE_MAX_VAIS 2 #define ACCEL_VAIS 0.03 #endif
vaisseau.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 #ifndef VAISSEAU_H_INCLUDED #define VAISSEAU_H_INCLUDED typedef struct vaisseau vaisseau; struct vaisseau { //SDL_Surface *image; //SDL_Rect position; int direction; int acceleration; double uniteDeplacement; } void deplacerVaisseau(int *continuer, int acceleration, SDL_Rect *positionObjet, double *vit, SDL_Event event); #endif // VAISSEAU_H_INCLUDED
main.cpp :
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 #include "vaisseau.h" void deplacerVaisseau(int *continuer, int acceleration, SDL_Rect *positionObjet, double *vit, SDL_Event event){ switch(event.key.keysym.sym) { case SDLK_RIGHT: // Flèche droite if((*positionObjet).x + *vit <= LARGEUR_ECRAN) (*positionObjet).x += *vit; break; case SDLK_LEFT: // Flèche gauche (*positionObjet).x -= *vit; break; case SDLK_ESCAPE: // arrêter le jeu *continuer = 0; break; } if(acceleration) { if(*vit < VITESSE_MAX_VAIS){ *vit += ACCEL_VAIS; } }else{ if((*vit - ACCEL_VAIS) > 0){ *vit -= ACCEL_VAIS; if(*vit < ACCEL_VAIS) *vit = 0; } //fprintf(stderr, "%f\n", *vit); } }
Au moment de la compilation le debugger me dit qu'il y a moutle variables non déclarées dans ma fonction dans vaisseau.c, or ce fichier est lu au moment de l'appel de la fonction dans main.cpp après que toutes les variables aient été initialisées non ?
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
73
74
75 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #include <ctype.h> #include <SDL/SDL.h> #include <SDL_image.h> #include "constantes.h" #include "vaisseau.h" //void initImages; int main(int argc, char *argv[]) { SDL_Surface *ecran = NULL, *imgVaisseau = NULL; SDL_Rect positionFond, positionVaisseau; SDL_Event event; int continuer = 1; struct vaisseau vaisseau1; vaisseau1.direction = 0; vaisseau1.acceleration = 0; vaisseau1.vitesse = 0; //positionFond.x = 0; positionFond.y = 0; SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetIcon(IMG_Load("images/sdl_icone.bmp"), NULL); ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption("Casse briques", NULL); //imageDeFond = IMG_Load("images/hendrix.bmp"); imgVaisseau = IMG_Load("images/vaisseau.png"); //positionCurseur.x = ecran->w / 2 - imgCurseur->w / 2; positionVaisseau.x = 0; positionVaisseau.y = HAUTEUR_ECRAN - 80 ; SDL_EnableKeyRepeat(50, 50); while (continuer) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: // arrêter le jeu continuer = 0; break; case SDL_KEYDOWN: deplacerVaisseau(&continuer, 1, &positionVaisseau, &(vaisseau1.vitesse), event); break; case SDL_KEYUP: deplacerVaisseau(&continuer, 0, &positionVaisseau, &(vaisseau1.vitesse), event); break; } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 105, 105, 105)); //SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); SDL_BlitSurface(imgVaisseau, NULL, ecran, &positionVaisseau); SDL_Flip(ecran); //fprintf(stderr, "ratio = %f\n", ratioXCursTN); } } //SDL_FreeSurface(imageDeFond); SDL_FreeSurface(imgVaisseau); SDL_Quit(); return EXIT_SUCCESS; }
Edit : un truc encore plus HALUCINANT c'est que si je supprime la ligne #include "vaisseau.h" et que je sauvegarde, le debugger me trouve qd même des erreurs dans vaisseau.h ?
ouai, j'ai pas bien regardé, je pensait que tu faisais juste une pré-déclaration.
perso je fait comme ça plutot :ça fait juste une ligne en moins...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct { SDL_Surface *image; SDL_Rect position; int direction; int acceleration; double uniteDeplacement; } vaisseau;
Veuillez m'escuser si ce post est un peu un fourre-tout autour de ce projet mais je ne suis pas pour autant hors sujet puisque la finalité est qd même de régler ce pb de fluidité.
J'ai une question concernant l'arborescence du projet :
En fait si à la compilation tous les .h sont lus en premiers (prototypes, structures, define, etc...) et qu'en suite viennent le main.c puis les autre .c (ces derniers comprennant les fonctions) alors pourquoi faut il inclure via #include tartampion.h dans tartampion.c ?
Ensuite si dans main.c j'inclue des fichiers de librairies pourquoi dois de nouveau les inclure dans les autres .c pour pouvoir les utiliser ? (si les .c sont "lus" après le main.c lors de la compilation ils devraient "hériter" des fonctions et variables contenus dans ce dernier, je me trompe ?
c'est peut etre pour simplifier le travail du compilo, s'il devait chercher dans le tous les fichiers d'un projet, qui peut très bien avoir un millier de classes, ça prendrai surement un peu de temps.
C'est juste une supposition, si ça se trouve il y a une autre raison plus logique...
si sa t'amuse t'as qu'a tout mètre dans le même fichier pour pas t'embetté avec les includes xD (mauvais conseil inside)
En fait c'est pas ça...
Tous les fichiers .c sont compilés séparément. Et ça donne des fichiers .o . Donc le compilateur ne lit que les fichiers.c, dans lesquels sont inclus les fichiers.h nécessaires. (de plus #include machin.h ne dit pas au compilateur de regarder le fichier.h, en fait ça met carrément le fichier.h à l'endroit du #include correspondant dans le fichier .c)
Une fois que le compilateur a compilé tous les fichiers .c en fichiers .o, il rassemble tous les fichiers .o ensembles pour faire un exécutable. Et c'est là que s'il manque des trucs il râle avec des choses du style "undefined reference" ...
comme quoi j'avais raison!! il y a bien une explication plus logique...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager