2016-12-03 492 views
1

以下是我使用SDL加载图像的步骤。设置窗口大小后,SDL未呈现到完整窗口

  1. 创建窗口,并用默认大小渲染,如100x100
  2. IMG_LoadTexture
  3. 查询纹理信息创建图像的纹理,并得到纹理尺寸,例如800x600,然后用SDL_SetWindowSize来调整到所需的大小
  4. 执行渲染

结果是SDL只渲染到100x100区域时窗口已创建,另一部分未渲染。

我该如何让SDL渲染为全屏后SDL_SetWindowSize

下面是我的示例代码

#include <iostream> 
#include <SDL_image.h> 
#include "SDL.h" 

int main(int argc, char *argv[]) 
{ 
SDL_Window* sdlWindow; 
SDL_Renderer* sdlRenderer; 
SDL_CreateWindowAndRenderer(100, 100, 0, &sdlWindow, &sdlRenderer); 

IMG_Init(IMG_INIT_JPG); 

SDL_Texture* sdlTexture = IMG_LoadTexture(sdlRenderer, "test-wallpaper-800x600.jpg"); 

Uint32 format; 
int access, w, h; 
if (SDL_QueryTexture(sdlTexture, &format, &access, &w, &h) == 0) { 
    SDL_SetWindowSize(sdlWindow, w, h); 
    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); 
    SDL_RenderSetLogicalSize(sdlRenderer, w, h); 
} 

SDL_RenderClear(sdlRenderer); 
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL); 
SDL_RenderPresent(sdlRenderer); 

SDL_Event sdlEvent; 
while (SDL_WaitEvent(&sdlEvent)) { 
    if (sdlEvent.type == SDL_WINDOWEVENT 
     && sdlEvent.window.event == SDL_WINDOWEVENT_CLOSE) { 
     break; 
    } 
    if (sdlEvent.type == SDL_KEYDOWN 
      && sdlEvent.key.keysym.sym == SDLK_ESCAPE) { 
     break; 
    } 
} 

SDL_DestroyRenderer(sdlRenderer); 
SDL_DestroyWindow(sdlWindow); 
return 0; 
} 

回答

0

你不会看到更新的渲染,因为你只有帧循环之前曾经呈现它。要解决此问题,请将渲染移动到帧循环中,如下所示:

SDL_Event sdlEvent; 
while (SDL_WaitEvent(&sdlEvent)) 
{ 
    if (sdlEvent.type == SDL_WINDOWEVENT 
     && sdlEvent.window.event == SDL_WINDOWEVENT_CLOSE) { 
     break; 
    } 
    if (sdlEvent.type == SDL_KEYDOWN 
      && sdlEvent.key.keysym.sym == SDLK_ESCAPE) { 
     break; 
    } 

    // Render here 
    SDL_RenderClear(sdlRenderer); 
    SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL); 
    SDL_RenderPresent(sdlRenderer); 
}