Tom's Guide > Forum > Programmation > [C] : Probleme pour afficher une image avec une condition.

[C] : Probleme pour afficher une image avec une condition.

Forum Programmation : [C] : Probleme pour afficher une image avec une condition.

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonsoir a tous,
Tout d'abord je tiens a m'exscuser du titre un peu long parce que je savais pas quoi mettre ! ^^

Alors voila mon probleme :
J'ai 4 images : une mitraillette normal, une meme mitraillette mais avec du "feu" autour (comme si on tirait), une cible, et une cible troué.

J'ai donc afficher la mitraillette normal, et quand on appuie sur Espace : ça charge l'image de la mitraillette en tir et donc ça fait comme si on tirait.
J'ai aussi afficher la cible plus haut sur la fenetre (pour faire un effet de distance entre l'arme et la cible).

Et je voulais ecrire dans une condition :
SI la position x (de gauche a droite) de la mitraillette en tir est égale a la position x de la cible ALORS on charge l'image de la cible trouée.

Ce qui fait comme si on avait tiré sur la cible.
Le probleme c'est que je ne sais pas ou placer ma condition dans mon code !
Si vous pouvez m'aidez ou me donnez des conseils, je vous en remercie, voici donc mon code ^^ :

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. int main(int argc, char *argv[])
  5. {
  6.     // On créer des surfaces pour chaque pointeur
  7.     SDL_Surface *ecran = NULL, *mitraillette = NULL, *mitraillette_tir = NULL, *cible1 = NULL, *cible1Trou = NULL;
  8.     SDL_Rect positionMitraillette, positionMitrailletteTir, positionCible1, positionCible1Trou;
  9.     SDL_Event event;
  10.     int continuer = 1;
  11.     SDL_Init(SDL_INIT_VIDEO);
  12.     ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
  13.     SDL_WM_SetCaption("Jeu de tir", NULL);
  14.     // On charge toutes les images du jeu.
  15.     mitraillette = SDL_LoadBMP("mitraillette.bmp" );
  16.     mitraillette_tir = SDL_LoadBMP("mitraillette_tir.bmp" );
  17.     cible1 = SDL_LoadBMP("cible1.bmp" );
  18.     cible1Trou = SDL_LoadBMP("cible1Trou.bmp" );
  19.     // On rend transparente la couleur de fond bleu des images.
  20.     SDL_SetColorKey(mitraillette, SDL_SRCCOLORKEY, SDL_MapRGB(mitraillette->format, 0, 0, 255));
  21.     SDL_SetColorKey(mitraillette_tir, SDL_SRCCOLORKEY, SDL_MapRGB(mitraillette_tir->format, 0, 0, 255));
  22.     SDL_SetColorKey(cible1, SDL_SRCCOLORKEY, SDL_MapRGB(cible1->format, 0, 0, 255));
  23.     SDL_SetColorKey(cible1Trou, SDL_SRCCOLORKEY, SDL_MapRGB(cible1Trou->format, 0, 0, 255));
  24.     // Ici, on indique les positions de chaque image.
  25.     positionMitraillette.x = 320;
  26.     positionMitraillette.y = 350;
  27.     positionMitrailletteTir.x = positionMitraillette.x;
  28.     positionMitrailletteTir.y = positionMitraillette.y;
  29.     positionCible1.x = 320;
  30.     positionCible1.y = 90;
  31.     positionCible1Trou.x = positionCible1.x;
  32.     positionCible1Trou.y = positionCible1.y;
  33. // Repetition des touches.
  34. SDL_EnableKeyRepeat(10, 10);
  35. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  36. SDL_BlitSurface(mitraillette, NULL, ecran, &positionMitraillette);
  37. SDL_BlitSurface(cible1, NULL, ecran, &positionCible1);
  38. SDL_Flip(ecran);
  39.   while (continuer)
  40. {
  41.     SDL_WaitEvent(&event);
  42.     switch(event.type)
  43.     {
  44.         case SDL_QUIT:
  45.             continuer = 0;
  46.             break;
  47.         case SDL_KEYDOWN:
  48.             switch (event.key.keysym.sym)
  49.             {
  50.                 // Si la touche espace est enfoncée, on affiche l'image de la mitraillette en tir.
  51.                 case SDLK_SPACE:
  52.                     SDL_BlitSurface(mitraillette_tir, NULL, ecran, &positionMitrailletteTir);
  53.                     SDL_Flip(ecran);
  54.                     break;
  55.             }
  56.         case SDL_KEYUP:
  57.             switch (event.key.keysym.sym)
  58.             {
  59.                 // Et quand la touche espace est relachée, on ré-affiche l'image de la mitraillette normal.
  60.                 case SDLK_SPACE:
  61.                     SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  62.                     SDL_BlitSurface(cible1, NULL, ecran, &positionCible1);
  63.                     SDL_BlitSurface(mitraillette, NULL, ecran, &positionMitraillette);
  64.                     SDL_Flip(ecran);
  65.                     break;
  66.             }
  67.             break;
  68.     }
  69. }
  70.         // On met a jour l'ecran
  71.         SDL_Flip(ecran);
  72.     // Liberation de la mémoire et c'i finit ! :)
  73.     SDL_FreeSurface(mitraillette);
  74.     SDL_FreeSurface(mitraillette_tir);
  75.     SDL_FreeSurface(cible1);
  76.     SDL_FreeSurface(cible1Trou);
  77.     SDL_Quit();
  78.     return EXIT_SUCCESS;
  79. }




Comme vous le voyez, j'ai fait expres de mettre la position X de la cible et de la mitraillette au meme endroit pour que quand on tire (j'ai pas encore mis les déplacements), ça touche directement la cible !

Voici un screenshot :

http://img252.imageshack.us/img252/8732/screencibledc3.th.jpg

Je vois pas quoi dire de plus, merci et désolé pour le ptit roman :D
Ptit résumé du probleme :
Afficher l'image de la cible troué dans une condition (que j'ai mis plus haut)

Et encore merci d'avance


Message édité par Kicko le 08-03-2007 à 20:36:28
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Tu peux faire le test juste après avoir tiré.
Ne fait pas un test (x == 500), mais plutot un test dans une zone : (x > 490 && x < 510.
)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

J'ai fais

Code :
  1. if(positionMitrailletteTir.x > 490 && positionCible1.x < 510)
  2. {
  3.     SDL_BlitSurface(cible1Trou, NULL, ecran, &positionCible1Trou);
  4. }



en dehors de la boucle principale...
Le programme se lance mais quand je tire, ça n'affiche pas la cible troué

En faite ce que je voudrais savoir, c'est ou placé ma condition pour qu'elle fonctionne et quel shéma de code je dois faire (si x = y alors etc... ^^)

Répondre à Kicko

En début, tu déclares une variable, qui indique l'état de ton jeu

Code :
  1. int etat = 0;


Tu commence à 0, c'est le mode que tu as actuellement. L'état 1 sera l'état où tu auras détruit la cible. Donc, il te faut passer de l'état 0 à l'état 1 en faisant le test que tu as fait, mais fait le dans le CASE:

Code :
  1. //...
  2.         case SDL_KEYDOWN:
  3.             switch (event.key.keysym.sym)
  4.             {
  5.                 // Si la touche espace est enfoncée, on affiche l'image de la mitraillette en tir.
  6.                 case SDLK_SPACE:
  7.                       SDL_BlitSurface(mitraillette_tir, NULL, ecran, &positionMitrailletteTir);
  8.                       SDL_Flip(ecran);
  9.                       if(etat == 0 && positionMitrailletteTir.x > 490 && positionCible1.x < 510)
  10.                       {
  11.                             etat = 1;
  12.                             SDL_BlitSurface(cible1Trou, NULL, ecran, &positionCible1Trou);
  13.                       }
  14.                       break;
  15.               }
  16. //...
  17.   } //fermeture du switch
  18. }//fermeture du while



------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Ca marche impec :)
En faite au début ça s'affichait pas mais j'ai mis dans le if :

Code :
  1. if(etat == 0 && positionMitraillette.x == positionCible1.x)
  2. {
  3.   etat = 1;
  4.   cible1 = cible1Trou;
  5. }



Et ça fonctionnait ^^
Je te remercie, tu m'as vraiment aidé :jap:


Message édité par Kicko le 09-03-2007 à 12:52:40
Répondre à Kicko

Re-bonjour la compagnie ^^
Je voudrais pas recréér de post pour ça mais j'ai un autre ptit probleme !

Si je fais bouger la cible, quand on tire dessus on ne connaitra pas sa position !
Et je voudrais faire un tir dans une "zone" comme "Criky" la fait en dessous...
Sauf que la c'est pas la meme chose !

J'ai décidé de faire autrement, sur mon code, je met un viseur a la place de la souris, et je place une cible (une souris en faite :D > animal bien sur), et quand on tire dessus ça affiche une tache de sang.

Ca je sais le faire, mais si jveux faire déplacé la cible et que jveux faire un tir de zone (ça veut dire que meme si on tire 10px a coté ça marche), comment faire ?

Puisque la position de la cible ne sera jamais la meme puisqu'elle bougera, comment faire pour creer un tir de zone ?

Merci !

Voici mon code si jamais :

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. #include <SDL\SDL_image.h>
  5. #include <SDL/SDL_ttf.h>
  6. #include <FMOD/fmod.h>
  7. int main(int argc, char *argv[])
  8. {
  9.     SDL_Surface *ecran = NULL, *viseur = NULL, *souris = NULL, *sang = NULL;
  10.     SDL_Rect position, positionSouris, positionSang;
  11.     SDL_Event event;
  12.     int continuer = 1;
  13.     /* Initialisation de la SDL */
  14.     SDL_Init(SDL_INIT_VIDEO);
  15.     SDL_ShowCursor(SDL_DISABLE); // La souris est invisible dans la fenetre
  16.     ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
  17.     SDL_WM_SetCaption("Jeu de tir", NULL);
  18.     viseur = IMG_Load("viseur.png" );
  19.     souris = IMG_Load("souris1.jpg" );
  20.     sang = IMG_Load("sang.jpg" );
  21.     positionSouris.x = 200;
  22.     positionSouris.y = 200;
  23.     positionSang.x = positionSouris.x;
  24.     positionSang.y = positionSouris.y;
  25.     SDL_WarpMouse(200, 200);
  26.     int etat = 0;
  27.     while (continuer)
  28.     {
  29.         SDL_WaitEvent(&event);
  30.         switch(event.type)
  31.         {
  32.             case SDL_QUIT:
  33.                 continuer = 0;
  34.                 break;
  35.             case SDL_MOUSEMOTION: // Le viseur prend la place de la souris
  36.                 position.x = event.motion.x - (viseur->w / 2);
  37.                 position.y = event.motion.y - (viseur->h / 2);
  38.                 break;
  39.             case SDL_MOUSEBUTTONDOWN:
  40.             if (event.button.button == SDL_BUTTON_LEFT)
  41.             {
  42.                 if(etat == 0 && event.motion.x == positionSouris.x && event.motion.y == positionSouris.y)
  43. // C'est ici que jveux faire un tir de zone !
  44.                 {
  45.                     etat = 1;
  46.                     souris = sang;
  47.                     break;
  48.                 }
  49.             }
  50.         }
  51.         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  52.         SDL_BlitSurface(souris, NULL, ecran, &positionSouris);
  53.         SDL_BlitSurface(viseur, NULL, ecran, &position);
  54.         SDL_Flip(ecran);
  55.     }
  56. SDL_FreeSurface(viseur);
  57. SDL_FreeSurface(souris);
  58. SDL_FreeSurface(sang);
  59.     /* On ferme la SDL */
  60.     SDL_Quit();
  61.     return EXIT_SUCCESS;
  62. }




Encore merci !

EDIT : Désolé ça met tout en pavé (le code) malgré les sauts de ligne que j'ai fait dans le message >><<
J'espere que ça sera lisible


Message édité par Kicko le 10-03-2007 à 14:17:08
Répondre à Kicko

* Pour une zone carrée:

si "zoneX" et "zoneY" sont la position centrale de la zone, si la moitié de largeur et hauteur de la zone est "taille", si la position de la souris est "x" et "y", alors il suffit de faire le test des 4 droites: x > zoneX - taille && x < zoneX + taille && y > zoneY - taille && y < zoneY + taille

* Pour une zone circulaire (moins performant car plus de calculs) :

Il faut calculer la distance entre le centre de la zone et le curseur, et il suffit de tester si la distance est inférieure au rayon du cercle.
Mathématiquement, c'est Pythagore:
Racine((zoneX - x)² + (zoneY - y)²) < rayon
Le calcul de racine étant complexe (et donc prend du temps), il faut faire le test en élevant tout au carré:
(zoneX - x) * (zoneX - x) + (zoneY - y) * (zoneY - y) < rayonCarre
donc si on teste une distance de 100 pixels, il faudra que rayonCarre = 10000

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Je trouve pas :(

J'ai fait ceci :

Code :
  1. int ZoneX = (640 / 2) - (220 / 2);
  2.     int ZoneY = (480 / 2) - (180 / 2);
  3.     int taille = ((640 / 2) - (220 / 2)) + ((480 / 2) - (180 / 2));


(Je ferais plus beau apres...)

Et dans mon if :

Code :
  1. if(etat == 0 && event.motion.x > ZoneX - taille && event.motion.x < ZoneX + taille && event.motion.y > ZoneY - taille && event.motion.y < ZoneY + taille)



D'ou la formule que tu m'as donné...
puisque x = position dla souris.x et y = position dla souris.y, je remplace les X et Y par event.motion.x et ".".y.
J'ai déclaré ZoneX étant le milieu dla largeur et ZoneY étant la moitié dla hauteur et taille = la moitié de la largeur et hauteur...

J'ai du me gourrer quelque part (je suis pas trop doué dans les gros calculs comme ça :na:

En faite ce code marche, mais quand je clique, ça tue automatiquement la cible...Meme si jsui a 200px de la cible...
Si on remplace le "+" de "taille" par un "-" , je dois encore une fois tirer pile poil ou est placé le coin en haut a gauche de l'image. (0x et 0y pour l'image en faite ^^)

Faudrait en faite creer une variable qui dit a combien de pixel je veux que ça tire maximum non ? (C'est ptet ce que tu voulais me dire par ZoneX et ZoneY ou par taille ? )

Encore Merci ^^


Message édité par Kicko le 10-03-2007 à 19:29:29
Répondre à Kicko

Le test est correct, c'est le calcul de "taille" qui a l'air bizarre. "taille" n'est que la largeur du carré. Si tu veux que ça tue à 10pixels, met 10 dans taille.

Citation :

Faudrait en faite creer une variable qui dit a combien de pixel je veux que ça tire maximum non ?


En fait c'est "taille" ;)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Si je met 10 dans "taille", ça ne tue plus la cible quelque soit la position...
Et j'ai mis la largeur dans "taille" mais ça tue sur une trop grande distance alors j'ai changé et j'ai mis :

(400 / 2) - (200 / 2)

Ca tue aux bons alentours ^^
Encore une fois tu m'as aidé merci :)

Dés que j'aurais fini le jeu etc.. je ferais ptet un passage ici pour le mettre et le presenté (bon c'est du bas niveau mais c'est toujours ça ^^)

Merci encore, je pense ne plus avoir de probleme pour la suite ;)

Répondre à Kicko
Tom's Guide > Forum > Programmation > [C] : Probleme pour afficher une image avec une condition.
Aller à :

Il y a 320 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens