设置窗口大小后,SDL不会渲染到整个窗口

SDL not render to the full window after set window size

本文关键字:窗口 窗口大小 SDL 设置      更新时间:2023-10-16

这是我使用SDL加载图像的步骤。

  1. 创建窗口和渲染默认大小,例如100x100
  2. IMG_LoadTexture
  3. 从图像创建纹理
  4. 查询纹理信息并获取纹理维度,例如800x600,然后使用SDL_SetWindowSize调整大小到所需的大小
  5. 执行渲染

结果仅在窗口创建时仅渲染到100x100区域,另一部分不是渲染。

SDL_SetWindowSize之后如何使SDL渲染到全窗?

以下是我的示例代码

#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;
}

您看不到更新的渲染,因为您只在框架循环之前渲染一次。要解决此问题,请将渲染效果移到框架循环中,例如:

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);
}