[C/C++][SDL]affichage de plusieur ssprites [Résolu]

Signaler
Messages postés
3
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
28 mars 2006
-
Messages postés
3
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
28 mars 2006
-
salut ,

je sais pas vraiment si c' est le bon forum , ou si quelqun de gentil peut me répondre mais je poste quand meme

Alors
pour un projet info je fait un pacman , j' utilise la librairie SDL
pour l affichage .J' arrive a afficher un ligne ou une colone de la map
( les mur) mais je ne peut pas afficher la deuxieme elle fait planter
le programme

Mes sprite font 32*32 pixel .
Ma map est defini par un tableau d' entier a deux dimention map[19][19] quand il est egal a 1 il y a un mur quand =0 c' est vide

Voici ma fonction d' affichage:

<!--c1-->
<!--ec1-->

SDL_Rect rect_aff;
SDL_Surface *Screen, *image ,*mur;

// fonction qui affiche le pacman en XY et affiche les mur
void affichage(int X,int Y)
{
int x,y,a,b,A,B;
x=32*X;
y=32*Y;

// Coloration de la surfaces de pacman
SDL_FillRect(Screen, NULL, 0);

// Définition de la zone à l'écran du pacman
rect_aff.x = x;
rect_aff.y = y;

// Blit de la surface du pakman à l'écran
SDL_BlitSurface(image,NULL,Screen,&rect_aff);

mur = SDL_LoadBMP("./brik.bmp");

a=-1;
b=-1;

do{a=a+1 //balayage du tableau
do {b=b+1;
if(map[a][b]==1)

{
A=32*a; //passage des coordonner du pixel a ceux du sprite
B=32*b;
rect_aff.x = B;
rect_aff.y = A ;
SDL_BlitSurface(mur,NULL,Screen,&rect_aff);
}
}
while (b!=19);}
while (b!=19);


SDL_Flip(Screen); //affichage
}<!--c2-->
<!--ec2-->

je
pense qu' il doit y avoir une limite au nombre de surface que l on peut
remplir car le pacman s' affiche parfaitement , et si je n' affiche qu'
une
seul ligne ou une seule colone ( une seul boucle do while) alors cela marche ...
voila , si quelqun a une petite idée je serait vraiment heureux
merci d' avance .

2 réponses

Messages postés
146
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
8 mars 2008
1
salut madink,

ton probleme est tres simple, apparament tu as bien compris qu'un
tableau commence à 0 puisque tu commence ta boucle avec a b 0. mais
il faut en tenir compte jusqu'au bout : while(a!=19); dans ce
cas, map[19][0] n'existe pas. c'est pour celà que tu arrives a tracer
la premiere colonne mais que ca plante avant de commencer la deuxieme.
si tu avais inversé la priorité des deux boucles (tracer ligne par
ligne et non col par col) tu aurais ta map entiere mais avec la meme
erreur a la fin.



bon pour arranger ca, il suffit de remplacer 19 par 18 pour avoir les 19 valeurs de 0 à 18.

avec ça, ca devrait fonctionner mieux.



mais une autre suggestion : afin de rendre le code plus comprehensible
bien qu'il ne soit pas compliqué, je te suggere dans ce cas d'utiliser
des boucles for().

voici ton code en amélioré :



int map[19][19];

SDL_Rect rect_aff;

SDL_Surface *Screen, *image ,*mur; // image n'est pas utilisée ici...

mur = SDL_LoadBMP("./brik.bmp"); // il est preferable de charger mur au
debut du programme car là ou tu l'avais mis, il etait rechargé a chaque
appel de la fonction (pas tres rapide)



void affichage(int x,int x)

{

SDL_FillRect(Screen, NULL, 0);

rect_aff.x = 32*x; // de cette maniere, on economise deux variables

rect_aff.y = 32*y;

SDL_BlitSurface(image,NULL,Screen,&rect_aff);

for(int a=0; a<=18; a++) {//format de for() :
for(initialisation; condition de rebouclage; action a effectuer a
chaque rebouclage) { ... }

for(int b=0; b<=18; b++){ //
b++ equivaut à b=b+1 de meme que b-- ou b+=2 equivaut à b = b+2 ou
b-=2, b*=5, b/=5, b%=5 etc.... ce sont des opérateurs de base
permettant d'alléger le code !

if(map[a][b]==1){


rect_aff.x = 32*b;// idem, de cette maniere, on
economise deux variables

rect_aff.y = 32*a ;

SDL_BlitSurface(mur,NULL,Screen,&rect_aff);

}

}

}

SDL_Flip(Screen); //affichage

}<!--c2--><!--ec2-->
autre chose : n'oublies pas d'initialiser ta video en hardware et doublebuf



si tu as d'autres question n'hesites pas !



@++
Messages postés
3
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
28 mars 2006

un énorme merci , j' ai encore quelque probleme mais la je commence a voir le boue du tunnel :)

merci encore !