oui merci j'avais oublié de rajouter le n_annim
sinon fwrite c'est du C,C'est bien ca ,
en c++ j'ai entendu parler de stream, comment on l'utilise?
oui merci j'avais oublié de rajouter le n_annim
sinon fwrite c'est du C,C'est bien ca ,
en c++ j'ai entendu parler de stream, comment on l'utilise?
Désolé, mais ce n'est pas une question C++, tu peux regarder http://cpp.developpez.com/faq/cpp/?page=fichiers ou demander dans le forum C++.
http://www.developpez.net/forums/forumdisplay.php?f=19
Jc
ca y est j'ai demandé pour le stream merci!
mais je me retrouve avec un probleme dans ma fonction chargement puisque le programme plante :
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 void Map::chargementMap(char* nom_map) { int i,x,y; char buffer[256]; ifstream fichier(nom_map); if (!fichier) cerr << "Impossible d'ouvrir la map !" << endl; memset(&buffer,0,sizeof(buffer)); /* BG SOUND */ fichier >> buffer; this->bg_sound = FMUSIC_LoadSong(buffer); if(!this->bg_sound) cerr <<"Erreur lors du chargement de la carte: %s\n"<< endl;//C a trasformer /* CHIPSET */ memset(&buffer,0,sizeof(buffer)); fichier >> buffer; this->surf_chipset= SDL_LoadBMP(buffer); //couleur transparente SDL_SetColorKey(this->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(this->surf_chipset->format,8,33,82)); //lecture chacun des membres fichier >> n_tile; fichier >> width; fichier >> height; fichier >> offsetX; fichier >> offsetY; //allocution memoire this->chipset = new s_chipset[n_tile]; for(i=0;i<n_tile;i++) { fichier >> chipset[i].x; fichier >> chipset[i].y; fichier >> chipset[i].collision; fichier >> chipset[i].nextTile; } //alloue memoire pr data data = new unsigned int[width*height]; for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) { fichier >>GET_TILE(x,y,map); if(GET_TILE(x,y,map)>=this->n_tile) { cerr << "Carte corrompue!"<< endl; cerr << x << endl; cerr << y << endl; GET_TILE(x,y,map)=0; } } fichier.close(); FMUSIC_PlaySong(this->bg_sound); }
Salut,
Il faut utiliser la méthode .read() des streams (pas l'opérateur >>, qui s'arrète au premier espace/ '\n')
Aussi tu ne lis pas tout dans le même fichiers (enfin je pense pas), alors pourquoi en ouvre tu un seul?
merci pour la précision donc,opérateur s'arrête au premier espace..
euh read() tu l'utilises bien comme ceci :il y a quelque chose à mettre en paramètre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part fichier.read()
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part fichier.read(buffer);sinon , si, je lit tout dans le même fichier
Code : Sélectionner tout - Visualiser dans une fenêtre à part fichier.read() buffer;
http://www.cplusplus.com/reference/i...ream/read.html
Ca prend ton buffer en premier paramètre, et le nombre d'octets en deuxième paramètre.
merci pour ton lien, il est top
mais comment je fais pour savoir la mémoire exacte requise???
Salut,
sur le lien que je t'ai donné il y a notamment des fonctions tellg et seekg, et des exemples dans les liens, qui permettent d'avoir la taille d'un fichier.
Néanmoins ton buffer a une taille fixe de 256 octets, donc autant faire fichier.read(buffer, 256), je crois qu'il n'y a aucun problème si on spécifie une taille trop grande à la fonction read.
yep c'est bon le tuto indique la taille en octet
mais une erreur que je n'arrive pas a comprendre puisque pour buffer aucun probleme par contre les variables posent problemes
pour n_tile , erreur:"invalid conversion from unsigned int to char"
?????????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 fichier.read(n_tile,1); fichier.read(width,1); fichier.read height,1); fichier.read(offsetX,1); fichier.read(offsetY,1);
Là par contre, il faut utiliser >> ^^
read() c'est pour remplir une chaine de caractère avec un fichier, là je suppose que tes valeurs sont séparées par des espaces ou sauts de ligne, et donc c'est >> qui convient.
ouinnnnnnnnnnnnnnnnnnnnnn ca plante encore lors du programme
j'ai isolé le probleme :Erreur lors du chargement de la carte .
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 void Map::chargementMap(char* nom_map) { int i,x,y; char buffer[256]; ifstream fichier(nom_map); if (!fichier) cerr << "Impossible d'ouvrir la map !" << endl; memset(&buffer,0,sizeof(buffer)); /* BG SOUND */ fichier.read(buffer,256); this->bg_sound = FMUSIC_LoadSong(buffer); if(!this->bg_sound) cerr <<"Erreur lors du chargement de la carte: %s\n"<< endl;//C a trasformer /* CHIPSET */ memset(&buffer,0,sizeof(buffer)); fichier.read(buffer,256); this->surf_chipset= SDL_LoadBMP(buffer); //couleur transparente SDL_SetColorKey(this->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(this->surf_chipset->format,8,33,82)); //lecture chacun des membres fichier >> n_tile; fichier >> width; fichier >> height; fichier >> offsetX; fichier >> offsetY; //allocution memoire this->chipset = new s_chipset[n_tile]; for(i=0;i<n_tile;i++) { fichier >> chipset[i].x; fichier >> chipset[i].y; fichier >> chipset[i].collision; fichier >> chipset[i].nextTile; } //alloue memoire pr data data = new unsigned int[width*height]; for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) { fichier >> GET_TILE(x,y,map); if(GET_TILE(x,y,map)>=this->n_tile) { cerr << "Carte corrompue!"<< endl; cerr << x << endl; cerr << y << endl; GET_TILE(x,y,map)=0; } } fichier.close(); FMUSIC_PlaySong(this->bg_sound); }
non après vérification , ca vient pas de ca...
j'ai modifié mais j'ai Erreur lors du chargement de la carte:
chargement
sauvegarde
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 void Map::sauvegarde(char *filename,char *bg_sound,char *chipset) { int i,x,y; char buffer[256]; ofstream fichier(filename,ios_base::binary); memset(&buffer,0,sizeof(buffer)); strcpy(buffer,bg_sound); fichier << buffer; memset(&buffer,0,sizeof(buffer)); strcpy(buffer,chipset); fichier << buffer; if (!fichier) return; //enregistrement variable fichier << n_tile; fichier << width; fichier << height; fichier << offsetX; fichier << offsetY; //enregistrement tableau for (i=0;i<this->n_tile;i++) { fichier << this->chipset[i].x; //enregistre coordoné x de chaque tuile fichier << this->chipset[i].y; fichier << this->chipset[i].collision; fichier << this->chipset[i].nextTile; } for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) fichier << GET_TILE(x,y,map); fichier.close(); //ferme le fichier }
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 void Map::chargementMap(char* nom_map) { int i,x,y; char buffer[256]; ifstream fichier(nom_map,ios::binary); if (!fichier) cerr << "Impossible d'ouvrir la map !" << endl; memset(&buffer,0,sizeof(buffer)); /* BG SOUND */ fichier.read(buffer,256); this->bg_sound = FMUSIC_LoadSong(buffer); if(!this->bg_sound) cerr <<"Erreur lors du chargement de la carte"<< endl; /* CHIPSET */ memset(&buffer,0,sizeof(buffer)); fichier.read(buffer,256); this->surf_chipset= SDL_LoadBMP(buffer); //couleur transparente SDL_SetColorKey(this->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(this->surf_chipset->format,8,33,82)); //lecture chacun des membres fichier >> n_tile; fichier >> width; fichier >> height; fichier >> offsetX; fichier >> offsetY; //allocution memoire this->chipset = new s_chipset[n_tile]; for(i=0;i<n_tile;i++) { fichier >> chipset[i].x; fichier >> chipset[i].y; fichier >> chipset[i].collision; fichier >> chipset[i].nextTile; } //alloue memoire pr data data = new unsigned int[width*height]; for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) { fichier >> GET_TILE(x,y,map); if(GET_TILE(x,y,map)>=this->n_tile) { cerr << "Carte corrompue!"<< endl; cerr << x << endl; cerr << y << endl; GET_TILE(x,y,map)=0; } } fichier.close(); FMUSIC_PlaySong(this->bg_sound); }
Salut,
Là c'est un peu compliqué, effectivement peut-être que read n'est peut être pas la bonne solution.
On peut voir le format de fichier??
Parceque tout dépend de ce format...
J'ai regardé le tuto, ca va être un enfer de convertir tout ça en fstream.
Autant laisser tel quel, après tout le C fait partie du C++
Si néanmoins tu veux utiliser les streams, alors bon courage...
-->
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 FILE *f; int i,x,y; char buffer[256]; if(!map) return; f=fopen(filename,"wb"); if(!f) return; memset(&buffer,0,sizeof(buffer)); strcpy(buffer,bg_sound); fwrite(&buffer,255,sizeof(char),f); memset(&buffer,0,sizeof(buffer)); strcpy(buffer,chipset); fwrite(&buffer,255,sizeof(char),f);
et au chargement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ofstream f; int i,x,y; if(!map) return; f.open(filename, ios::binary); if(!f) return; f << bg_sound << endl; f << chipset << endl;
-->
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 void LoadMap(struct s_map *map, char *filename) { FILE *f; int i,x,y; char buffer[256]; if(!map) return; f=fopen(filename,"rb"); if(!f) return; /* BG SOUND */ memset(&buffer,0,sizeof(buffer)); fread(&buffer,255,sizeof(char),f); map->bg_sound = FMUSIC_LoadSong(buffer); if (!map->bg_sound) fprintf(stderr,"Erreur lors du chargement de la carte: %s\n", FMOD_ErrorString(FSOUND_GetError())); /* CHIPSET */ memset(&buffer,0,sizeof(buffer)); fread(&buffer,255,sizeof(char),f); map->surf_chipset=SDL_LoadBMP(buffer); SDL_SetColorKey(map->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(map->surf_chipset->format,8,33,82));
Après, pour le reste, dans la partie sauvegarde tu utilises f << mavaleur << " ", et dans la partie chargement c'est juste f >> mavaleur;
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 ifstream f; int i,x,y; string buffer; if(!map) return; f.open(filename,ios::binary); if(!f) return; /* BG SOUND */ getline(f, buffer); map->bg_sound = FMUSIC_LoadSong(buffer.c_str()); if (!map->bg_sound) fprintf(stderr,"Erreur lors du chargement de la carte: %s\n", FMOD_ErrorString(FSOUND_GetError())); /* CHIPSET */ getline(f, buffer); map->surf_chipset=SDL_LoadBMP(buffer.c_str()); SDL_SetColorKey(map->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(map->surf_chipset->format,8,33,82));
Enfin te dire tout ça c'est pas t'aider, l'idéal c'est que tu apprennes à te servir des streams en essayant avec un petit programme de sauvegarder et de charger des données dans/d' un fichier.
Parce que là l'exemple du tuto c'est du hardcore direct...
Enfin voilà
merci encore
je vais essayer de faire un petit programmer sur ces streams ,pour m'entrainer,car tu a raison c'est plutot hardcore ici...
sinon j'ai fait comme tu mas dit mais ca plante
chargement
sauvegarde
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 void Map::chargementMap(char* nom_map) { ifstream f; int i,x,y; string buffer; f.open(nom_map,ios::binary); if(!f) return; /* BG SOUND */ getline(f, buffer); this->bg_sound = FMUSIC_LoadSong(buffer.c_str()); if (!this->bg_sound) fprintf(stderr,"Erreur lors du chargement de la carte: %s\n", FMOD_ErrorString(FSOUND_GetError())); /* CHIPSET */ getline(f, buffer); this->surf_chipset=SDL_LoadBMP(buffer.c_str()); SDL_SetColorKey(this->surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(this->surf_chipset->format,8,33,82)); //lecture chacun des membres f >> n_tile; f >> width; f >> height; f >> offsetX; f >> offsetY; //allocution memoire this->chipset = new s_chipset[n_tile]; for(i=0;i<n_tile;i++) { f >> chipset[i].x; f >> chipset[i].y; f >> chipset[i].collision; f >> chipset[i].nextTile; } //alloue memoire pr data data = new unsigned int[width*height]; for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) { f >> GET_TILE(x,y,map); if(GET_TILE(x,y,map)>=this->n_tile) { cerr << "Carte corrompue!"<< endl; cerr << x << endl; cerr << y << endl; GET_TILE(x,y,map)=0; } } f.close(); FMUSIC_PlaySong(this->bg_sound); }
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 void Map::sauvegarde(char *filename,char *bg_sound,char *chipset) { int i,x,y; char buffer[256]; ofstream f; f.open(filename, ios::binary); if(!f) return; f << bg_sound << endl; f << chipset << endl; //enregistrement variable f << n_tile <<"", f << width <<"", f << height <<"", f << offsetX <<"", f << offsetY <<""; //enregistrement tableau for (i=0;i<this->n_tile;i++) { f << this->chipset[i].x <<"", //enregistre coordoné x de chaque tuile f << this->chipset[i].y <<"", f << this->chipset[i].collision <<"", f << this->chipset[i].nextTile <<""; } for(x=0;x<this->width;x++) for(y=0;y<this->height;y++) f << GET_TILE(x,y,map) <<"", f.close(); //ferme le f }
Salut,
Dans la sauvegarde faut mettre des espaces entre les guillemets
Oula gros problème...
dans ma class map j'ai un attribut privé offsetX
et dans mon sprites.cpp je dois accéder à ce offset et le modifier quand le personnage dépasse les bords de ma carte...
je ne vois pas comment faire étant donné qui est privé...
Bonsoir,
le tuto original étant en C, le mot-clef private n'existant pas en C, pourquoi as-tu mis le mot-clef private dans ta classe lors du passage en C++?
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