Se connecter / S'enregistrer
Votre question

Afficher un message qui disparait au bout de 10 seconde

Tags :
  • Programmation
  • Écrans
Dernière réponse : dans Programmation
25 Janvier 2009 11:00:50

bonjour
je suis en train de realiser mon petit jeux 2d sdl et je voudais que si un joueur et sur un objectif sa affiche un messsage bravo et au bout de 10 seconde sa change de niveau . j'ai essayer de code sa mais j'ai plusieur erreur :
-le message ne s'affiche pas
-le niveau n'est pas charger au bout de 10 seconde
-la variable qui gere le temps n'est pas remis a 0 .
voici le codele plus inportant :
  1. if(carte[positionJoueur.x][positionJoueur.y] == OBJECTIF)
  2. {
  3.  
  4. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  5. positiontexte.x = 60;
  6. positiontexte.y = 370;
  7.  
  8. tempsActuel = SDL_GetTicks();
  9. if (tempsActuel - tempsPrecedent > 10000)
  10. {
  11. modesimple(ecran);
  12. tempsActuel=0;
  13. tempsPrecedent = tempsActuel;
  14. }
  15. SDL_BlitSurface(texte, NULL, ecran, &positiontexte); /* Blit du texte par-dessus */
  16. SDL_Flip(ecran);
  17.  
  18. TTF_CloseFont(police);
  19. TTF_Quit();
  20. }


et voici le code en entiers :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL.h>
  4. #include <SDL_image.h>
  5. #include <SDL_ttf.h>
  6.  
  7. #include "fichier.h"
  8. #include "jonnysolojouer.h"
  9. #include "fichiers.h"
  10.  
  11.  
  12. void jonnysolojouer(SDL_Surface* ecran)
  13. {
  14. SDL_Surface *mechant = NULL;
  15. SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
  16. SDL_Surface *mur = NULL, *objectif = NULL, *marioActuel = NULL;
  17. SDL_Rect position, positionJoueur , objectifatteind ;
  18. SDL_Event event;
  19. int tempsPrecedent = 0, tempsActuel = 0;
  20. SDL_Surface *texte = NULL;
  21. SDL_Rect positiontexte;
  22. TTF_Font *police = NULL;
  23. SDL_Color couleurNoire = {154, 156, 200};
  24. int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
  25. int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
  26.  
  27. // Chargement des sprites (décors, personnage...)
  28. mur = IMG_Load("image/objet/mur.jpg");
  29. objectif = IMG_Load("image/objet/objectif.gif");
  30. mario[BAS] = IMG_Load("image/hero/DarkKnight-Front.gif");
  31. mario[GAUCHE] = IMG_Load("image/hero/DarkKnight-Left.gif");
  32. mario[HAUT] = IMG_Load("image/hero/DarkKnight-Back.gif");
  33. mario[DROITE] = IMG_Load("image/hero/darkknight gauche.GIF");
  34. marioActuel = mario[BAS]; // Mario sera dirigé vers le bas au départ
  35. police = TTF_OpenFont("angelina.ttf", 65);
  36. /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
  37. texte = TTF_RenderText_Blended(police, "s etait facile hein mais maintenant on vas voir", couleurNoire);
  38.  
  39.  
  40. // Chargement du niveau
  41. if (!chargerNiveau(carte))
  42. exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
  43.  
  44. // Recherche de la position de Mario au départ
  45. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  46. {
  47. for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  48. {
  49. if (carte[i][j] == MARIO) // Si Mario se trouve à cette position sur la carte
  50. {
  51. positionJoueur.x = i;
  52. positionJoueur.y = j;
  53. carte[i][j] = VIDE;
  54. }
  55. }
  56. }
  57.  
  58. // Activation de la répétition des touches
  59. SDL_EnableKeyRepeat(100, 100);
  60.  
  61. while (continuer)
  62. {
  63. SDL_WaitEvent(&event);
  64. switch(event.type)
  65. {
  66. case SDL_QUIT:
  67. continuer = 0;
  68. break;
  69. case SDL_KEYDOWN:
  70. switch(event.key.keysym.sym)
  71. {
  72. case SDLK_UP:
  73. marioActuel = mario[HAUT];
  74. deplacerJoueur(carte, &positionJoueur, HAUT);
  75. break;
  76. case SDLK_DOWN:
  77. marioActuel = mario[BAS];
  78. deplacerJoueur(carte, &positionJoueur, BAS);
  79. break;
  80. case SDLK_RIGHT:
  81. marioActuel = mario[DROITE];
  82. deplacerJoueur(carte, &positionJoueur, DROITE);
  83. break;
  84. case SDLK_r:
  85. jonnysolojouer(ecran);
  86. break;
  87. case SDLK_LEFT:
  88. marioActuel = mario[GAUCHE];
  89. deplacerJoueur(carte, &positionJoueur, GAUCHE);
  90. break;
  91. }
  92. break;
  93. }
  94.  
  95.  
  96. // Effacement de l'écran
  97. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  98.  
  99. // Placement des objets à l'écran
  100. objectifsRestants = 0;
  101.  
  102. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  103. {
  104. for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  105. {
  106. position.x = i * TAILLE_BLOC;
  107. position.y = j * TAILLE_BLOC;
  108.  
  109. switch(carte[i][j])
  110. {
  111. case MUR:
  112. SDL_BlitSurface(mur, NULL, ecran, &position);
  113. break;
  114. case OBJECTIF:
  115. SDL_BlitSurface(objectif, NULL, ecran, &position);
  116. objectifsRestants = 1;
  117. objectifatteind.x = position.x;
  118. objectifatteind.y = position.y;
  119. break;
  120. }
  121. }
  122. }
  123.  
  124.  
  125. // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
  126.  
  127. if(carte[positionJoueur.x][positionJoueur.y] == OBJECTIF)
  128. {
  129.  
  130. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  131. positiontexte.x = 60;
  132. positiontexte.y = 370;
  133.  
  134. tempsActuel = SDL_GetTicks();
  135. if (tempsActuel - tempsPrecedent > 10000)
  136. {
  137. modesimple(ecran);
  138. tempsActuel=0;
  139. tempsPrecedent = tempsActuel;
  140. }
  141. SDL_BlitSurface(texte, NULL, ecran, &positiontexte); /* Blit du texte par-dessus */
  142. SDL_Flip(ecran);
  143.  
  144. TTF_CloseFont(police);
  145. TTF_Quit();
  146. }
  147.  
  148. // On place le joueur à la bonne position
  149. position.x = positionJoueur.x * TAILLE_BLOC;
  150. position.y = positionJoueur.y * TAILLE_BLOC;
  151. SDL_BlitSurface(marioActuel, NULL, ecran, &position);
  152.  
  153.  
  154. SDL_Flip(ecran);
  155. }
  156.  
  157.  
  158. // Désactivation de la répétition des touches (remise à 0)
  159. SDL_EnableKeyRepeat(0, 0);
  160. SDL_FreeSurface(texte);
  161. SDL_FreeSurface(mur);
  162. SDL_FreeSurface(objectif);
  163. for (i = 0 ; i < 4 ; i++)
  164. SDL_FreeSurface(mario[i]);
  165.  
  166. }
  167.  
  168. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
  169. {
  170. switch(direction)
  171. {
  172. case HAUT:
  173. if (pos->y - 1 < 0) // Si le joueur dépasse l'écran, on arrête
  174. break;
  175. if (carte[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
  176. break;
  177. // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
  178. if ((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) &&
  179. (pos->y - 2 < 0 || carte[pos->x][pos->y - 2] == MUR ||
  180. carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
  181. break;
  182.  
  183. // Si on arrive là, c'est qu'on peut déplacer le joueur !
  184. // On vérifie d'abord s'il y a une caisse à déplacer
  185.  
  186.  
  187. pos->y--; // On peut enfin faire monter le joueur (oufff !)
  188. break;
  189.  
  190.  
  191. case BAS:
  192. if (pos->y + 1 >= NB_BLOCS_HAUTEUR)
  193. break;
  194. if (carte[pos->x][pos->y + 1] == MUR)
  195. break;
  196.  
  197. if ((carte[pos->x][pos->y + 1] == CAISSE || carte[pos->x][pos->y + 1] == CAISSE_OK) &&
  198. (pos->y + 2 >= NB_BLOCS_HAUTEUR || carte[pos->x][pos->y + 2] == MUR ||
  199. carte[pos->x][pos->y + 2] == CAISSE || carte[pos->x][pos->y + 2] == CAISSE_OK))
  200. break;
  201.  
  202.  
  203.  
  204.  
  205. pos->y++;
  206. break;
  207.  
  208.  
  209. case GAUCHE:
  210. if (pos->x - 1 < 0)
  211. break;
  212. if (carte[pos->x - 1][pos->y] == MUR)
  213. break;
  214.  
  215. if ((carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK) &&
  216. (pos->x - 2 < 0 || carte[pos->x - 2][pos->y] == MUR ||
  217. carte[pos->x - 2][pos->y] == CAISSE || carte[pos->x - 2][pos->y] == CAISSE_OK))
  218. break;
  219.  
  220.  
  221.  
  222.  
  223. pos->x--;
  224. break;
  225.  
  226.  
  227. case DROITE:
  228. if (pos->x + 1 >= NB_BLOCS_LARGEUR)
  229. break;
  230. if (carte[pos->x + 1][pos->y] == MUR)
  231. break;
  232.  
  233. if ((carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK) &&
  234. (pos->x + 2 >= NB_BLOCS_LARGEUR || carte[pos->x + 2][pos->y] == MUR ||
  235. carte[pos->x + 2][pos->y] == CAISSE || carte[pos->x + 2][pos->y] == CAISSE_OK))
  236. break;
  237.  
  238.  
  239.  
  240. pos->x++;
  241. break;
  242. }
  243. }

merci

Autres pages sur : afficher message disparait bout seconde

a b L Programmation
25 Janvier 2009 18:28:52

J'imagine que c'est modesimple() qui affiche ton message.

Déjà, tempsPrecedent n'est pas initialisé au premier passage.
Ensuite, tu as inversé le test, car tu affiche le message si la différence de temps est < à 10s.
Enfin assure toi que tu puisses afficher à nouveau le message (pouvoir réinitialier tempsPrecedent).
m
0
l
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