Se connecter / S'enregistrer
Votre question

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

Tags :
  • Programmation
Dernière réponse : dans Programmation
8 Mars 2007 20:33:55

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 ^^ :

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



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 :



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

Autres pages sur : probleme afficher image condition

a b L Programmation
8 Mars 2007 20:52:55

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.
)
8 Mars 2007 20:57:23

J'ai fais

  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... ^^)
Contenus similaires
a b L Programmation
8 Mars 2007 21:09:09

En début, tu déclares une variable, qui indique l'état de ton jeu
  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:
  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.  
  10. if(etat == 0 && positionMitrailletteTir.x > 490 && positionCible1.x < 510)
  11. {
  12. etat = 1;
  13. SDL_BlitSurface(cible1Trou, NULL, ecran, &positionCible1Trou);
  14. }
  15.  
  16. break;
  17. }
  18. //...
  19.  
  20. } //fermeture du switch
  21.  
  22. }//fermeture du while


9 Mars 2007 12:52:09

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

  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: 
10 Mars 2007 14:14:09

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 :

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4.  
  5. #include <SDL\SDL_image.h>
  6. #include <SDL/SDL_ttf.h>
  7. #include <FMOD/fmod.h>
  8.  
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.  
  13.  
  14. SDL_Surface *ecran = NULL, *viseur = NULL, *souris = NULL, *sang = NULL;
  15.  
  16.  
  17. SDL_Rect position, positionSouris, positionSang;
  18.  
  19. SDL_Event event;
  20. int continuer = 1;
  21.  
  22.  
  23.  
  24. /* Initialisation de la SDL */
  25. SDL_Init(SDL_INIT_VIDEO);
  26.  
  27.  
  28.  
  29. SDL_ShowCursor(SDL_DISABLE); // La souris est invisible dans la fenetre
  30.  
  31.  
  32. ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
  33.  
  34.  
  35. SDL_WM_SetCaption("Jeu de tir", NULL);
  36.  
  37.  
  38. viseur = IMG_Load("viseur.png");
  39. souris = IMG_Load("souris1.jpg");
  40. sang = IMG_Load("sang.jpg");
  41.  
  42.  
  43. positionSouris.x = 200;
  44. positionSouris.y = 200;
  45.  
  46.  
  47. positionSang.x = positionSouris.x;
  48. positionSang.y = positionSouris.y;
  49.  
  50.  
  51. SDL_WarpMouse(200, 200);
  52.  
  53.  
  54. int etat = 0;
  55.  
  56.  
  57. while (continuer)
  58. {
  59. SDL_WaitEvent(&event);
  60.  
  61.  
  62. switch(event.type)
  63. {
  64. case SDL_QUIT:
  65. continuer = 0;
  66. break;
  67.  
  68.  
  69. case SDL_MOUSEMOTION: // Le viseur prend la place de la souris
  70. position.x = event.motion.x - (viseur->w / 2);
  71. position.y = event.motion.y - (viseur->h / 2);
  72. break;
  73.  
  74.  
  75. case SDL_MOUSEBUTTONDOWN:
  76.  
  77. if (event.button.button == SDL_BUTTON_LEFT)
  78. {
  79. if(etat == 0 && event.motion.x == positionSouris.x && event.motion.y == positionSouris.y)
  80. // C'est ici que jveux faire un tir de zone !
  81. {
  82. etat = 1;
  83.  
  84. souris = sang;
  85. break;
  86. }
  87. }
  88. }
  89.  
  90.  
  91.  
  92. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  93.  
  94.  
  95.  
  96. SDL_BlitSurface(souris, NULL, ecran, &positionSouris);
  97. SDL_BlitSurface(viseur, NULL, ecran, &position);
  98.  
  99. SDL_Flip(ecran);
  100. }
  101.  
  102.  
  103. SDL_FreeSurface(viseur);
  104. SDL_FreeSurface(souris);
  105. SDL_FreeSurface(sang);
  106.  
  107.  
  108. /* On ferme la SDL */
  109. SDL_Quit();
  110.  
  111.  
  112. return EXIT_SUCCESS;
  113. }



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
a b L Programmation
10 Mars 2007 18:28:01

* 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

10 Mars 2007 19:28:02

Je trouve pas :( 

J'ai fait ceci :

  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 :

  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 ^^
a b L Programmation
10 Mars 2007 20:18:40

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" ;) 

10 Mars 2007 20:38:28

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 ;) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS