Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- **
- * spacexplore.c -- прототип игры управления звездолетом
- *
- * Copyright (c) 2017, Alexander Borodin <aborod@petrsu.ru>
- *
- * This code is licensed under a MIT-style license.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <SDL.h>
- #define VXD 7
- #define VYD 7
- /* Описание экрана игры */
- typedef struct _gamescreen {
- /* Поверхность отрисовки */
- SDL_Surface *sprite;
- SDL_Surface *sprite_fon;
- } gamescreen;
- /* Описание управляемого пользователем корабля */
- typedef struct _spaceship {
- /* Поверхность отрисовки */
- SDL_Surface *sprite;
- /* Координаты корабля */
- int x;
- int y;
- /* Проекции скорости корабля */
- int vx;
- int vy;
- } spaceship;
- typedef struct _gameresources{
- SDL_Surface *bitcoin;
- int x,y;
- int if_exist;
- } gameresources;
- /* Ресурсы и состояние игры */
- typedef struct _game {
- /* Экран игры */
- gamescreen *screen;
- /* Корабль пользователя */
- spaceship *ship;
- gameresources *resources;
- // int left_boarder=0;
- // int right_boarder=0;
- // int up_boarder=0;
- // int down_boarder=0;
- } game;
- /**
- * Инициализирует игру
- * @returns g указатель на структуру состояния игры
- */
- game *init();
- /**
- * Инициализирует игру
- * @param g указатель на структуру состояния игры
- */
- void run(game *g);
- /**
- * Отрисовывает объекты в новой позиции
- * @param g указатель на структуру состояния игры
- */
- void draw(game *g);
- /**
- * Основная программа
- */
- int main()
- {
- /* Инициализируем игру */
- game *g = init();
- /* Запускаем цикл обработки событий игры */
- run(g);
- return 0;
- }
- /**
- * Инициализирует игру
- * @returns g указатель на структуру состояния игры
- */
- game *init()
- {
- /* Создаем структуру представления состояния игры */
- game *g;
- g = (game *) malloc(sizeof(game));
- if (g == NULL) {
- fprintf(stderr, "Not enough memory!");
- exit(EXIT_FAILURE);
- }
- /* Инициализируем библиотеку SDL, используем только видеоподсистему */
- if (SDL_Init(SDL_INIT_VIDEO) < 0) {
- fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- /* Регистрируем обработчик завершения программы */
- atexit(SDL_Quit);
- /* Выделяем память для структуры представления экрана */
- g->screen = (gamescreen *) malloc(2*sizeof(gamescreen));
- if (g->screen == NULL) {
- fprintf(stderr, "Not enough memory!");
- exit(EXIT_FAILURE);
- }
- /* Инициализируем видеорежим */
- g->screen->sprite=SDL_SetVideoMode(1024,768,0,SDL_HWSURFACE | SDL_DOUBLEBUF);
- g->screen->sprite_fon =SDL_LoadBMP("kosmos.bmp");
- if (g->screen->sprite == NULL) {
- fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- //Ресурсы
- g->resources= (gameresources*) malloc ( sizeof (gameresources));
- g->resources->bitcoin= SDL_LoadBMP("bitcoin.bmp");
- if(g->resources ==NULL){
- fprintf(stderr, "Not enough memory!");
- exit(EXIT_FAILURE);
- }
- /* Выделяем память для структуры представления корабля */
- g->ship = (spaceship *) malloc(sizeof(spaceship));
- if (g->ship == NULL) {
- fprintf(stderr, "Not enough memory!");
- exit(EXIT_FAILURE);
- }
- g->ship->sprite = SDL_LoadBMP("ship.bmp");
- if (g->ship->sprite == NULL) {
- fprintf(stderr, "Couldn't load a bitmap: %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- g->ship->x = g->screen->sprite->w / 2 - g->ship->sprite->w / 2;
- g->ship->y = g->screen->sprite->h - g->ship->sprite->h;
- // int left_boarder=g->screen->sprite->w - g->ship->sprite->w;
- // int right_boarder=0;
- // int up_boarder=g->screen->sprite->h/3;
- // int down_boarder=g->screen->sprite->h;
- /* Устанавливаем заголовок окна */
- SDL_WM_SetCaption("Space explore", NULL);
- return g;
- }
- /**
- * Инициализирует игру
- * @param g указатель на структуру состояния игры
- */
- void run(game * g)
- {
- /* Флажок выхода */
- int done = 0;
- g->resources->if_exist=0;
- /* Продолжаем выполнение, пока не поднят флажок */
- while (!done) {
- /* Структура описания события */
- SDL_Event event;
- /* Извлекаем и обрабатываем все доступные события */
- while (SDL_PollEvent(&event)) {
- switch (event.type) {
- /* Если клавишу нажали */
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_LEFT:
- g->ship->vx += -VXD;
- break;
- case SDLK_RIGHT:
- g->ship->vx += VXD;
- break;
- case SDLK_UP:
- g->ship->vy += -VYD;
- break;
- case SDLK_DOWN:
- g->ship->vy += VYD;
- break;
- case SDLK_ESCAPE:
- done = 1;
- break;
- }
- break;
- /* Если клавишу отпустили */
- case SDL_KEYUP:
- switch (event.key.keysym.sym) {
- case SDLK_LEFT:
- g->ship->vx += VXD;
- break;
- case SDLK_RIGHT:
- g->ship->vx += -VXD;
- break;
- case SDLK_UP:
- g->ship->vy += VYD;
- break;
- case SDLK_DOWN:
- g->ship->vy += -VYD;
- break;
- default:
- break;
- }
- break;
- /* Если закрыли окно */
- case SDL_QUIT:
- done = 1;
- break;
- default:
- break;
- }
- }
- //Верхняя граница корабля
- if((g->ship->x + g->ship->vx)>=0 &&(g->ship->x + g->ship->vx)<=(g->screen->sprite->w - g->ship->sprite->w))
- g->ship->x += g->ship->vx;
- //Нижняя граница корабля
- 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)
- g->ship->y += g->ship->vy;
- //Ресурс
- if(g->resources->if_exist==1)
- if(g->ship->x <= g->resources->x + g->resources->bitcoin->w && g->ship->x + g->ship->sprite->w >= g->resources->x)
- if(g->ship->y <= g->resources->y + g->resources->bitcoin->h && g->ship->y + g->ship->sprite->h >= g->resources->y)
- g->resources->if_exist=0;
- draw(g);
- SDL_Delay(10);
- }
- }
- /**
- * Отрисовывает объекты в новой позиции
- * @param g указатель на структуру состояния игры
- */
- void draw(game * g)
- {
- /* Прямоугольники, определяющие зону отображения */
- SDL_Rect src, dest;
- /* Отображаем фон */
- src.x = 0;
- src.y = 0;
- src.w = g->screen->sprite_fon->w;
- src.h = g->screen->sprite_fon->h;
- /*Позиция */
- dest.x = 0;
- dest.y = 0;
- dest.w = g->screen->sprite_fon->w;
- dest.h = g->screen->sprite_fon->h;
- /* Выполняем отображение */
- SDL_BlitSurface(g->screen->sprite_fon , &src, g->screen->sprite, &dest);
- /* Корабль отображаем целиком */
- src.x = 0;
- src.y = 0;
- src.w = g->ship->sprite->w;
- src.h = g->ship->sprite->h;
- SDL_SetColorKey(g->ship->sprite,SDL_SRCCOLORKEY,0x000000);
- /* в новую позицию */
- dest.x = g->ship->x;// + ( g->screen->sprite->w - g->ship->sprite->w)/2;
- dest.y = g->ship->y;// + g->screen->sprite->h - g->ship->sprite->h;
- dest.w = g->ship->sprite->w;
- dest.h = g->ship->sprite->h;
- /* Выполняем отображение */
- SDL_BlitSurface(g->ship->sprite, &src, g->screen->sprite, &dest);
- //Отображение ресурса
- if(g->resources->if_exist==0){
- srand(time(NULL));
- src.x=0;
- src.y=0;
- src.w= g->resources->bitcoin->w;
- src.h= g->resources->bitcoin->h;
- g->resources->x=rand()%(g->screen->sprite->w - g->resources->bitcoin->w);
- g->resources->y=rand()%(g->screen->sprite->h*2/3 - g->resources->bitcoin->h) + g->screen->sprite->h/3;
- dest.x=g->resources->x;
- dest.y=g->resources->y;
- dest.w=g->resources->bitcoin->w;
- dest.h=g->resources->bitcoin->h;
- SDL_BlitSurface(g->resources->bitcoin, &src, g->screen->sprite_fon, &dest);
- g->resources->if_exist=1;
- } else{
- src.x= 0;
- src.y= 0;
- src.w= g->resources->bitcoin->w;
- src.h= g->resources->bitcoin->h;
- dest.x=g->resources->x;
- dest.y=g->resources->y;
- dest.w=g->resources->bitcoin->w;
- dest.h=g->resources->bitcoin->h;
- SDL_BlitSurface(g->resources->bitcoin, &src, g->screen->sprite, &dest);
- }
- /* Отрисовываем обновленный экран */
- SDL_Flip(g->screen->sprite);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement