Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.26 KB | None | 0 0
  1. /**
  2. * spacexplore.c -- прототип игры управления звездолетом
  3. *
  4. * Copyright (c) 2017, Alexander Borodin <aborod@petrsu.ru>
  5. *
  6. * This code is licensed under a MIT-style license.
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #include <SDL.h>
  14.  
  15. #define VXD 5
  16. #define VYD 5
  17.  
  18.  
  19. /* Описание экрана игры */
  20. typedef struct _gamescreen {
  21. /* Поверхность отрисовки */
  22. SDL_Surface *sprite;
  23. } gamescreen;
  24.  
  25.  
  26. /* Описание управляемого пользователем корабля */
  27. typedef struct _spaceship {
  28. /* Поверхность отрисовки */
  29. SDL_Surface *sprite;
  30. /* Координаты корабля */
  31. int x;
  32. int y;
  33. /* Проекции скорости корабля */
  34. int vx;
  35. int vy;
  36. } spaceship;
  37.  
  38.  
  39. /*Описание фона*/
  40. typedef struct _background{
  41. /* Поверхность отрисовки */
  42. SDL_Surface *sprite;
  43. } background;
  44.  
  45.  
  46.  
  47.  
  48. /* Ресурсы и состояние игры */
  49. typedef struct _game {
  50. /* Экран игры */
  51. gamescreen *screen;
  52. /* Корабль пользователя */
  53. spaceship *ship;
  54. /*Фон*/
  55. background *bg;
  56. } game;
  57.  
  58.  
  59.  
  60.  
  61. /**
  62. * Инициализирует игру
  63. * @returns g указатель на структуру состояния игры
  64. */
  65. game *init();
  66.  
  67. /**
  68. * Инициализирует игру
  69. * @param g указатель на структуру состояния игры
  70. */
  71. void run(game *g);
  72.  
  73. /**
  74. * Отрисовывает объекты в новой позиции
  75. * @param g указатель на структуру состояния игры
  76. */
  77. void draw(game *g);
  78.  
  79.  
  80. /**
  81. * Основная программа
  82. */
  83. int main()
  84. {
  85. /* Инициализируем игру */
  86. game *g = init();
  87.  
  88. /* Запускаем цикл обработки событий игры */
  89. run(g);
  90.  
  91. return 0;
  92. }
  93.  
  94.  
  95. /**
  96. * Инициализирует игру
  97. * @returns g указатель на структуру состояния игры
  98. */
  99. game *init()
  100. {
  101. /* Создаем структуру представления состояния игры */
  102. game *g;
  103. g = (game *) malloc(sizeof(game));
  104. if (g == NULL) {
  105. fprintf(stderr, "Not enough memory!");
  106. exit(EXIT_FAILURE);
  107. }
  108.  
  109. /* Инициализируем библиотеку SDL, используем только видеоподсистему */
  110. if (SDL_Init(SDL_INIT_VIDEO) < 0) {
  111. fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
  112. exit(EXIT_FAILURE);
  113. }
  114.  
  115. /* Регистрируем обработчик завершения программы */
  116. atexit(SDL_Quit);
  117.  
  118. /* Выделяем память для структуры представления экрана */
  119. g->screen = (gamescreen *) malloc(sizeof(gamescreen));
  120. if (g->screen == NULL) {
  121. fprintf(stderr, "Not enough memory!");
  122. exit(EXIT_FAILURE);
  123. }
  124.  
  125. g->bg = (background *) malloc(sizeof(background));
  126. if (g->bg == NULL) {
  127. fprintf(stderr, "Not enough memory!");
  128. exit(EXIT_FAILURE);
  129. }
  130.  
  131. g->bg->sprite = SDL_LoadBMP("spaceimg.bmp");
  132. if (g->bg->sprite == NULL) {
  133. fprintf(stderr, "Couldn't load a bitmap: %s\n", SDL_GetError());
  134. exit(EXIT_FAILURE);
  135. }
  136.  
  137.  
  138. /* Инициализируем видеорежим */
  139. g->screen->sprite =
  140. SDL_SetVideoMode(1024, 768, 0, SDL_HWSURFACE | SDL_DOUBLEBUF);
  141. if (g->screen->sprite == NULL) {
  142. fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
  143. exit(EXIT_FAILURE);
  144. }
  145.  
  146.  
  147. /* Выделяем память для структуры представления корабля */
  148. g->ship = (spaceship *) malloc(sizeof(spaceship));
  149. if (g->ship == NULL) {
  150. fprintf(stderr, "Not enough memory!");
  151. exit(EXIT_FAILURE);
  152. }
  153.  
  154. g->ship->sprite = SDL_LoadBMP("ship.bmp");
  155. if (g->ship->sprite == NULL) {
  156. fprintf(stderr, "Couldn't load a bitmap: %s\n", SDL_GetError());
  157. exit(EXIT_FAILURE);
  158. }
  159.  
  160. /* Устанавливаем заголовок окна */
  161. SDL_WM_SetCaption("Space explore", NULL);
  162.  
  163. return g;
  164. }
  165.  
  166.  
  167. /**
  168. * Инициализирует игру
  169. * @param g указатель на структуру состояния игры
  170. */
  171. void run(game * g)
  172. {
  173. /* Расположение корабля */
  174. g->ship->y = 768-150;
  175. g->ship->x = 512-75;
  176.  
  177. /* Флажки определения границ экрана */
  178. int up = 1;
  179. int down = 1;
  180. int left = 1;
  181. int right = 1;
  182.  
  183. /* Флажок выхода */
  184. int done = 0;
  185.  
  186. /* Продолжаем выполнение, пока не поднят флажок */
  187. while (!done) {
  188.  
  189. /* Проверяем границы */
  190. if (g->ship->y <= 256)
  191. {
  192. up = 0;
  193. g->ship->vy = 0;
  194. }
  195. else
  196. up = 1;
  197.  
  198. if (g->ship->y >= 768-130)
  199. {
  200. down = 0;
  201. g->ship->vy = 0;
  202. }
  203. else
  204. down = 1;
  205.  
  206. if (g->ship->x <= 0)
  207. {
  208. left = 0;
  209. g->ship->vx = 0;
  210. }
  211. else
  212. left = 1;
  213.  
  214. if (g->ship->x >= 1024-150)
  215. {
  216. right = 0;
  217. g->ship->vx = 0;
  218. }
  219. else
  220. right = 1;
  221.  
  222.  
  223. /* Структура описания события */
  224. SDL_Event event;
  225. /* Извлекаем и обрабатываем все доступные события */
  226. while (SDL_PollEvent(&event)) {
  227. switch (event.type) {
  228. /* Если клавишу нажали */
  229. case SDL_KEYDOWN:
  230. switch (event.key.keysym.sym) {
  231. case SDLK_LEFT:
  232. if (left)
  233. g->ship->vx += -VXD;
  234. break;
  235. case SDLK_RIGHT:
  236. if (right)
  237. g->ship->vx += VXD;
  238. break;
  239. case SDLK_UP:
  240. if(up)
  241. g->ship->vy += -VYD;
  242. break;
  243. case SDLK_DOWN:
  244. if (down)
  245. g->ship->vy += VYD;
  246. break;
  247. case SDLK_ESCAPE:
  248. done = 1;
  249. break;
  250. }
  251. break;
  252. /* Если клавишу отпустили */
  253. case SDL_KEYUP:
  254. switch (event.key.keysym.sym) {
  255. case SDLK_LEFT:
  256. if (left)
  257. g->ship->vx += VXD;
  258. break;
  259. case SDLK_RIGHT:
  260. if (right)
  261. g->ship->vx += -VXD;
  262. break;
  263. case SDLK_UP:
  264. if(up)
  265. g->ship->vy += VYD;
  266. break;
  267. case SDLK_DOWN:
  268. if (down)
  269. g->ship->vy += -VYD;
  270. break;
  271. default:
  272. break;
  273. }
  274. break;
  275.  
  276. /* Если закрыли окно */
  277. case SDL_QUIT:
  278. done = 1;
  279. break;
  280. default:
  281. break;
  282. }
  283. }
  284.  
  285. g->ship->x += g->ship->vx;
  286. g->ship->y += g->ship->vy;
  287. draw(g);
  288. SDL_Delay(10);
  289. }
  290. }
  291.  
  292.  
  293. /**
  294. * Отрисовывает объекты в новой позиции
  295. * @param g указатель на структуру состояния игры
  296. */
  297. void draw(game * g)
  298. {
  299. /* Прямоугольники, определяющие зону отображения */
  300. SDL_Rect src, dest;
  301.  
  302. /* Корабль отображаем целиком */
  303. src.x = 0;
  304. src.y = 0;
  305. src.w = g->ship->sprite->w;
  306. src.h = g->ship->sprite->h;
  307.  
  308. /* в новую позицию */
  309. dest.x = g->ship->x;
  310. dest.y = g->ship->y;
  311. dest.w = g->ship->sprite->w;
  312. dest.h = g->ship->sprite->h;
  313.  
  314. /* Выполняем отображение */
  315. SDL_BlitSurface(g->bg->sprite, NULL, g->screen->sprite, NULL);
  316. SDL_BlitSurface(g->ship->sprite, &src, g->screen->sprite, &dest);
  317.  
  318. /* Отрисовываем обновленный экран */
  319. SDL_Flip(g->screen->sprite);
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement