Mario-Sokoban from the OpenClassroom C Lesson exercice.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. // menu.c
  3. // Mario Sokoban
  4. //
  5. // Created by Benoit Sida on 2014-02-15.
  6. // Copyright (c) 2014 Benoit Sida. All rights reserved.
  7. //
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <SDL2/SDL.h>
  11. #include <SDL2_image/SDL_image.h>
  12. #include "constantes.h"
  13. #include "game.h"
  14. #include "level.h"
  15. int menu(SDL_Window *ecran, SDL_Surface *screen)
  16. {
  17. int choice = 0, running = 1, i = 0, j = 0, target_r = 0;
  18. int map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
  19. SDL_Event event;
  20. SDL_Surface *mario[4] = {NULL};
  21. SDL_Surface *wall = NULL, *marioActuel = NULL, *box = NULL, *target = NULL, *boxOK = NULL, *menu = NULL;
  22. SDL_Rect position, posMario;
  23. wall = IMG_Load("sprites/mur.jpg");
  24. box = IMG_Load("sprites/caisse.jpg");
  25. boxOK = IMG_Load("sprites/caisse_ok.jpg");
  26. target = IMG_Load("sprites/objectif.png");
  27. menu = IMG_Load("sprites/menu.png");
  28. mario[HAUT] = IMG_Load("sprites/mario_haut.gif");
  29. mario[BAS] = IMG_Load("sprites/mario_bas.gif");
  30. mario[GAUCHE] = IMG_Load("sprites/mario_gauche.gif");
  31. mario[DROITE] = IMG_Load("sprites/mario_droite.gif");
  32. marioActuel = mario[BAS];
  33. if (loadLevel(0, 0, map) == 0) {
  34. exit(EXIT_FAILURE);
  35. }
  36. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  37. {
  38. for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  39. {
  40. if (map[i][j] == MARIO)
  41. {
  42. posMario.x = i;
  43. posMario.y = j;
  44. map[i][j] = VIDE;
  45. }
  46. }
  47. }
  48. while (running) {
  49. SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 139, 111, 71));
  50. target_r = 0;
  51. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  52. {
  53. for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  54. {
  55. position.x = i * TAILLE_BLOC;
  56. position.y = j * TAILLE_BLOC;
  57. switch(map[i][j])
  58. {
  59. case WALL:
  60. SDL_BlitSurface(wall, NULL, screen, &position);
  61. break;
  62. case BOX:
  63. SDL_BlitSurface(box, NULL, screen, &position);
  64. break;
  65. case BOX_OK:
  66. SDL_BlitSurface(boxOK, NULL, screen, &position);
  67. break;
  68. case TARGET:
  69. SDL_BlitSurface(target, NULL, screen, &position);
  70. target_r = 1;
  71. break;
  72. }
  73. }
  74. } // Dessine la carte
  75. position.x = 0;
  76. position.y = 0;
  77. SDL_BlitSurface(menu, NULL, screen, &position);
  78. position.x = posMario.x * TAILLE_BLOC;
  79. position.y = posMario.y * TAILLE_BLOC;
  80. SDL_BlitSurface(marioActuel, NULL, screen, &position); // Place le joueur
  81. SDL_UpdateWindowSurface(ecran);
  82. if (!target_r) {
  83. choice = 1;
  84. running = 0; // Test de victoire
  85. }
  86. SDL_WaitEvent(&event);
  87. switch (event.type){
  88. case SDL_QUIT:
  89. exit(EXIT_SUCCESS);
  90. break;
  91. case SDL_KEYDOWN:
  92. switch (event.key.keysym.sym) {
  93. case SDLK_ESCAPE:
  94. exit(EXIT_SUCCESS);
  95. break;
  96. case SDLK_1:
  97. choice = 1;
  98. running = 0;
  99. break;
  100. case SDLK_2:
  101. choice = 2;
  102. running = 0;
  103. break;
  104. case SDLK_UP:
  105. marioActuel = mario[HAUT];
  106. mooveMario(map, &posMario, HAUT);
  107. break;
  108. case SDLK_DOWN:
  109. marioActuel = mario[BAS];
  110. mooveMario(map, &posMario, BAS);
  111. break;
  112. case SDLK_RIGHT:
  113. marioActuel = mario[DROITE];
  114. mooveMario(map, &posMario, DROITE);
  115. break;
  116. case SDLK_LEFT:
  117. marioActuel = mario[GAUCHE];
  118. mooveMario(map, &posMario, GAUCHE);
  119. break;
  120. }
  121. }
  122. } // Wait for action
  123. SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 139, 111, 71));
  124. SDL_UpdateWindowSurface(ecran);
  125. SDL_FreeSurface(wall);
  126. SDL_FreeSurface(box);
  127. SDL_FreeSurface(boxOK);
  128. SDL_FreeSurface(target);
  129. for (i = 0 ; i < 4 ; i++)
  130. SDL_FreeSurface(mario[i]); // Libère la mémoire
  131. return choice;
  132. }