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

madink 3 Messages postés mardi 7 mars 2006Date d'inscription 28 mars 2006 Dernière intervention - 26 mars 2006 à 23:30 - Dernière réponse : madink 3 Messages postés mardi 7 mars 2006Date d'inscription 28 mars 2006 Dernière intervention
- 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

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 .
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
MrdJack 146 Messages postés jeudi 22 avril 2004Date d'inscription 8 mars 2008 Dernière intervention - 27 mars 2006 à 00:36
3
Merci
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 !



@++

Merci MrdJack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de MrdJack
madink 3 Messages postés mardi 7 mars 2006Date d'inscription 28 mars 2006 Dernière intervention - 27 mars 2006 à 01:01
0
Merci
un énorme merci , j' ai encore quelque probleme mais la je commence a voir le boue du tunnel :)

merci encore !
Commenter la réponse de madink

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.