void Window::scaleRenderer() { if (this->_windowMode.w <= 0) { SDL_SetWindowSize(this->_window, 1, this->_windowMode.h); } if (this->_windowMode.h <= 0) { SDL_SetWindowSize(this->_window, this->_windowMode.w, 1); } SDL_RenderSetLogicalSize(this->_renderer, this->_game->settings.getInt("RenderWidth"), this->_game->settings.getInt("RenderHeight")); // scale the renderer to the smallest window w/h, and to fill up the remaining empty space (assuming the aspect ratio wasn't conserved), increase the rendering resolution of that axis till it fits // so the minimum scaled side retains its rendering resolution from settings.xml, but the other side increases its resolution to fit the window int curWindW; int curWindH; SDL_GetWindowSize(this->_window, &curWindW, &curWindH); int tempWinDMin = std::min(curWindW, curWindH); int curRendW; int curRendH; SDL_RenderGetLogicalSize(this->_renderer, &curRendW, &curRendH); int tempRendMin = std::min(curRendW, curRendH); float aspectMin = static_cast<float>(tempWinDMin) / tempRendMin; // scale on both x and y float tempWindMax = std::max(curWindW, curWindH); //TODO: possible floating point inaccuracies curRendW = (static_cast<int>(curRendW * aspectMin) == tempWinDMin) ? curRendW : tempWindMax / aspectMin; curRendW = (static_cast<int>(curRendH * aspectMin) == tempWinDMin) ? curRendH : tempWindMax / aspectMin; SDL_RenderSetLogicalSize(this->_renderer, curRendW, curRendH); // set scale to be uniform on x and y SDL_RenderSetScale(this->_renderer, aspectMin, aspectMin); //it's scaled up and we want the min renderer side to remain the same, as it's currently already fitted nicely, but the other side? theres now a blank space, lets increase the rendering resolution of the renderer on that axis SDL_RenderGetLogicalSize(this->_renderer, &this->_renderMode.w, &this->_renderMode.h); SDL_RenderGetScale(this->_renderer, &this->_renderMode.scaleX, &this->_renderMode.scaleY); }
void GameOverModule_init(void* context) { GameOverModule* this = context; this->scene = Scene_create(this->engine, "scenes/mainMenu.lua", NULL); this->ui = UiNode_create(NULL, NULL); SDL_RenderGetLogicalSize(this->engine->renderer, &this->ui->bounds.w, &this->ui->bounds.h); UiMenuList* menu = UiMenuList_create(this->ui); SDL_Renderer* r = this->engine->renderer; char winnerString[128]; sprintf(winnerString, "%s wins!", this->winnerName); UiMenuElement_create(menu, r, "Thanks for playing", NULL, NULL, this); UiMenuElement_create(menu, r, winnerString, NULL, NULL, this); UiMenuElement_create(menu, r, "Play", NULL, GameOverModule_onStartButton, this); //UiMenuElement_create(menu, r, "Options", NULL, NULL, this); //UiMenuElement_create(menu, r, "Credits", NULL, NULL, this); //UiMenuElement_create(menu, r, "Editor", NULL, GameOverModule_onEditorButton, this); UiMenuElement_create(menu, r, "Exit", NULL, GameOverModule_onExitButton, this); UiMenuElement_create(menu, r, "Created by Nehmulos", NULL, NULL, this); UiMenuElement_create(menu, r, "For LD27", NULL, NULL, this); UiNode_moveTo(menu->node, this->ui->bounds.w - menu->node->bounds.w - (this->ui->bounds.w/15), (this->ui->bounds.h - menu->node->bounds.h) / 2); //UiMenuList_layout(menu); // create stupid playersprite that }
const struct size *video_get_logical_size( ) { static struct size size; SDL_RenderGetLogicalSize( video_renderer, &size.w, &size.h ); return &size; }
void render(SDL_Renderer *renderer) { Uint8 r, g, b; int renderW; int renderH; SDL_RenderGetLogicalSize(renderer, &renderW, &renderH); /* Come up with a random rectangle */ SDL_Rect rect; rect.w = randomInt(64, 128); rect.h = randomInt(64, 128); rect.x = randomInt(0, renderW); rect.y = randomInt(0, renderH); /* Come up with a random color */ r = randomInt(50, 255); g = randomInt(50, 255); b = randomInt(50, 255); /* Fill the rectangle in the color */ SDL_SetRenderDrawColor(renderer, r, g, b, 255); SDL_RenderFillRect(renderer, &rect); /* update screen */ SDL_RenderPresent(renderer); }
const Dimensions<int> Renderer::getLogicalSize() const { Dimensions<int> ret(-1, -1); if(isLoaded()) SDL_RenderGetLogicalSize(ren, ret.x().getPtr(), ret.y().getPtr()); return ret; }
void MainMenu::RenderFrame(SDL_Renderer *renderer) { int w = 0, h = 0; SDL_RenderGetLogicalSize(renderer, &w, &h); //m_logo.Draw(renderer, (w - m_logo.GetClipW()) / 2, (h - m_logo.GetClipH()) / 2); m_startButton.DrawTo(renderer); m_optionsButton.DrawTo(renderer); m_quitButton.DrawTo(renderer); m_textBox.DrawTo(renderer, w - 100, h - 20, -12); }
int MenuState::init(){ int w, h; SDL_RenderGetLogicalSize(m_game->renderer(), &w, &h); m_drawtex = SDL_CreateTexture(m_game->renderer(), SDL_PIXELTYPE_UNKNOWN, SDL_TEXTUREACCESS_TARGET, w, h); m_camera = SDL_Rect{0,0,w,h}; init_menuitems(w, h); return 0; }
SDL_Setup::SDL_Setup(const int width, const int height) : SCREEN_WIDTH(width), SCREEN_HEIGHT(height) { e = new SDL_Event(); if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::printf("\nUnable to initialize SDL: %s\n", SDL_GetError()); } else if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1")) { std::printf("Warning: Linear texture filtering not enabled!"); } //Create Window gWindow = SDL_CreateWindow("Game Prototype", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (gWindow == NULL) { std::printf("Window failed to initialize! SDL Error: %s\n", SDL_GetError()); } else { //Create renderer gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); if (gRenderer == NULL) { printf("Renderer failed to initialize! SDL Error: %s\n", SDL_GetError()); } else { //Sets resolution for all platforms (letter boxing) SDL_RenderGetLogicalSize(gRenderer, &resWidth, &resHeight); //Intitialize render color SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); //Initialize PNG loading int imgFlags = IMG_INIT_PNG; if (!(IMG_Init(imgFlags) & imgFlags)) { printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError()); } } } }
MainMenu::MainMenu() { ConfigUtility& config = ConfigUtility::GetSingleton(); //setup the utility objects buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_blue.png"); font = TTF_OpenFont(config["client.font"].c_str(), 12); //check that the font loaded if (!font) { std::ostringstream msg; msg << "Failed to load a font file; " << SDL_GetError(); throw(std::runtime_error(msg.str())); } //setup the buttons startButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); startButton.SetText(GetRenderer(), font, WHITE, "Start"); optionsButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); optionsButton.SetText(GetRenderer(), font, WHITE, "Options"); quitButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); quitButton.SetText(GetRenderer(), font, WHITE, "Quit"); //set the button positions startButton.SetX(50); startButton.SetY(50 + 20 * 0); optionsButton.SetX(50); optionsButton.SetY(50 + 20 * 1); quitButton.SetX(50); quitButton.SetY(50 + 20 * 2); //text box int h = -1; SDL_RenderGetLogicalSize(GetRenderer(), nullptr, &h); textBox.SetX(50); textBox.SetY(h-100); textBox.PushLine(GetRenderer(), font, WHITE, "Thanks for playing!"); textBox.PushLine(GetRenderer(), font, WHITE, "You can get the latest version at: "); textBox.PushLine(GetRenderer(), font, WHITE, "krgamestudios.com"); //TODO: (9) click to open the website/update //debug // }
Scene* Scene_create(GameEngine* engine, Scene* lastScene) { Scene* this = allocStruct(Scene); this->engine = engine; SDL_Point screenSize; SDL_RenderGetLogicalSize(engine->renderer, &screenSize.x, &screenSize.y); this->camera = Camera_create(screenSize.x, screenSize.y); this->walkableBounds.x = 0; this->walkableBounds.w = 0; this->walkableBounds.y = 295 * PHYSICS_SCALE; this->walkableBounds.h = 185 * PHYSICS_SCALE; this->entities = Vector_Create(); this->triggers = Vector_Create(); this->bodies = Vector_Create(); this->shapes = Vector_Create(); this->sky = Sky_create(engine->textureCache); withSprintf(path, "images/%s/bg.png", anyArgs("red"), { SDL_Texture* texture = TextureCache_getForUnconstantPath(engine->textureCache, path); this->background = Sprite_create(texture); });
void MainMenu_init(void* context) { MainMenu* this = context; this->scene = Scene_createForPath(this->engine, "scenes/main-menu.scm", NULL); this->ui = UiNode_create(NULL, NULL); SDL_RenderGetLogicalSize(this->engine->renderer, &this->ui->bounds.w, &this->ui->bounds.h); UiMenuList* menu = UiMenuList_create(this->ui); SDL_Renderer* r = this->engine->renderer; UiMenuElement_create(menu, r, "Play", NULL, MainMenu_onStartButton, this); //UiMenuElement_create(menu, r, "Options", NULL, NULL, this); //UiMenuElement_create(menu, r, "Credits", NULL, NULL, this); //UiMenuElement_create(menu, r, "Editor", NULL, MainMenu_onEditorButton, this); UiMenuElement_create(menu, r, "Exit", NULL, MainMenu_onExitButton, this); UiNode_moveTo(menu->node, this->ui->bounds.w - menu->node->bounds.w - (this->ui->bounds.w/15), (this->ui->bounds.h - menu->node->bounds.h) / 2); //UiMenuList_layout(menu); // create stupid playersprite that }
int Window::getLogicalHeight() const noexcept { int h; SDL_RenderGetLogicalSize( m_wimpl->renderer, nullptr, &h ); return h == 0 ? getHeight() : h; }
int Window::getLogicalWidth() const noexcept { int w; SDL_RenderGetLogicalSize( m_wimpl->renderer, &w, nullptr ); return w == 0 ? getWidth() : w; }
static void SDL_handle_events(void) { SDL_Event event; assert(pthread_equal(pthread_self(), dosemu_pthread_self)); if (render_is_updating()) return; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: v_printf("SDL: focus in\n"); render_gain_focus(); if (config.X_background_pause && !dosemu_user_froze) unfreeze_dosemu(); break; case SDL_WINDOWEVENT_FOCUS_LOST: v_printf("SDL: focus out\n"); render_lose_focus(); if (config.X_background_pause && !dosemu_user_froze) freeze_dosemu(); break; case SDL_WINDOWEVENT_RESIZED: /* very strange things happen: if renderer size was explicitly * set, SDL reports mouse coords relative to that. Otherwise * it reports mouse coords relative to the window. */ SDL_RenderGetLogicalSize(renderer, &m_x_res, &m_y_res); if (!m_x_res || !m_y_res) { m_x_res = event.window.data1; m_y_res = event.window.data2; } update_mouse_coords(); SDL_redraw(); break; case SDL_WINDOWEVENT_EXPOSED: SDL_redraw(); break; case SDL_WINDOWEVENT_ENTER: /* ignore fake enter events */ if (config.X_fullscreen) break; mouse_drag_to_corner(m_x_res, m_y_res); break; } break; case SDL_KEYDOWN: { if (wait_kup) break; SDL_Keysym keysym = event.key.keysym; if ((keysym.mod & KMOD_CTRL) && (keysym.mod & KMOD_ALT)) { if (keysym.sym == SDLK_HOME || keysym.sym == SDLK_k) { force_grab = 0; toggle_grab(keysym.sym == SDLK_k); break; } else if (keysym.sym == SDLK_f) { toggle_fullscreen_mode(); /* some versions of SDL re-send the keydown events after the * full-screen switch. We need to filter them out to prevent * the infinite switching loop. */ wait_kup = 1; break; } } if (vga.mode_class == TEXT && (keysym.sym == SDLK_LSHIFT || keysym.sym == SDLK_RSHIFT)) { copypaste = 1; /* enable cursor for copy/paste */ if (!m_cursor_visible) SDL_ShowCursor(SDL_ENABLE); } } #if CONFIG_SDL_SELECTION clear_if_in_selection(); #endif #ifdef X_SUPPORT #if HAVE_XKB if (x11_display && config.X_keycode) SDL_process_key_xkb(x11_display, event.key); else #endif #endif SDL_process_key(event.key); break; case SDL_KEYUP: { SDL_Keysym keysym = event.key.keysym; wait_kup = 0; if (copypaste && (keysym.sym == SDLK_LSHIFT || keysym.sym == SDLK_RSHIFT)) { copypaste = 0; if (!m_cursor_visible) SDL_ShowCursor(SDL_DISABLE); } #ifdef X_SUPPORT #if HAVE_XKB if (x11_display && config.X_keycode) SDL_process_key_xkb(x11_display, event.key); else #endif #endif SDL_process_key(event.key); break; } case SDL_MOUSEBUTTONDOWN: { int buttons = SDL_GetMouseState(NULL, NULL); #if CONFIG_SDL_SELECTION if (window_has_focus() && !shift_pressed()) { clear_selection_data(); } else if (vga.mode_class == TEXT && !grab_active) { if (event.button.button == SDL_BUTTON_LEFT) start_selection(x_to_col(event.button.x, m_x_res), y_to_row(event.button.y, m_y_res)); else if (event.button.button == SDL_BUTTON_RIGHT) start_extend_selection(x_to_col(event.button.x, m_x_res), y_to_row(event.button.y, m_y_res)); else if (event.button.button == SDL_BUTTON_MIDDLE) { char *paste = SDL_GetClipboardText(); if (paste) paste_text(paste, strlen(paste), "utf8"); } break; } #endif /* CONFIG_SDL_SELECTION */ mouse_move_buttons(buttons & SDL_BUTTON(1), buttons & SDL_BUTTON(2), buttons & SDL_BUTTON(3)); break; } case SDL_MOUSEBUTTONUP: { int buttons = SDL_GetMouseState(NULL, NULL); #if CONFIG_SDL_SELECTION if (vga.mode_class == TEXT && !grab_active) { t_unicode *sel = end_selection(); if (sel) { char *send_text = get_selection_string(sel, "utf8"); SDL_SetClipboardText(send_text); free(send_text); } } #endif /* CONFIG_SDL_SELECTION */ mouse_move_buttons(buttons & SDL_BUTTON(1), buttons & SDL_BUTTON(2), buttons & SDL_BUTTON(3)); break; } case SDL_MOUSEMOTION: #if CONFIG_SDL_SELECTION extend_selection(x_to_col(event.motion.x, m_x_res), y_to_row(event.motion.y, m_y_res)); #endif /* CONFIG_SDL_SELECTION */ if (grab_active) mouse_move_relative(event.motion.xrel, event.motion.yrel, m_x_res, m_y_res); else mouse_move_absolute(event.motion.x, event.motion.y, m_x_res, m_y_res); break; case SDL_MOUSEWHEEL: mouse_move_wheel(-event.wheel.y); break; case SDL_QUIT: leavedos(0); break; default: v_printf("PAS ENCORE TRAITE %x\n", event.type); /* TODO */ break; } } #ifdef X_SUPPORT if (x11_display && !use_bitmap_font && vga.mode_class == TEXT && X_handle_text_expose()) { /* need to check separately because SDL_VIDEOEXPOSE is eaten by SDL */ redraw_text_screen(); } #endif }
SDL_Rect& GraphicsDriver::GetLogicalViewport() { SDL_RenderGetLogicalSize( mRenderer, &mViewport.w, &mViewport.h ); return mViewport; }
World::World(int* const argClientIndex, int* const argAccountIndex): clientIndex(*argClientIndex), accountIndex(*argAccountIndex) { //setup the utility objects buttonImage.Load(GetRenderer(), config["dir.interface"] + "button_blue.png"); font = TTF_OpenFont(config["client.font"].c_str(), 12); //check that the font loaded if (!font) { std::ostringstream msg; msg << "Failed to load a font file; " << SDL_GetError(); throw(std::runtime_error(msg.str())); } //setup the buttons disconnectButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); disconnectButton.SetText(GetRenderer(), font, WHITE, "Disconnect"); shutdownButton.SetBackgroundTexture(GetRenderer(), buttonImage.GetTexture()); shutdownButton.SetText(GetRenderer(), font, WHITE, "Shutdown"); //set the button positions disconnectButton.SetX(50); disconnectButton.SetY(50); shutdownButton.SetX(50); shutdownButton.SetY(70); //load the tilesheet //TODO: (2) Tile size and tile sheet should be loaded elsewhere tileSheet.Load(GetRenderer(), config["dir.tilesets"] + "overworld.png", 32, 32); //Send the character data CharacterPacket newPacket; newPacket.type = SerialPacketType::CHARACTER_LOAD; strncpy(newPacket.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE); strncpy(newPacket.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE); newPacket.accountIndex = accountIndex; network.SendTo(Channels::SERVER, &newPacket); //set the camera's values SDL_RenderGetLogicalSize(GetRenderer(), &camera.width, &camera.height); //debug std::list<std::string> slotNames = { "slot 1 green.png", "slot 2 green.png", "slot 3 green.png", "slot 4 green.png", "slot 5 green.png", "slot 6 green.png", "slot 7 green.png", "slot 8 green.png", "slot 1 red.png", "slot 2 red.png", "slot 3 red.png", "slot 4 red.png", "slot 5 red.png", "slot 6 red.png", "slot 7 red.png", "slot 8 red.png" }; barrierMgr.LoadBaseImage(GetRenderer(), config["dir.sprites"] + "barrier/base.png"); barrierMgr.LoadTemplateImages(GetRenderer(), config["dir.sprites"] + "barrier/", slotNames); std::cout << "Templates loaded: " << barrierMgr.GetTemplateContainer()->size() << std::endl; }
void get_screen_size(int* width, int* height) { SDL_RenderGetLogicalSize(screen->impl, width, height); }