madink
Messages postés3Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention28 mars 2006
-
26 mars 2006 à 23:30
madink
Messages postés3Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention28 mars 2006
-
27 mars 2006 à 01:01
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
// 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);
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 .
MrdJack
Messages postés146Date d'inscriptionjeudi 22 avril 2004StatutMembreDernière intervention 8 mars 20082 27 mars 2006 à 00:36
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