#include #include #include #include #include #include #include #ifdef __EMSCRIPTEN__ #include #endif #include "constants.h" #include "character.h" #include "level.h" using namespace std; int screenWidth; int screenHeight; // for capping fps https://stackoverflow.com/a/2548751 #define TICK_INTERVAL 30 static Uint32 nextTime; bool mainLoop(); void renderScreen(); // bool makeWindowTransparent(SDL_Window*, COLORREF); SDL_Window* window; SDL_Texture* frogStatic; SDL_Texture* frogSheet; SDL_Texture* screenTexture; SDL_Renderer* screenRenderer; Mix_Chunk *sfx1 = nullptr; Mix_Chunk *sfx2 = nullptr; Level* level; Uint32 timeLeft() { Uint32 now; now = SDL_GetTicks(); if (nextTime <= now) { return 0; } else { return nextTime - now; } } int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); SDL_Rect screenBounds; if (SDL_GetDisplayBounds(0, &screenBounds) != 0) { SDL_Log("SDL_GetDisplayBounds failed: %s", SDL_GetError()); } screenWidth = screenBounds.w; screenHeight = screenBounds.h; screenWidth = TILE_SIZE * BOARD_SIZE_X; screenHeight = TILE_SIZE * BOARD_SIZE_Y; SDL_Log("%i, %i", screenWidth, screenHeight); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { SDL_Log("SDL could not initialise! SDL_Error: %s\n", SDL_GetError()); } else if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { SDL_Log("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError()); } else { //SDL_CreateWindowAndRenderer(screenWidth, screenHeight, SDL_WINDOW_SHOWN, &window, &screenRenderer); //window = SDL_CreateWindow("SDLTest", 0, 0, screenWidth, screenHeight, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_MAXIMIZED); window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screenWidth, screenHeight, SDL_WINDOW_SHOWN); screenRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (window == nullptr || screenRenderer == nullptr) { SDL_Log("Window or renderer could not be created! SDL_Error: %s\n", SDL_GetError()); } else { SDL_SetWindowOpacity(window, 1.0); //screenSurface = SDL_GetWindowSurface(window); //SDL_SetSurfaceBlendMode(screenSurface, SDL_BLENDMODE_BLEND); //screenRenderer = SDL_CreateRenderer(window, -1, 0); SDL_SetRenderDrawBlendMode(screenRenderer, SDL_BLENDMODE_BLEND); screenTexture = SDL_CreateTexture(screenRenderer, SDL_PIXELFORMAT_UNKNOWN, SDL_TEXTUREACCESS_TARGET, screenWidth, screenHeight); //SDL_SetTextureAlphaMod(imageTexture, 100); SDL_Rect rect1{100, 100, 200, 150}; SDL_Rect rect2{150, 150, 200, 150}; SDL_SetRenderDrawColor(screenRenderer, 255, 0, 255, 255); SDL_RenderClear(screenRenderer); SDL_SetRenderDrawColor(screenRenderer, 0, 255, 255, 127); SDL_RenderFillRect(screenRenderer, &rect1); SDL_SetRenderDrawColor(screenRenderer, 255, 255, 0, 127); SDL_RenderFillRect(screenRenderer, &rect2); SDL_SetRenderTarget(screenRenderer, screenTexture); SDL_SetRenderDrawColor(screenRenderer, 255, 0, 255, 255); SDL_RenderFillRect(screenRenderer, nullptr); SDL_SetRenderTarget(screenRenderer, nullptr); SDL_RenderPresent(screenRenderer); //Hack to get window to stay up //SDL_Event e; bool quit = false; while( quit == false ){ while( SDL_PollEvent( &e ) ){ if( e.type == SDL_QUIT ) quit = true; } } level = new Level(screenRenderer, screenWidth, screenHeight); renderScreen(); //holdCount = 0; #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(mainLoop, 0, 1); #else bool quit = false; while (!quit) { quit = mainLoop(); } #endif } } return 0; } bool mainLoop() { bool quit = level->update(); if (quit) { #ifdef __EMSCRIPTEN__ emscripten_cancel_main_loop(); #endif } nextTime = SDL_GetTicks() + TICK_INTERVAL; SDL_Delay(timeLeft()); renderScreen(); nextTime += TICK_INTERVAL; return quit; } void renderScreen() { SDL_Rect rect1{100, 100, 200, 150}; SDL_Rect rect2{150, 150, 200, 150}; SDL_SetRenderTarget(screenRenderer, nullptr); SDL_SetRenderDrawColor(screenRenderer, 255, 0, 255, 255); SDL_RenderClear(screenRenderer); level->render(); /*SDL_Log("%d", rand()); if (rand() > RAND_MAX / 2) { //SDL_SetRenderDrawColor(screenRenderer, 0, 255, 255, 127); //SDL_RenderFillRect(screenRenderer, &rect1); SDL_SetRenderDrawColor(screenRenderer, 255, 255, 0, 127); SDL_RenderFillRect(screenRenderer, &rect2); }*/ /*SDL_SetRenderTarget(screenRenderer, frameTexture); SDL_SetRenderDrawColor(screenRenderer, 255, 0, 255, 255); SDL_RenderFillRect(screenRenderer, nullptr); SDL_SetRenderTarget(screenRenderer, nullptr);*/ SDL_RenderPresent(screenRenderer); } // // https://stackoverflow.com/a/51956224 // // Makes a window transparent by setting a transparency color. // bool makeWindowTransparent(SDL_Window* window, COLORREF colorKey) { // // Get window handle (https://stackoverflow.com/a/24118145/3357935) // SDL_SysWMinfo wmInfo; // SDL_VERSION(&wmInfo.version); // Initialize wmInfo // SDL_GetWindowWMInfo(window, &wmInfo); // HWND hWnd = wmInfo.info.win.window; // // Change window type to layered (https://stackoverflow.com/a/3970218/3357935) // SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); // /*BLENDFUNCTION blend; // blend.BlendOp = AC_SRC_OVER; // blend.BlendFlags = 0; // blend.SourceConstantAlpha = 127; // blend.AlphaFormat = AC_SRC_ALPHA; // UpdateLayeredWindow(hWnd, nullptr, nullptr, nullptr, nullptr, nullptr, colorKey, &blend, ULW_ALPHA);*/ // // Set transparency color // return SetLayeredWindowAttributes(hWnd, colorKey, 0.5, LWA_COLORKEY); // }