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

[Langage C] [Programmation] Collision 2D

DevWSJ
DevWSJ
Niveau 1
05 octobre 2011 à 18:02:24

Bonjour, je suis DevWSJ (ou WSJ sur www.siteduzero.com), je développe en C depuis plus de deux mois et je fait un TP personnel qui consiste à faire un petit Mario en 2D. Le code avance, mais un problème arrive: la collision. Le Mario se confronte à un Mario vert (pas luigi, mario en vert, merci paint); si je veux qu'ils se "cognent", comment faire ?

PS: Il y a un moyen de mettre un code sur jeuxvideo.com ou je le mets en texte brut ?

Dric-C_2069
Dric-C_2069
Niveau 68
05 octobre 2011 à 18:07:52

texte :ok: sinon suffit de faire quelque chose du genre quand coordonne de mario = coordonne de mario vert tu balances ton anim de collision :ok: (voir apres, tu les remets a 2 coordonnes differentes)

DevWSJ
DevWSJ
Niveau 1
05 octobre 2011 à 18:22:34

Si c'était aussi simple, je n'aurais pas posté :hum: , sinon voici le code:

  1. include<stdio.h>
  2. include<stdlib.h>
  3. include<string.h>
  4. include "const.h"
  5. include<SDL.h>
  6. include <SDL_image.h>

//bool Collision(AABB box1,AABB box2);
int Collision(SDL_Rect box1, SDL_Rect box2);

int main(int argc, char *argv[])
{
int mort = 0;
SDL_Surface *cadre = NULL, *advActuel = NULL, *ecran = NULL, *app = NULL, *marioActuel = NULL, *mur = NULL, *caisse = NULL, *fond = NULL, *vide = NULL, *Jouer = NULL, *Ecrire = NULL;
SDL_Surface *mario[5] = {NULL}; // 5 surfaces pour chacune des directions de mario
SDL_Surface *adv[4] = {NULL}; //ennemi
SDL_Rect pos, posFond, posCaisse, poscaisse, posVide, posJouer, posCadre, posMur, posEnnemi, souris;
int continuer = 1;
int compteur = 0;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO | SDL_DOUBLEBUF);
/*fond = IMG_Load("menu.jpg");*/
mario[HAUT] = IMG_Load("mario_haut.gif");
mario[BAS] = IMG_Load("mario_bas.gif");
mario[DROITE] = IMG_Load("mario_droite.gif");
mario[GAUCHE] = IMG_Load("mario_gauche.gif");
mario[SAUT] = IMG_Load("mario_saut.gif");
adv[HAUT] = IMG_Load ("enn_haut.gif");
adv[BAS] = IMG_Load("enn_bas.gif");
adv[DROITE] = IMG_Load("enn_droite.gif");
adv[GAUCHE] = IMG_Load("enn_gauche.gif");
mur = IMG_Load("mur.jpeg");
cadre = IMG_Load("cadre_texte.png");
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Demo SDL", NULL);
SDL_EnableKeyRepeat(10, 10);
marioActuel = IMG_Load("mario_bas.gif");
posCaisse.x = 72;
posCaisse.y = 72;
pos.x = 275;
pos.y = 0;
posMur.x = 0;
posMur.y = 112;
posEnnemi.y = 200;
posEnnemi.x = 100;
posCadre.y = 340;
posCadre.x = 10;

while (continuer)
{

SDL_PollEvent(&event);

switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_a:
exit(EXIT_SUCCESS);
break;
case SDLK_c:
caisse = IMG_Load("caisse.jpg");
/*if (caisse != NULL)
{
SDL_Delay(1000);
caisse = NULL;
}*/

break;
// Deplacement de la caisse
if (caisse != NULL)
{
case SDLK_s:
posCaisse.x--;
posCaisse.x--;
break;
case SDLK_d:
posCaisse.y++;
posCaisse.y++;
break;
case SDLK_f:
posCaisse.x++;
posCaisse.x++;
break;
case SDLK_e:
posCaisse.y--;
posCaisse.y--;
break;
case SDLK_x:
posCaisse.x--;
posCaisse.y++;
break;
case SDLK_v:
posCaisse.x++;
posCaisse.y++;
break;
case SDLK_w:
posCaisse.x--;
posCaisse.y--;
break;
case SDLK_r:
posCaisse.x++;
posCaisse.y--;
break;
}
break;
case SDLK_UP:
if (pos.y - 1 < 0)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[HAUT];
pos.y--;
pos.y--;
break;
case SDLK_LEFT:
if (pos.x - 1 < 0)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[GAUCHE];
pos.x--;
pos.x--;
break;
case SDLK_RIGHT:
if (pos.x + 1 > 610)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[DROITE];
pos.x++;
pos.x++;
break;
case SDLK_DOWN: // Flèche bas
if (pos.y + 1 > 300)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[BAS];
pos.y++;
pos.y++;
break;

break;

}
break;
}
if (mort)
{
system("pause");
exit(EXIT_SUCCESS);
}

//On met a jour la position de l'ennemi
if(posEnnemi.y > pos.y)
advActuel = adv[HAUT];
if (posEnnemi.y < pos.y)
advActuel = adv[BAS];
if(posEnnemi.x > pos.x)
advActuel = adv[GAUCHE];
if (posEnnemi.x < pos.x)
advActuel = adv[DROITE];

SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
SDL_BlitSurface(advActuel, NULL, ecran, &posEnnemi);
SDL_BlitSurface(cadre, NULL, ecran, &posCadre);
SDL_BlitSurface(caisse, NULL, ecran, &posCaisse);
SDL_BlitSurface(marioActuel, NULL, ecran, &pos);
SDL_BlitSurface(app, NULL, ecran, &posVide);
SDL_BlitSurface(mur, NULL, ecran, &posMur);
SDL_Flip(ecran); /* On met à jour l'affichage */
SDL_BlitSurface(fond, NULL, ecran, &posFond);

}
SDL_FreeSurface(app);
SDL_Quit();
return EXIT_SUCCESS;
}

/*bool Collision(AABB box1,AABB box2)
{
if((box2.x >= box1.x + box1.w) // trop à droite
|| (box2.x + box2.w <= box1.x) // trop à gauche
|| (box2.y >= box1.y + box1.h) // trop en bas
|| (box2.y + box2.h <= box1.y)) // trop en haut
return false;
else
return true;
}*/
int Collision(SDL_Rect box1, SDL_Rect box2)
{
if((box2.x >= box1.x + 16) // trop à droite
|| (box2.x + 16 <= box1.x) // trop à gauche
|| (box2.y >= box1.y + 28) // trop en bas
|| (box2.y + 28 <= box1.y)) // trop en haut
return 1;
else
return 0;
}

La fonction ci-dessus ne fonctionne pas (enfin si mais je ne peux plus bouger dès que je touche le mario vert).

DevWSJ
DevWSJ
Niveau 1
05 octobre 2011 à 18:56:02

:up: :d) Personne ne sait :ouch2: ???

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