CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C - SDL] Gestion des collisions

unitedelite29
unitedelite29
Niveau 10
08 août 2010 à 13:07:41

Bonjour tout le monde!

aujourd'hui j'ai un autre probleme, après des heures de recherche sur la gestion des collision, après les avoir essayer (notamment les collision AABB), je n'arrive pas a les mettre en place sur mon programme, en effet j'utilise un tableau 2d pour afficher les éléments (

1111111111
1222222221
1222222221
1322222231
1052222401
1005334001
1000000001
1000000001
1000000001
1111111111 ) je ne donne donc pas de position précise pour les éléments (je n'ai donc pas de "SDL_Rect positionMur, etc...) et comme pour la collision AABB il faut 2 SDL rect a par mon personnage je n'ai rien d'autre ><

je recherche donc un autre type de gestion de collision.

merci d'avance pour toute aide ^^

final-hearts
final-hearts
Niveau 10
08 août 2010 à 16:47:44

toute image que tu affiches à l'écran possède une position et une largeur/hauteur donc tu peux faire un SDL_Rect avec.

si tu ne veux compter que les éléments différents de 0 y a une solution.
tu commences par compter le nombres d'éléments différents de 0.
int x = 0;
int y = 0;
int nb_element_different_de_zero = 0;

for(x = 0; x < LARGEUR_MAP;x++)
for(y = 0; y < HAUTEUR_MAP;y++)
if(tableau[x][y] != 0)
nb_element_different_de_zero++;

ensuite tu alloues un tableau des éléments différents de 0.

SDL_Rect * TabElementsCollisionnel;
TabElementsCollisionnel =
malloc(sizeof(SDL_Rect)*nb_element_different_de_ze
ro);
int var = 0;

for(x = 0; x < LARGEUR_MAP;x++)
for(y = 0; y < HAUTEUR_MAP;y++)
if(tableau[x][y] != 0)
{
TabElementsCollisionnel[var] =
SDL_Rect(x*LARGEUR_D_UN_TILE,y*HAUTEUR_D_UN_TILE,L
ARGEUR_D_UN_TILE,HAUTEUR_D_UN_TILE);
var++;
}

et ainsi tu as un tableau avec les SDL_Rect des éléments collisionnel (enfin différents de 0, là tu peux améliorer en ajoutant && != 3 si 3 n'est pas collisionnel etc)

à partir de là le gros du boulot est fait.

maintenant il reste plus qu'à détecter les collisions à partie de ça.
On a normalement un SDL_Rect pour le héros à la base. que je vais appeler Heros ^^

int i = 0;

for(i = 0; i < nb_element_different_de_zero;i++)
if(Heros.x + Heros.w > TabElementsCollisionnel[i].x)
if(Heros.x < TabElementsCollisionnel[i].x +TabElementsCollisionnel[i].w )
if(Heros.y + Heros.h > TabElementsCollisionnel[i].y)
if(Heros.y < TabElementsCollisionnel[i].y +TabElementsCollisionnel[i].h )
//alors on a une collision.

unitedelite29
unitedelite29
Niveau 10
08 août 2010 à 17:12:33

une erreur ><

error: invalid conversion from 'void*' to 'SDL_Rect*'|

la ligne

TabElementsCollisionnel =
malloc(nb_element_different_de_zero*sizeof(SDL_Rec
t));

final-hearts
final-hearts
Niveau 10
08 août 2010 à 18:37:58

alors remplace "TabElementsCollisionnel =

malloc(nb_element_different_de_zero*sizeof(SDL_Rec

t));"

par "TabElementsCollisionnel =(SDL_Rect *)

malloc(nb_element_different_de_zero*sizeof(SDL_Rec

t)); "

final-hearts
final-hearts
Niveau 10
08 août 2010 à 18:39:02

ps : c'est quoi ton compilateur ?

unitedelite29
unitedelite29
Niveau 10
08 août 2010 à 18:51:47

j'utilise code blocks avec GCC

final-hearts
final-hearts
Niveau 10
08 août 2010 à 23:05:36

ok ok fais comme je t'ai dit :

remplace "TabElementsCollisionnel =

malloc(nb_element_different_de_zero*sizeof(SDL_Rec

t));"

par "TabElementsCollisionnel =(SDL_Rect *)

malloc(nb_element_different_de_zero*sizeof(SDL_Rec

unitedelite29
unitedelite29
Niveau 10
09 août 2010 à 17:32:02

j'ai régler le probleme des collision (j'ai tout re-programmer et je suis passer en déplacement par case et non par pixel)

mais maintenant je cherche comment utiliser plusieurs fois la même touche (mais pas en même temps)

par exemple (mon code qui génère une erreur) :
http://hapshack.com/images/capturvrv.jpg

le code fonctionne quand j'ai qu'un seul SDLK_f mais quand j'en mets plusieurs il me mets une erreur "duplicate case value"

j'ai essayer divers technique qui ce sont solver par des échec (essai directement dans le code, dans une fonction etc...)

y'a t'il un moyen pour pourvoir effectuer sa?

(j'ai aussi essayer en initialisant un bool direction (haut = 0; bas = 0; et quand on entre dans la fonction pour aller en haut sa mets le bool en 1 et une fonction SDL_KEYUP se charge de les remettre a 0), en placant ensuite une SDLK_f a par avec des test de condition a l'intérieur mais la fonction ne marche pas ...

final-hearts
final-hearts
Niveau 10
09 août 2010 à 19:01:30

en gros tu veux gérer le fait d'appuyer plusieurs fois sur une touche sur un intervalle restreint ?

final-hearts
final-hearts
Niveau 10
09 août 2010 à 19:01:53

ou gérer le fait qu'une touche soit encore enfoncé ?

unitedelite29
unitedelite29
Niveau 10
09 août 2010 à 19:13:07

en faite je veut pourvoir en appuyant sur une touche produire quelque chose (la il s'agit de transformer un tiles en une autres) :
http://hapshack.com/images/capturxyx.jpg

et j'aimerais donc faire le test de la touche "f" dans toute les direction, mais le compiler m'affiche une erreur me disant que je n'ai pas le droits faire plusieur case(switch) ayant la même valeur

unitedelite29
unitedelite29
Niveau 10
09 août 2010 à 19:42:08

par contre j'ai un autre probleme quand je sauvegarde mon niveau, la fonction de sauvegarde décaler tout sa fait que je me retrouve après avec un niveau tout décaler ><

(pourtant c'est une fonction basique) :

int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
int i = 0, j = 0, caractere = 0;

fichier = fopen("debugniveau.txt", "w");
if (fichier == NULL)
return 0;

for (i = 0 ; i < NB_BLOCS_LARGEUR; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
fprintf(fichier, "%d", niveau[j][i]);
caractere++;
}
}

fclose(fichier);
return 1;
}

avant : http://hapshack.com/images/capturblb.jpg
après avoir sauvegarder et re-ouvert le niveau :
http://hapshack.com/images/capturcnc.jpg

final-hearts
final-hearts
Niveau 10
09 août 2010 à 20:31:17

l'ordre des deux boucles encore...
"
for (i = 0 ; i < NB_BLOCS_LARGEUR; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
fprintf(fichier, "%d", niveau[j][i]);
caractere++;
}
} "

devrait être : "
for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++)
for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
{
fprintf(fichier, "%d", niveau[i][j]);
caractere++;
} "

final-hearts
final-hearts
Niveau 10
09 août 2010 à 20:37:15

ps : je pense que c'est peut-être aussi dû au fait que la lecture et l'écriture sont complètement décalés.

"fprintf(fichier, "%d", niveau[j][i]); "
%d dis que tu sauvegarde sous forme d'un int non ?
alors que si je me souviens bien, ta fonction de lecture lit par caractère... a moins que tu l'aies changée entre deux ^^'

unitedelite29
unitedelite29
Niveau 10
09 août 2010 à 21:13:19

inverser a bien résolut le probleme ^^

si ma fonction de lecture est bien par caractère (fgetc).

merci de ton aide ^^

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment