aboutsummaryrefslogtreecommitdiff
path: root/src/GameLoop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameLoop.cpp')
-rw-r--r--src/GameLoop.cpp291
1 files changed, 61 insertions, 230 deletions
diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp
index a4b4a60..c0caaaf 100644
--- a/src/GameLoop.cpp
+++ b/src/GameLoop.cpp
@@ -19,6 +19,8 @@
// You should have received a copy of the GNU General Public License
// along with Black Shades. If not, see <https://www.gnu.org/licenses/>.
+#include "GLFW/glfw3.h"
+
#include "Game.h"
extern float multiplier;
@@ -106,237 +108,66 @@ void Game::HandleKeyDown(char key)
}
}
-static int mapinit = 0;
-static int sdlkeymap[SDLK_LAST];
-static unsigned char ourkeys[16];
-
-static void init_sdlkeymap()
-{
- int i;
- for (i = 0; i < SDLK_LAST; i++)
- sdlkeymap[i] = -1;
-
- sdlkeymap[SDLK_1] = MAC_1_KEY;
- sdlkeymap[SDLK_2] = MAC_2_KEY;
- sdlkeymap[SDLK_3] = MAC_3_KEY;
- sdlkeymap[SDLK_4] = MAC_4_KEY;
- sdlkeymap[SDLK_5] = MAC_5_KEY;
- sdlkeymap[SDLK_6] = MAC_6_KEY;
- sdlkeymap[SDLK_7] = MAC_7_KEY;
- sdlkeymap[SDLK_8] = MAC_8_KEY;
- sdlkeymap[SDLK_9] = MAC_9_KEY;
- sdlkeymap[SDLK_0] = MAC_0_KEY;
- sdlkeymap[SDLK_KP1] = MAC_NUMPAD_1_KEY;
- sdlkeymap[SDLK_KP2] = MAC_NUMPAD_2_KEY;
- sdlkeymap[SDLK_KP3] = MAC_NUMPAD_3_KEY;
- sdlkeymap[SDLK_KP4] = MAC_NUMPAD_4_KEY;
- sdlkeymap[SDLK_KP5] = MAC_NUMPAD_5_KEY;
- sdlkeymap[SDLK_KP6] = MAC_NUMPAD_6_KEY;
- sdlkeymap[SDLK_KP7] = MAC_NUMPAD_7_KEY;
- sdlkeymap[SDLK_KP8] = MAC_NUMPAD_8_KEY;
- sdlkeymap[SDLK_KP9] = MAC_NUMPAD_9_KEY;
- sdlkeymap[SDLK_KP0] = MAC_NUMPAD_0_KEY;
- sdlkeymap[SDLK_a] = MAC_A_KEY;
- sdlkeymap[SDLK_b] = MAC_B_KEY;
- sdlkeymap[SDLK_c] = MAC_C_KEY;
- sdlkeymap[SDLK_d] = MAC_D_KEY;
- sdlkeymap[SDLK_e] = MAC_E_KEY;
- sdlkeymap[SDLK_f] = MAC_F_KEY;
- sdlkeymap[SDLK_g] = MAC_G_KEY;
- sdlkeymap[SDLK_h] = MAC_H_KEY;
- sdlkeymap[SDLK_i] = MAC_I_KEY;
- sdlkeymap[SDLK_j] = MAC_J_KEY;
- sdlkeymap[SDLK_k] = MAC_K_KEY;
- sdlkeymap[SDLK_l] = MAC_L_KEY;
- sdlkeymap[SDLK_m] = MAC_M_KEY;
- sdlkeymap[SDLK_n] = MAC_N_KEY;
- sdlkeymap[SDLK_o] = MAC_O_KEY;
- sdlkeymap[SDLK_p] = MAC_P_KEY;
- sdlkeymap[SDLK_q] = MAC_Q_KEY;
- sdlkeymap[SDLK_r] = MAC_R_KEY;
- sdlkeymap[SDLK_s] = MAC_S_KEY;
- sdlkeymap[SDLK_t] = MAC_T_KEY;
- sdlkeymap[SDLK_u] = MAC_U_KEY;
- sdlkeymap[SDLK_v] = MAC_V_KEY;
- sdlkeymap[SDLK_w] = MAC_W_KEY;
- sdlkeymap[SDLK_x] = MAC_X_KEY;
- sdlkeymap[SDLK_y] = MAC_Y_KEY;
- sdlkeymap[SDLK_z] = MAC_Z_KEY;
- sdlkeymap[SDLK_F1] = MAC_F1_KEY;
- sdlkeymap[SDLK_F2] = MAC_F2_KEY;
- sdlkeymap[SDLK_F3] = MAC_F3_KEY;
- sdlkeymap[SDLK_F4] = MAC_F4_KEY;
- sdlkeymap[SDLK_F5] = MAC_F5_KEY;
- sdlkeymap[SDLK_F6] = MAC_F6_KEY;
- sdlkeymap[SDLK_F7] = MAC_F7_KEY;
- sdlkeymap[SDLK_F8] = MAC_F8_KEY;
- sdlkeymap[SDLK_F9] = MAC_F9_KEY;
- sdlkeymap[SDLK_F10] = MAC_F10_KEY;
- sdlkeymap[SDLK_F11] = MAC_F11_KEY;
- sdlkeymap[SDLK_F12] = MAC_F12_KEY;
- sdlkeymap[SDLK_RETURN] = MAC_RETURN_KEY;
- sdlkeymap[SDLK_KP_ENTER] = MAC_ENTER_KEY;
- sdlkeymap[SDLK_TAB] = MAC_TAB_KEY;
- sdlkeymap[SDLK_SPACE] = MAC_SPACE_KEY;
- sdlkeymap[SDLK_BACKSPACE] = MAC_DELETE_KEY;
- sdlkeymap[SDLK_ESCAPE] = MAC_ESCAPE_KEY;
- sdlkeymap[SDLK_LCTRL] = MAC_CONTROL_KEY;
- sdlkeymap[SDLK_RCTRL] = MAC_CONTROL_KEY;
- sdlkeymap[SDLK_LSHIFT] = MAC_SHIFT_KEY;
- sdlkeymap[SDLK_RSHIFT] = MAC_SHIFT_KEY;
- sdlkeymap[SDLK_CAPSLOCK] = MAC_CAPS_LOCK_KEY;
- sdlkeymap[SDLK_LALT] = MAC_OPTION_KEY;
- sdlkeymap[SDLK_RALT] = MAC_OPTION_KEY;
- sdlkeymap[SDLK_PAGEUP] = MAC_PAGE_UP_KEY;
- sdlkeymap[SDLK_PAGEDOWN] = MAC_PAGE_DOWN_KEY;
- sdlkeymap[SDLK_INSERT] = MAC_INSERT_KEY;
- sdlkeymap[SDLK_DELETE] = MAC_DEL_KEY;
- sdlkeymap[SDLK_HOME] = MAC_HOME_KEY;
- sdlkeymap[SDLK_END] = MAC_END_KEY;
- sdlkeymap[SDLK_LEFTBRACKET] = MAC_LEFT_BRACKET_KEY;
- sdlkeymap[SDLK_RIGHTBRACKET] = MAC_RIGHT_BRACKET_KEY;
- sdlkeymap[SDLK_UP] = MAC_ARROW_UP_KEY;
- sdlkeymap[SDLK_DOWN] = MAC_ARROW_DOWN_KEY;
- sdlkeymap[SDLK_LEFT] = MAC_ARROW_LEFT_KEY;
- sdlkeymap[SDLK_RIGHT] = MAC_ARROW_RIGHT_KEY;
-
- mapinit = 1;
-}
-
-void GetKeys(unsigned long *keys)
-{
- /* this is just weird */
- memcpy(keys, ourkeys, sizeof(ourkeys));
-}
-
-static void DoSDLKey(Game *g, SDL_Event *event)
-{
- if (mapinit == 0)
- init_sdlkeymap();
-
- int mackey = sdlkeymap[event->key.keysym.sym];
- if (mackey != -1) {
- int index = mackey / 8;
- int mask = 1 << (mackey % 8);
-
- if (event->type == SDL_KEYDOWN)
- ourkeys[index] |= mask;
- else
- ourkeys[index] &= ~mask;
- }
-
- if (event->key.keysym.unicode
- && !(event->key.keysym.unicode & 0xFF80))
- /* hey, at least it was aleady public */
- g->HandleKeyDown(event->key.keysym.unicode);
-}
-
-static void ProcessSDLEvents(Game* g)
-{
- SDL_Event event;
- while (SDL_PollEvent(&event)) {
- switch (event.type) {
- case SDL_KEYDOWN:
- if (event.key.keysym.sym == SDLK_RETURN
- && event.key.keysym.mod & KMOD_ALT) {
- SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
- break;
- } else if (event.key.keysym.sym == SDLK_g
- && event.key.keysym.mod & KMOD_CTRL) {
- if (SDL_WM_GrabInput(SDL_GRAB_QUERY)
- == SDL_GRAB_OFF) {
- SDL_WM_GrabInput(SDL_GRAB_ON);
- SDL_ShowCursor(SDL_DISABLE);
- } else {
- SDL_WM_GrabInput(SDL_GRAB_OFF);
- SDL_ShowCursor(SDL_ENABLE);
- }
- break;
- }
- case SDL_KEYUP:
- DoSDLKey(g, &event);
- break;
- case SDL_QUIT:
- exit(0);
- }
- }
-}
-
void eventLoop(Game* game)
{
- unsigned char theKeyMap[16];
- game->gQuit = false;
- game->framespersecond = 60.0f;
-
- while (!game->gQuit) {
- ProcessSDLEvents(game);
- game->start = TimerGetTime(&game->theTimer);
-
- GLfloat oldmult = multiplier;
- int colaccuracy = min(game->sps,
- game->sps / game->framespersecond + 1.0f);
- multiplier /= colaccuracy;
- for (int i = 0; i < (int) (colaccuracy + 0.5f); i++)
- game->Tick();
- if (game->DrawGLScene())
- SDL_GL_SwapBuffers();
- else
- game->gQuit = true;
- multiplier = oldmult;
-
- do {
- game->end = TimerGetTime(&game->theTimer);
- game->timetaken = game->end - game->start;
- game->framespersecond = 6e8f / game->timetaken;
- } while (game->framespersecond > game->maxfps);
-
- game->multiplier5 = game->multiplier4;
- game->multiplier4 = game->multiplier3;
- game->multiplier3 = game->multiplier2;
- game->multiplier2 = 1 / game->framespersecond;
- multiplier = (game->multiplier2 + game->multiplier3
- + game->multiplier4 + game->multiplier5) / 4.0f;
- multiplier = min(max(multiplier, 0.00001f), 1.0f);
- if (visions == 1 && !game->mainmenu)
- multiplier /= 3;
- if (slomo)
- multiplier /= 5;
- if (game->paused)
- multiplier = 0;
-
- GetKeys((unsigned long*) theKeyMap);
- if (IsKeyDown(theKeyMap, MAC_COMMAND_KEY)
- &&IsKeyDown(theKeyMap, MAC_Q_KEY)) {
- game->gQuit = true;
- if (game->score > game->highscore) {
- game->highscore = game->score;
- /* TODO */
- ofstream opstream("highscore.txt");
- opstream << game->highscore;
- opstream << "\n";
- opstream << game->beatgame;
- opstream.close();
- }
- }
-
- if (IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)) {
- alSourcePause(gSourceID[rainsound]);
- game->mainmenu = 1;
- alSourcePlay(gSourceID[souloutsound]);
- game->flashamount = 1.0f;
- game->flashr = game->flashg = game->flashb = 1.0f;
- alSourceStop(gSourceID[visionsound]);
- game->whichsong = mainmenusong;
- alSourceStop(gSourceID[knifesong]);
- alSourceStop(gSourceID[shootsong]);
- alSourceStop(gSourceID[zombiesong]);
- alSourceStop(gSourceID[mainmenusong]);
- alSourcef(gSourceID[knifesong], AL_MIN_GAIN, 0);
- alSourcef(gSourceID[shootsong], AL_MIN_GAIN, 0);
- alSourcef(gSourceID[zombiesong], AL_MIN_GAIN, 0);
- alSourcef(gSourceID[mainmenusong], AL_MIN_GAIN, 0);
- alSourcePlay(gSourceID[game->whichsong]);
- alSourcef(gSourceID[game->whichsong], AL_MIN_GAIN, 1);
- }
+ /*
+ * SDL_Event event;
+ * while (SDL_PollEvent(&event)) {
+ * if (event.type == SDL_KEYUP
+ * && event.key.keysym.unicode
+ * && !(event.key.keysym.unicode & 0xFF80))
+ * game->HandleKeyDown(event.key.keysym.unicode);
+ * }
+ */
+
+ auto start = glfwGetTime();
+ GLfloat oldmult = multiplier;
+ int colaccuracy = min(game->sps,
+ game->sps / game->framespersecond + 1.0f);
+ multiplier /= colaccuracy;
+ for (int i = 0; i < (int) (colaccuracy + 0.5f); i++)
+ game->Tick();
+ auto window = glfwGetCurrentContext();
+ if (game->DrawGLScene())
+ glfwSwapBuffers(window);
+ else
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+ multiplier = oldmult;
+
+ do game->framespersecond = 1.0 / (glfwGetTime() - start);
+ while (game->framespersecond > game->maxfps);
+
+ game->multiplier5 = game->multiplier4;
+ game->multiplier4 = game->multiplier3;
+ game->multiplier3 = game->multiplier2;
+ game->multiplier2 = 1 / game->framespersecond;
+ multiplier = (game->multiplier2 + game->multiplier3
+ + game->multiplier4 + game->multiplier5) / 4.0f;
+ multiplier = min(max(multiplier, 0.00001f), 1.0f);
+ if (visions == 1 && !game->mainmenu)
+ multiplier /= 3;
+ if (slomo)
+ multiplier /= 5;
+ if (game->paused)
+ multiplier = 0;
+
+ if (IsKeyDown(GLFW_KEY_ESCAPE)) {
+ alSourcePause(gSourceID[rainsound]);
+ game->mainmenu = 1;
+ alSourcePlay(gSourceID[souloutsound]);
+ game->flashamount = 1.0f;
+ game->flashr = game->flashg = game->flashb = 1.0f;
+ alSourceStop(gSourceID[visionsound]);
+ game->whichsong = mainmenusong;
+ alSourceStop(gSourceID[knifesong]);
+ alSourceStop(gSourceID[shootsong]);
+ alSourceStop(gSourceID[zombiesong]);
+ alSourceStop(gSourceID[mainmenusong]);
+ alSourcef(gSourceID[knifesong], AL_MIN_GAIN, 0);
+ alSourcef(gSourceID[shootsong], AL_MIN_GAIN, 0);
+ alSourcef(gSourceID[zombiesong], AL_MIN_GAIN, 0);
+ alSourcef(gSourceID[mainmenusong], AL_MIN_GAIN, 0);
+ alSourcePlay(gSourceID[game->whichsong]);
+ alSourcef(gSourceID[game->whichsong], AL_MIN_GAIN, 1);
}
}