Mario-Sokoban from the OpenClassroom C Lesson exercice.

editor.c 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // editor.c
  3. // Mario Sokoban
  4. //
  5. // Created by Benoit Sida on 2014-02-16.
  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 "level.h"
  14. void editor(SDL_Window *ecran, SDL_Surface *screen)
  15. {
  16. SDL_Surface *wall = NULL, *box = NULL, *target = NULL, *mario = NULL, *draw = NULL, *boxOK = NULL, *object = NULL;
  17. SDL_Rect position, posStart, posPointer;
  18. SDL_Event event;
  19. int running = 1, i = 0, j = 0, leftClicOn = 0, rightClicOn = 0, curObject = WALL, continuer = 0, start = 0;
  20. int map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
  21. wall = IMG_Load("sprites/mur.jpg");
  22. box = IMG_Load("sprites/caisse.jpg");
  23. target = IMG_Load("sprites/objectif.png");
  24. mario = IMG_Load("sprites/mario_bas.gif");
  25. draw = IMG_Load("sprites/draw.png");
  26. boxOK = IMG_Load("sprites/caisse_ok.jpg");
  27. if (loadLevel(0, 0, map) == 0) {
  28. exit(EXIT_FAILURE);
  29. }
  30. position.x = 0;
  31. position.y = 0;
  32. SDL_BlitSurface(draw, NULL, screen, &position);
  33. SDL_UpdateWindowSurface(ecran);
  34. while (!continuer) {
  35. SDL_WaitEvent(&event);
  36. switch(event.type)
  37. {
  38. case SDL_QUIT:
  39. exit(EXIT_SUCCESS);
  40. break;
  41. case SDL_KEYDOWN:
  42. switch(event.key.keysym.sym)
  43. {
  44. case SDLK_ESCAPE:
  45. running = 0;
  46. break;
  47. case SDLK_RETURN:
  48. continuer = 1;
  49. break;
  50. case SDLK_SPACE:
  51. continuer = 1;
  52. break;
  53. }
  54. break;
  55. } // Acton du joueur
  56. }
  57. while (running) {
  58. SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 139, 111, 71));
  59. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  60. {
  61. for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  62. {
  63. position.x = i * TAILLE_BLOC;
  64. position.y = j * TAILLE_BLOC;
  65. if (map[i][j] == MARIO) {
  66. start = 1;
  67. posStart.x = position.x;
  68. posStart.y = position.y;
  69. }
  70. switch(map[i][j])
  71. {
  72. case WALL:
  73. SDL_BlitSurface(wall, NULL, screen, &position);
  74. break;
  75. case BOX:
  76. SDL_BlitSurface(box, NULL, screen, &position);
  77. break;
  78. case MARIO:
  79. SDL_BlitSurface(mario, NULL, screen, &position);
  80. break;
  81. case TARGET:
  82. SDL_BlitSurface(target, NULL, screen, &position);
  83. break;
  84. case BOX_OK:
  85. SDL_BlitSurface(boxOK, NULL, screen, &position);
  86. break;
  87. }
  88. }
  89. } // Dessine la map
  90. switch (curObject) {
  91. case WALL:
  92. object = wall;
  93. break;
  94. case BOX:
  95. object = box;
  96. break;
  97. case MARIO:
  98. object = mario;
  99. break;
  100. case TARGET:
  101. object = target;
  102. break;
  103. case BOX_OK:
  104. object = boxOK;
  105. break;
  106. }
  107. SDL_BlitSurface(object, NULL, screen, &posPointer);
  108. SDL_UpdateWindowSurface(ecran);
  109. SDL_WaitEvent(&event);
  110. switch(event.type)
  111. {
  112. case SDL_QUIT:
  113. exit(EXIT_FAILURE);
  114. break;
  115. case SDL_KEYDOWN:
  116. switch(event.key.keysym.sym) {
  117. case SDLK_ESCAPE:
  118. running = 0;
  119. break;
  120. case SDLK_s:
  121. saveLevel(map);
  122. break;
  123. case SDLK_l:
  124. loadLevel(0, 0, map);
  125. break;
  126. case SDLK_1:
  127. curObject = WALL;
  128. break;
  129. case SDLK_2:
  130. curObject = BOX;
  131. break;
  132. case SDLK_3:
  133. curObject = TARGET;
  134. break;
  135. case SDLK_4:
  136. curObject = MARIO;
  137. break;
  138. case SDLK_5:
  139. curObject = BOX_OK;
  140. break;
  141. }
  142. break;
  143. case SDL_MOUSEBUTTONDOWN:
  144. if (event.button.button == SDL_BUTTON_LEFT)
  145. {
  146. if (curObject == MARIO) {
  147. map[posStart.x/TAILLE_BLOC][posStart.y/TAILLE_BLOC] = VIDE;
  148. start = 0;
  149. }
  150. map[event.button.x / TAILLE_BLOC][event.button.y / TAILLE_BLOC] = curObject;
  151. leftClicOn = 1;
  152. }
  153. else if (event.button.button == SDL_BUTTON_RIGHT)
  154. {
  155. map[event.button.x / TAILLE_BLOC][event.button.y /TAILLE_BLOC] = VIDE;
  156. rightClicOn = 1;
  157. }
  158. break;
  159. case SDL_MOUSEBUTTONUP:
  160. if (event.button.button == SDL_BUTTON_LEFT)
  161. leftClicOn = 0;
  162. else if (event.button.button == SDL_BUTTON_RIGHT)
  163. rightClicOn = 0;
  164. break;
  165. case SDL_MOUSEMOTION:
  166. if (leftClicOn)
  167. {
  168. if (curObject == MARIO) {
  169. break;
  170. }
  171. map[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = curObject;
  172. }
  173. else if (rightClicOn) //
  174. {
  175. map[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = VIDE;
  176. }
  177. else {
  178. posPointer.x = event.motion.x;
  179. posPointer.y = event.motion.y;
  180. break;
  181. }
  182. break;
  183. } // Acton du joueur
  184. } // Boucle principale
  185. SDL_FreeSurface(wall);
  186. SDL_FreeSurface(box);
  187. SDL_FreeSurface(target);
  188. SDL_FreeSurface(mario); // Libère la mémoire
  189. }