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

problème collision SDL

aldi88
aldi88
Niveau 6
17 avril 2011 à 16:30:15

Bonjour a tous

je débute dans la sdl, et je n'ai vraiment pas compris comment faire une collision.Je voudrait que quand le player1 touche le player2 un texte s'affiche, voici mon programme:

  1. ifdef __cplusplus

#include <cstdlib>

  1. else

#include <stdlib.h>

  1. endif
  2. ifdef __APPLE__
  3. include <SDL/SDL.h>
  4. else
  5. include <SDL.h>
  6. endif

void pause();
int main(int argc, char *argv[])
{
void pause();
SDL_Surface *ecran = NULL, *player1 = NULL , *player2 = NULL;
SDL_Rect positionPlayer1;
SDL_Rect positionPlayer2;
SDL_Event event;
int continuer = 1;

SDL_Init(SDL_INIT_VIDEO);

ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);
pause();

/* Chargement de Zozor */
player1 = SDL_LoadBMP("player1.bmp");
SDL_SetColorKey(player1, SDL_SRCCOLORKEY, SDL_MapRGB(player1->format, 0, 0, 255));

/* On centre Zozor à l'écran */
positionPlayer1.x = ecran->w / 2 - player1->w / 2;
positionPlayer1.y = ecran->h / 2 - player1->h / 2;

player2 = SDL_LoadBMP ("player1.bmp");

positionPlayer2.x = 0;
positionPlayer2.y = 0;

while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP: // Flèche haut
positionPlayer1.y--;
break;
case SDLK_DOWN: // Flèche bas
positionPlayer1.y++;
break;
case SDLK_RIGHT: // Flèche droite
positionPlayer1.x++;
break;
case SDLK_LEFT: // Flèche gauche
positionPlayer1.x--;
break;
}
break;
}

SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
SDL_BlitSurface(player1, NULL, ecran, &positionPlayer1); /* On place zozor à sa nouvelle position */
SDL_BlitSurface(player2, NULL , ecran , &positionPlayer2);
SDL_Flip(ecran); /* On met à jour l'affichage */
}

SDL_FreeSurface(player1);
SDL_FreeSurface(player2);
SDL_Quit();

return EXIT_SUCCESS;
}

void pause()
{
int continuer = 1;
SDL_Event event;

while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}

aidez moi svp

tbop2
tbop2
Niveau 10
17 avril 2011 à 16:49:11

La prochaine fois publie ton code sur un wall s'il te plaît, jv.com n'est pas approprié pour afficher du code.

Tout dépend de la tronche de tes objets colisionables. Si ce sont des rectangles il faut qu'avant chaque nouveau rafraîchissement de l'image tu détermines si les deux rectangles s'intersectent.

C'est une première approximation qui ne consomme pas trop d'énergie à l'ordinateur. Après si tu as des images, il faut que tu regardes ensuite sur toute la zone d'intersection si le canal alpha de chaque pixel respectif des deux images superposées est différent de transparent. Si deux pixels non transparents sont au même endroit alors tu en déduis tout de suite qu'il y a normalement une collision.

tbop2
tbop2
Niveau 10
17 avril 2011 à 16:56:12

Donc cette nouvelle partie du code se situerait juste après ton switch événementiel.

aldi88
aldi88
Niveau 6
17 avril 2011 à 17:27:40

Merci de ta répons mais j'ai encore un problème, en fait j'ai fait:

if (Collision = true);
SDL_Quit;

puis:

bool Collision(SDL_Rect player1, SDL_Rect player2)
{
if((player2.x >= player1.x + player1.w) // trop à droite
|| (player2.x + player2.w <= player1.x) // trop à gauche
|| (player2.y >= player1.y + player1.h) // trop en bas
|| (player2.y + player2.h <= player1.y)) // trop en haut
return false;
else
return true;
}

mais il me signale un problème:

error: cannot convert 'bool' to 'SDL_Surface*' in assignment|

tbop2
tbop2
Niveau 10
17 avril 2011 à 17:34:13

Déjà c'est if (Collision == true)

Le compiler doit t'indiquer la ligne de tes problèmes normalement. Là il te dit simplement qu'à cette ligne que tu n'indiques pas que tu essayes de convertir un booléen en surface_SDL, aïe aïe aïe.

tbop2
tbop2
Niveau 10
17 avril 2011 à 17:35:19

Pourquoi tu veux quitter ton application quand il y a une collision ? C'est un comportement un peu bizarre. Tu devrais au moins pour commencer juste envoyer un petit printf en console disant "collision detected".

Pocolo
Pocolo
Niveau 10
17 avril 2011 à 17:43:26

" if (Collision = true);
SDL_Quit; "

Déjà il manque les arguments:

Collision(argument1, argument2)

Ensuite quand on vérifie une valeur on mets toujours deux signes égal, si tu n'en mets qu'un seul il pense que tu veux changer la valeur.
Puis en fait tu n'a même pas obligé de mettre un truc genre "== 1" si ce n'est qu'une question de true ou false, si tu ne mets rien (ex: if( Collision(ceci, cela) ) ça vérifiera si la valeur est positive (true quoi), pour le false tu peux mettre un point d'exclamation devant "Collision".

Puis pour finir SDL_Quit() (tu as oublié les parenthèses d'ailleurs) sert a "fermer" la SDL et tous ses subsystems puis a libérer la mémoire, ça ne dit pas a ton programme de s’arrêter! Tu devrais avoir un joli crash avec ça.

aldi88
aldi88
Niveau 6
17 avril 2011 à 17:45:37

En fait c'était pour simplifier...

et comment je peut convertir un booléen en surface-sdl stp?

tbop2
tbop2
Niveau 10
17 avril 2011 à 17:45:56

Oui donc toutes ces petites bêtises grossières montrent que tu te précipites un peu trop vite sur le forum au lieu de corriger les problèmes au coup par coup à l'aide du compilateur.

Reviens nous voir quand ton code sera un peu plus tiré au clair :ok:

tbop2
tbop2
Niveau 10
17 avril 2011 à 17:48:31

"et comment je peut convertir un booléen en surface-sdl stp? "

Est-ce que tu vois ce qu'est un booleen ? Est-ce que tu vois ce que c'est une surface_SDL ?

Autre exemple :

Est-ce que tu vois ce qu'est un téléski ? Est-ce que tu vois ce qu'est un chocapic ?

Comment convertir un chocapic en téléski ? Voilà une bonne question :)

Ne postes pas un message d'erreur sans la ligne concernée ça n'a pas de sens nous ne sommes pas des devins. Même si là le code d'erreur est totalement explicite et donc ça veut dire que tu essayes de convertir un booleen en surface_SDL.

Moi je pense que tu grilles un peu trop d'étapes du sdz (puisqu'on t'a démasqué petit voyoux :) ) et que limite tu devrais tout reprendre depuis le début.

Pocolo
Pocolo
Niveau 10
17 avril 2011 à 17:49:38

Ah et autre petite erreur, tu as mis un point virgule juste après ton "if", ce n'est pas bon, tu dois écrire directement la commande a exécuter après ton "if", et tu mets seulement un point virgule après la commande en question.

tbop2
tbop2
Niveau 10
17 avril 2011 à 17:58:40

En fait il y a des erreurs et des questions qui ne devraient plus figurer quand on a passé l'étape du premier jeu en console du sdz donc je répéte, j'émets l'hypothèse que tu as voulu aller plus vite que la musique et qu'une bonne relecture et des petits projets de ton imagination avant de s'attaquer au socle SDL ne ferait pas de mal.

aldi88
aldi88
Niveau 6
17 avril 2011 à 18:46:25

ok je pense que je vais suivre t'es conseille, merci pour t'es réponses.

tbop2
tbop2
Niveau 10
17 avril 2011 à 19:54:30

TES conseiLS, TES réponses.

Bonne continuation l'ami. Attention les règles de la programmation sont moins nombreuses et alambiquées que celles de la grammaire française mais le compilateur est lui beaucoup plus sévère que le correcteur orthographique de Word.

caelacanthe
caelacanthe
Niveau 10
17 avril 2011 à 21:16:41

"il faut que tu regardes ensuite sur toute la zone d'intersection si le canal alpha de chaque pixel respectif des deux images superposées est différent de transparent. Si deux pixels non transparents sont au même endroit alors tu en déduis tout de suite qu'il y a normalement une collision. "

:d) le problème de SDL, c'est qu'il n'y a pas de fonctions pour récupérer la couleur d'un pixel d'une surface. :noel:

il est toujours possible de récupérer des bouts de code sur le net, qui iront récupérer les données dans le buffer d'octets de la surface, et ce en fonction de sa profondeur de couleurs (8 bits, 24 bits, monochrome...). mais ils ne sont pas super-fiables :(

Pocolo
Pocolo
Niveau 10
17 avril 2011 à 21:24:24

Il y a un pointeur vers les pixels dans SDL_Surface, tu peux utiliser ça non? :(

caelacanthe
caelacanthe
Niveau 10
17 avril 2011 à 21:56:00

toutafé. c'est ce que font les bouts de code dont je parlais :noel:

http://pastebin.com/mY4jyvH8

:d) mate la tronche du truc. c'est ce que j'utilise dans ISRV2 :(

Pocolo
Pocolo
Niveau 10
17 avril 2011 à 22:01:38

Je vois, quel usage en fais-tu exactement?

Si ce n'est pas trop indiscret. :hap:

caelacanthe
caelacanthe
Niveau 10
17 avril 2011 à 22:04:40

si tu regardes les ressources d'ISRV2, tu vois deux PNG unidimentionnels et en niveaux de gris. ils contiennent respectivement les définitions de découpage des sprites et la géométrie du niveau actuel. le tout stocké dans les couleurs des pixels :oui:

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