/* game.c */ #include "global.h" #include #include "game.h" #include "draw.h" #include "dwgame.h" #include "dwmenu.h" #include "sound.h" #include "input.h" #include "logic.h" /* подключим библиотеку мультимедийных таймеров */ #include #pragma comment(lib,"winmm.lib") /* размер буфера для расчета FPS */ #define FPS_BUFF 5 /* состояния игры */ #define GAME_INIT_DRAW 1 /* инициализация модуля рисования игрового процесса */ #define GAME_CREATE_ROUND 2 /* создание игрового раунда */ #define GAME_RUN 3 /* игра в игровом раунде */ #define GAME_EXIT 4 /* выход из игрового раунда */ #define MENU_INIT_DRAW 5 /* инициализация модуля рисования меню игры */ #define MENU_RUN 6 /* игра в меню */ #define MENU_EXIT 7 /* выход из игры */ /* локальные переменные */ static int gameState; /* хранит состояние игры */ static int level; /* хранит уровень игры */ static DWORD dwLastTick; /* хранит время предыдущего отображение кадра */ /* переменные для расчета среднего значения текущего FPS */ static int fpsBuff[FPS_BUFF]; /* буфер для расчета FPS */ static int pFps; /* текущее положение в буфере */ int giFps; /* хранит FPS */ /* переменные для расчета среднего времени построения обного кадра */ static int frameBuff[FPS_BUFF]; static int pFrame; int giFrame; /* обработаем состояние GAME_INIT_DRAW */ static void stateGameInitDraw(void) { /* подготовим модуль рисования игрового процесса */ if (GameInitDraw()) gameState = MENU_EXIT; else gameState = GAME_CREATE_ROUND; /* установим начальный раунд */ level = 0; } /* обработаем состояние GAME_CREATE_ROUND */ static void stateGameCreateRound(void) { /* создание объектов для сцены */ GameCreateScene(); /* создание уровня */ GameCreateLevel(level); /* переключим состояние */ gameState = GAME_RUN; } /* обработаем состояние GAME_RUN */ static void stateGameRun(void) { DWORD dwTime; if (giDebug) dwTime = timeGetTime(); /* произведем ввод данных */ GameInput(); /* произвести перемещение объектов */ switch (GameMoveScene()) { case 1: /* загрузим новый уровень */ gameState = GAME_CREATE_ROUND; level++; break; case 2: /* игрок проиграл */ gameState = GAME_EXIT; break; } /* проиграть звуки и музыку */ GameSound(); /* отобразим кадр */ GameDrawScene(); /* расчет времени построения одного кадра */ if (giDebug) { frameBuff[pFrame] = timeGetTime() - dwTime; if (++pFrame >= FPS_BUFF) { int i,sum; for (i = sum = 0; i < FPS_BUFF; i++) sum += frameBuff[i]; giFrame = sum / FPS_BUFF; pFrame = 0; } } } /* обработаем состояние GAME_EXIT */ static void stateGameExit(void) { /* разрушение сцены */ GameReleaseScene(); /* переключим состояние на меню */ gameState = MENU_INIT_DRAW; } /* обработаем состояние MENU_INIT_DRAW */ static void stateMenuInitDraw(void) { /* переключим состояние */ gameState = MENU_RUN; } /* обработаем состояние MENU_RUN */ static void stateMenuRun(void) { /////////////////////////////////////////////////////////////////// /* запустим игру заново */ gameState = GAME_INIT_DRAW; /////////////////////////////////////////////////////////////////// } /* обработаем состояние MENU_EXIT */ static void stateMenuExit(void) { PostMessage(ghWndMain,WM_CLOSE,0,0); } /* обработать состояние игры */ int procGameState(void) { /* проверяет текущее состояние игры */ switch (gameState) { /* подготовить модуль рисования игрового процесса */ case GAME_INIT_DRAW: stateGameInitDraw(); break; /* создадим игровой раунд */ case GAME_CREATE_ROUND: stateGameCreateRound(); break; /* идет процесс игры */ case GAME_RUN: stateGameRun(); return 1; /* завершение игрового процесса */ case GAME_EXIT: stateGameExit(); break; /* подготовка модуля рисования меню */ case MENU_INIT_DRAW: stateMenuInitDraw(); break; /* игра работает в меню */ case MENU_RUN: stateMenuRun(); break; /* завершение игры */ case MENU_EXIT: stateMenuExit(); break; } return 0; } /* цикл обработки игры */ void MainGame(void) { INT nSleepTime; /* проверить нажатие ESC */ if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) gameState = MENU_EXIT; /* обработаем состояние игры */ if (!procGameState()) return; /* обновим кадр изображения */ UpdateDraw(); /* сделаем задержку для обеспечения FPS */ nSleepTime = DELAY_FPS - (timeGetTime() - dwLastTick); if (nSleepTime > 1) Sleep(nSleepTime-1); while ((timeGetTime() - dwLastTick) < DELAY_FPS); /* расчитаем FPS */ if (giDebug) { /* получим прошедшее время */ fpsBuff[pFps] = timeGetTime() - dwLastTick; /* если буфер заполнился, расчитываем FPS */ if (++pFps >= FPS_BUFF) { int i,sum,delay; /* расчитаем среднее время */ for (i = sum = 0; i < FPS_BUFF; i++) sum += fpsBuff[i]; /* расчитаем время задержки */ delay = sum / FPS_BUFF; /* расчитаем FPS */ giFps = 1000 / delay; /* сбросим укозатель буфера */ pFps = 0; } } /* обновим время последнего кадра */ dwLastTick = timeGetTime(); } /* инициализация игры */ int InitGame(void) { /* спрячем курсор */ ShowCursor(FALSE); /* инициализация модуля рисования */ if (InitDraw()) return 1; /* инициализация звукового модуля */ if (InitSound()) return 1; /* инициализация модуля ввода */ if (InitInput()) return 1; /* инициализация модуля рисования игрового процесса */ if (InitDrawGame()) return 1; /* инициализация модуля рисования меню игры */ if (InitDrawMenu()) return 1; /* настройка таймера с разрешением в 1 ms */ timeBeginPeriod(1); /* инициализация генератора случайных чисел */ srand(timeGetTime()); /* проинициализируем начальное время */ dwLastTick = timeGetTime(); /* игра стартует */ gameState = MENU_INIT_DRAW; return 0; } /* деинициализация игры */ void ShutdownGame(void) { /* деинициализация таймера */ timeEndPeriod(1); /* деинициализация модуля рисования игрового меню */ ReleaseDrawMenu(); /* деинициализация модуля рисования игрового процесса */ ReleaseDrawGame(); /* деинициализация модуля ввода */ ReleaseInput(); /* деинициализация звукового модуля */ ReleaseSound(); /* деинициализация модуля рисования */ ReleaseDraw(); /* покажем курсор */ ShowCursor(TRUE); }