Bonjour je travaille sur le développement d'une application écrite en C/SDL2, ici il s'agit de Mario.Mais j'ai un problème au niveau de la gestion des collisions. Notamment Mario se déplace dans les murs.
-Le terrain qui est affiché en SDL est un terrain en txt (reprend un peu le concept de tile mapping)
-Les images sont affichés grâce aux fonction image_draw (pour l'affichage) et aux fonction Image (pour l'initialisation)
Merci pour la réponse, mon projet est assez inspiré de ton tuto.
Je vois, dans ma boucle d’événement sdlBoucle les valeurs dx et dy qui seront affecté à notre position actuel pour le mouvement sont prise en compte.
Lorsque le mouvement est a droite (dx>0) ou que le mouvement est vers le bas (dy>0), les test de collision marche plutôt correctement.Et il y a pas de collision.
Mais quand pour les déplacements inverse qui sont gauche (dx<0) et haut (dy<0), ca pose problème.
J'ai essayé de modifier (suggestion professeur) la fonction collisionDecor de ton tuto pour pouvoir renvoyer des nombres en fonction des collision.
Ou je dois appliquer les valeurs de dx et dy ,vérifier la collision et en cas de collision retourner en arrière ? (en ajoutant l'inverse de dx et dy à x et y).
De base, ma fonction de test de collision est négative : c'est à dire que on dit qu'il y a collision si on n'est pas "trop a gauche" ou "trop en bas" ou "trop en haut" ou "trop à droite". Donc elle ne dit pas par ou tu touches. Si tu veux dire par ou tu touches, alors il faut l'enrichir.
Je vois que tu l'as fait, mais attention, tu dis que tu touches par exemple si ton vecteur est négatif en x, nul en y. Mais s'il y a une diagonale ? Si tu arrives sur le coin en diagonale, et que donc simultanément, tu toucherais la paroi droite et le haut. Gères tu cela ?
En cas de diagonale (ou quand on se trouve déjà dans une collision) normalement la fonction renvoie la valeur 5, car si ont est pas dans les autres cas de déplacement et qu'il y a quand même collision ça renvoie 5.
Je l'ai gérer tout simplement en mettant dx et dy = 0..Des propositions ?
Mais l'un des problème c'est que le déplacement se fait malgré les valeurs de dx et dy quand ont va a gauche ou en haut.Et c'est juste après que la fonction collision modifie dx et dy.
J'ai modifié la fonction CollisionDecor pour les cas ou les déplacements sont à gauche (dx<0) et à droite (dy<0), en modifiant les xmin,ymin,xmax,ymax pour le test effectuer. Et la y'a plus de collision quand je vais vers le haut, ni à gauche.
Mais la j'ai un problème avec les collision en diagonale.
Voici le code :
int CollisionDecor(sdlJeu *sj,float dx, float dy){
/*retourne des nombres differents en fonction de la collision*/
int xmin,xmax,ymin,ymax,i,j;
char c;
Mario *perso = jeuGetMario(&sj->jeu);
Niveau *niv = jeuGetNiveau(&sj->jeu);
/*Personnage endehors du terrain*/
if (perso->x<0 || (perso->x + TAILLE_SPRITE -1)>=21*TAILLE_SPRITE
|| perso->y<0 || (perso->y + TAILLE_SPRITE -1)>=12*TAILLE_SPRITE)
return -1;
if (dx<0 || dy<0){
xmin=(perso->x + dx) / TAILLE_SPRITE;
ymin=(perso->y + dy) / TAILLE_SPRITE;
xmax=perso->x / TAILLE_SPRITE;
ymax=perso->y / TAILLE_SPRITE;
// printf("b2\n");
}
else{
xmin = perso->x / TAILLE_SPRITE;
ymin = perso->y / TAILLE_SPRITE;
xmax = (perso->x + dx + TAILLE_SPRITE -1) / TAILLE_SPRITE;
ymax = (perso->y + dy + TAILLE_SPRITE -1) / TAILLE_SPRITE;
}
for(i=xmin;i<=xmax;i++)
{
for(j=ymin;j<=ymax;j++)
{
c=nivGetXY(niv,i,j);
/*Collision Personnage sur le haut*/
if(dx==0 && dy <= 0){
if(c=='#'){ return 1;}
}
/*Collision Personnage sur le bas*/
if(dx==0 && dy >= 0){
if(c=='#'){ return 3;}
}
/*Collision Personnage sur la gauche*/
else if(dx<=0 && dy == 0){
if(c=='#'){ return 2;}
}
/*Collision Personnage sur la droite*/
else if(dx>=0 && dy == 0){
if(c=='#'){ return 4;}
}
/*Dans une collision*/
else{
if(c=='#'){ return 5;}
}
}
}
/*En cas de non collision*/
return 0;
}
Gestion Collision et Deplacement de Mario
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html