/** @file platform_sdl.h This is an SDL2 implementation of the game front end. by Miloslav Ciz (drummyfish), 2019 Released under CC0 1.0 (https://creativecommons.org/publicdomain/zero/1.0/) plus a waiver of all other intellectual property. The goal of this work is be and remain completely in the public domain forever, available for any use whatsoever. */ #ifndef _SFG_PLATFORM_H #define _SFG_PLATFORM_H #include "settings.h" #include #include #include #include #include "palette.h" #undef SFG_LOG #define SFG_LOG(str) printf("game: %s\n",str); const uint8_t *sdlKeyboardState; uint16_t screen[SFG_RESOLUTION_X * SFG_RESOLUTION_Y]; // RGB565 format void SFG_setPixel(uint16_t x, uint16_t y, uint8_t colorIndex) { screen[y * SFG_RESOLUTION_X + x] = paletteRGB565[colorIndex]; } uint32_t SFG_getTimeMs() { return SDL_GetTicks(); } void SFG_sleepMs(uint16_t timeMs) { usleep(timeMs * 1000); } int8_t SFG_keyPressed(uint8_t key) { switch (key) { case SFG_KEY_UP: return sdlKeyboardState[SDL_SCANCODE_UP] || sdlKeyboardState[SDL_SCANCODE_W] || sdlKeyboardState[SDL_SCANCODE_KP_8]; break; case SFG_KEY_RIGHT: return sdlKeyboardState[SDL_SCANCODE_RIGHT] || sdlKeyboardState[SDL_SCANCODE_E] || sdlKeyboardState[SDL_SCANCODE_KP_6]; break; case SFG_KEY_DOWN: return sdlKeyboardState[SDL_SCANCODE_DOWN] || sdlKeyboardState[SDL_SCANCODE_S] || sdlKeyboardState[SDL_SCANCODE_KP_5]; break; case SFG_KEY_LEFT: return sdlKeyboardState[SDL_SCANCODE_LEFT] || sdlKeyboardState[SDL_SCANCODE_Q] || sdlKeyboardState[SDL_SCANCODE_KP_4]; break; case SFG_KEY_A: return sdlKeyboardState[SDL_SCANCODE_G]; break; case SFG_KEY_B: return sdlKeyboardState[SDL_SCANCODE_H]; break; case SFG_KEY_C: return sdlKeyboardState[SDL_SCANCODE_J]; break; case SFG_KEY_JUMP: return sdlKeyboardState[SDL_SCANCODE_SPACE]; break; case SFG_KEY_STRAFE_LEFT: return sdlKeyboardState[SDL_SCANCODE_A] || sdlKeyboardState[SDL_SCANCODE_KP_7]; break; case SFG_KEY_STRAFE_RIGHT: return sdlKeyboardState[SDL_SCANCODE_D] || sdlKeyboardState[SDL_SCANCODE_KP_9]; break; default: return 0; break; } } int main() { printf("SDL: starting\n"); printf("SDL: initializing SDL\n"); SDL_Window *window = SDL_CreateWindow("raycasting", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SFG_RESOLUTION_X, SFG_RESOLUTION_Y, SDL_WINDOW_SHOWN); SDL_Renderer *renderer = SDL_CreateRenderer(window,-1,0); SDL_Texture *texture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB565,SDL_TEXTUREACCESS_STATIC, SFG_RESOLUTION_X,SFG_RESOLUTION_Y); SDL_Surface *screenSurface = SDL_GetWindowSurface(window); #if SFG_FULLSCREEN SDL_SetWindowFullscreen(window,SDL_WINDOW_FULLSCREEN_DESKTOP); #endif sdlKeyboardState = SDL_GetKeyboardState(NULL); SFG_init(); int running = 1; while (running) { SDL_PumpEvents(); // updates the keyboard state if (sdlKeyboardState[SDL_SCANCODE_ESCAPE]) break; SFG_mainLoopBody(); SDL_UpdateTexture(texture,NULL,screen,SFG_RESOLUTION_X * sizeof(uint16_t)); SDL_RenderClear(renderer); SDL_RenderCopy(renderer,texture,NULL,NULL); SDL_RenderPresent(renderer); } printf("SDL: freeing SDL\n"); SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); printf("SDL: ending\n"); return 0; } #endif // guard