Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.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. #include <time.h>
  13. #include <SDL.h>
  14.  
  15. #define VXD 7
  16. #define VYD 7
  17.  
  18.  
  19. /* Описание экрана игры */
  20. typedef struct _gamescreen {
  21.     /* Поверхность отрисовки */
  22.     SDL_Surface *sprite;
  23.     SDL_Surface *sprite_fon;
  24. } gamescreen;
  25.  
  26.  
  27. /* Описание управляемого пользователем корабля */
  28. typedef struct _spaceship {
  29.     /* Поверхность отрисовки */
  30.     SDL_Surface *sprite;
  31.     /* Координаты корабля */
  32.     int x;
  33.     int y;
  34.     /* Проекции скорости корабля */
  35.     int vx;
  36.     int vy;
  37. } spaceship;
  38.  
  39. typedef struct _gameresources{
  40.         SDL_Surface *bitcoin;
  41.         int x,y;
  42.         int if_exist;
  43. } gameresources;
  44.  
  45.  
  46.  
  47. /* Ресурсы и состояние игры  */
  48. typedef struct _game {
  49.     /* Экран игры */
  50.     gamescreen *screen;
  51.     /* Корабль пользователя */
  52.     spaceship *ship;
  53.    gameresources *resources;
  54. //    int left_boarder=0;
  55. //    int right_boarder=0;
  56. //    int up_boarder=0;
  57. //    int down_boarder=0;
  58. } game;
  59.  
  60. /**
  61.  * Инициализирует игру
  62.  * @returns g указатель на структуру состояния игры
  63.  */
  64. game *init();
  65.  
  66. /**
  67.  * Инициализирует игру
  68.  * @param g указатель на структуру состояния игры
  69.  */
  70. void run(game *g);
  71.  
  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(2*sizeof(gamescreen));
  120.     if (g->screen == NULL) {
  121.         fprintf(stderr, "Not enough memory!");
  122.         exit(EXIT_FAILURE);
  123.     }
  124.  
  125.     /* Инициализируем видеорежим */
  126.     g->screen->sprite=SDL_SetVideoMode(1024,768,0,SDL_HWSURFACE | SDL_DOUBLEBUF);
  127.     g->screen->sprite_fon =SDL_LoadBMP("kosmos.bmp");
  128.     if (g->screen->sprite == NULL) {
  129.         fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
  130.         exit(EXIT_FAILURE);
  131.     }
  132.     //Ресурсы
  133.     g->resources= (gameresources*) malloc ( sizeof (gameresources));
  134.     g->resources->bitcoin= SDL_LoadBMP("bitcoin.bmp");
  135.     if(g->resources ==NULL){
  136.         fprintf(stderr, "Not enough memory!");
  137.         exit(EXIT_FAILURE);
  138. }
  139.  
  140.     /* Выделяем память для структуры представления корабля */
  141.     g->ship = (spaceship *) malloc(sizeof(spaceship));
  142.     if (g->ship == NULL) {
  143.         fprintf(stderr, "Not enough memory!");
  144.         exit(EXIT_FAILURE);
  145.     }
  146.     g->ship->sprite = SDL_LoadBMP("ship.bmp");
  147.     if (g->ship->sprite == NULL) {
  148.         fprintf(stderr, "Couldn't load a bitmap: %s\n", SDL_GetError());
  149.         exit(EXIT_FAILURE);
  150.     }
  151.     g->ship->x = g->screen->sprite->w / 2 - g->ship->sprite->w / 2;
  152.     g->ship->y = g->screen->sprite->h - g->ship->sprite->h;
  153.  
  154. //    int left_boarder=g->screen->sprite->w - g->ship->sprite->w;
  155. //    int right_boarder=0;
  156. //    int up_boarder=g->screen->sprite->h/3;
  157. //    int down_boarder=g->screen->sprite->h;
  158.     /* Устанавливаем заголовок окна */
  159.     SDL_WM_SetCaption("Space explore", NULL);
  160.  
  161.     return g;
  162. }
  163.  
  164.  
  165. /**
  166.  * Инициализирует игру
  167.  * @param g указатель на структуру состояния игры
  168.  */
  169. void run(game * g)
  170. {
  171.     /* Флажок выхода */
  172.     int done = 0;
  173.     g->resources->if_exist=0;
  174.     /* Продолжаем выполнение, пока не поднят флажок */
  175.     while (!done) {
  176.         /* Структура описания события */
  177.         SDL_Event event;
  178.         /* Извлекаем и обрабатываем все доступные события */
  179.         while (SDL_PollEvent(&event)) {
  180.             switch (event.type) {
  181.             /* Если клавишу нажали */
  182.             case SDL_KEYDOWN:
  183.                 switch (event.key.keysym.sym) {
  184.                 case SDLK_LEFT:
  185.                     g->ship->vx += -VXD;
  186.                     break;
  187.                 case SDLK_RIGHT:
  188.                     g->ship->vx += VXD;
  189.                     break;
  190.  
  191.                case SDLK_UP:
  192.                     g->ship->vy += -VYD;
  193.                     break;
  194.                 case SDLK_DOWN:
  195.                     g->ship->vy += VYD;
  196.                     break;
  197.                 case SDLK_ESCAPE:
  198.                     done = 1;
  199.                     break;
  200.                 }
  201.                 break;
  202.             /* Если клавишу отпустили */
  203.             case SDL_KEYUP:
  204.                 switch (event.key.keysym.sym) {
  205.                 case SDLK_LEFT:
  206.                     g->ship->vx += VXD;
  207.                     break;
  208.                 case SDLK_RIGHT:
  209.                     g->ship->vx += -VXD;
  210.                     break;
  211.                 case SDLK_UP:
  212.                     g->ship->vy += VYD;
  213.                     break;
  214.                 case SDLK_DOWN:
  215.                     g->ship->vy += -VYD;
  216.                     break;
  217.                 default:
  218.                     break;
  219.                 }
  220.                 break;
  221.             /* Если закрыли окно */
  222.             case SDL_QUIT:
  223.                 done = 1;
  224.                 break;
  225.             default:
  226.                 break;
  227.             }
  228.         }
  229.         //Верхняя граница корабля
  230.         if((g->ship->x + g->ship->vx)>=0 &&(g->ship->x + g->ship->vx)<=(g->screen->sprite->w - g->ship->sprite->w))
  231.             g->ship->x += g->ship->vx;
  232.                 //Нижняя граница корабля
  233.         if(g->ship->y + g->ship->vy>=g->screen->sprite->h/3 && g->ship->y + g->ship->vy <= g->screen->sprite->h - g->ship->sprite->h)
  234.             g->ship->y += g->ship->vy;
  235.  
  236.                 //Ресурс
  237.         if(g->resources->if_exist==1)
  238.                 if(g->ship->x <= g->resources->x + g->resources->bitcoin->w && g->ship->x + g->ship->sprite->w >= g->resources->x)
  239.                         if(g->ship->y <= g->resources->y + g->resources->bitcoin->h && g->ship->y + g->ship->sprite->h >= g->resources->y)
  240.                                 g->resources->if_exist=0;
  241.  
  242.  
  243.         draw(g);
  244.  
  245.         SDL_Delay(10);
  246.     }
  247. }
  248. /**
  249.  * Отрисовывает объекты в новой позиции
  250.  * @param g указатель на структуру состояния игры
  251.  */
  252. void draw(game * g)
  253. {
  254.     /* Прямоугольники, определяющие зону отображения */
  255.     SDL_Rect src, dest;
  256.         /* Отображаем фон */
  257.     src.x = 0;
  258.     src.y = 0;
  259.     src.w = g->screen->sprite_fon->w;
  260.     src.h = g->screen->sprite_fon->h;
  261.  
  262.     /*Позиция */
  263.     dest.x = 0;
  264.     dest.y = 0;
  265.     dest.w = g->screen->sprite_fon->w;
  266.     dest.h = g->screen->sprite_fon->h;
  267.  
  268.     /* Выполняем отображение */
  269.     SDL_BlitSurface(g->screen->sprite_fon , &src, g->screen->sprite, &dest);
  270.     /* Корабль отображаем целиком */
  271.     src.x = 0;
  272.     src.y = 0;
  273.     src.w = g->ship->sprite->w;
  274.     src.h = g->ship->sprite->h;
  275.     SDL_SetColorKey(g->ship->sprite,SDL_SRCCOLORKEY,0x000000);
  276.  
  277.     /* в новую позицию */
  278.     dest.x = g->ship->x;// + ( g->screen->sprite->w - g->ship->sprite->w)/2;
  279.     dest.y = g->ship->y;// +  g->screen->sprite->h - g->ship->sprite->h;
  280.     dest.w = g->ship->sprite->w;
  281.     dest.h = g->ship->sprite->h;
  282.     /* Выполняем отображение */
  283.     SDL_BlitSurface(g->ship->sprite, &src, g->screen->sprite, &dest);
  284.  
  285.     //Отображение ресурса
  286.     if(g->resources->if_exist==0){
  287.         srand(time(NULL));
  288.         src.x=0;
  289.         src.y=0;
  290.         src.w= g->resources->bitcoin->w;
  291.         src.h= g->resources->bitcoin->h;
  292.         g->resources->x=rand()%(g->screen->sprite->w - g->resources->bitcoin->w);
  293.         g->resources->y=rand()%(g->screen->sprite->h*2/3 - g->resources->bitcoin->h) + g->screen->sprite->h/3;
  294.         dest.x=g->resources->x;
  295.         dest.y=g->resources->y;
  296.         dest.w=g->resources->bitcoin->w;
  297.         dest.h=g->resources->bitcoin->h;
  298.  
  299.         SDL_BlitSurface(g->resources->bitcoin, &src, g->screen->sprite_fon, &dest);
  300.         g->resources->if_exist=1;
  301. } else{
  302.                 src.x= 0;
  303.                 src.y= 0;
  304.                 src.w= g->resources->bitcoin->w;
  305.                 src.h= g->resources->bitcoin->h;
  306.  
  307.                 dest.x=g->resources->x;
  308.                 dest.y=g->resources->y;
  309.                 dest.w=g->resources->bitcoin->w;
  310.                 dest.h=g->resources->bitcoin->h;
  311.  
  312.         SDL_BlitSurface(g->resources->bitcoin, &src, g->screen->sprite, &dest);
  313.     }
  314.  
  315.  
  316.  
  317.  
  318.  
  319.     /* Отрисовываем обновленный экран */
  320.     SDL_Flip(g->screen->sprite);
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement