SDL:如何设置 window 的像素(拉伸)大小

SDL: How to set size of pixel (stretch) of a window

我正在制作一款复古像素游戏,所以我想 window 的分辨率非常低 (256x256)。但是,当我尝试全屏显示时,整个 window 只是呈现在左上方,而其他所有区域都是黑色的。
我想知道一种全局设置 window 中每个像素大小的方法,以使其适合全屏,或者拉伸整个 window(或渲染器?)到指定的大小(和全屏),同时 SDL_CreateWindow 中的参数 2 和 3 中的 (w, h) 不变,并且大小成比例(因此,如果它是正方形 window ,拉伸后应该是正方形window,而不是拉伸成矩形后的矩形。

首先,将您的游戏渲染为 256x256 纹理。 This gist有例子,下面我会内联

接下来,找出游戏纹理在实际 window 上的正确大小和位置,并在那里渲染纹理。这将需要修改 SDL_RenderCopyEx 调用,因为要点只是将其拉伸到屏幕上。

#include <iostream>

#ifdef __linux__
#include <SDL2/SDL.h>
#elif defined(_WIN32)
#include <SDL.h>
#endif

const int WIN_WIDTH = 640;
const int WIN_HEIGHT = 480;

int main(int argc, char **argv){
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
        std::cerr << "SDL_Init failed: " << SDL_GetError() << "\n";
        return 1;
    }
    SDL_Window *win = SDL_CreateWindow("Rendering to a texture!", SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED, WIN_WIDTH, WIN_HEIGHT, 0);
    SDL_Renderer *renderer = SDL_CreateRenderer(win, -1,
        SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);

    //Put your own bmp image here
    SDL_Surface *bmpSurf = SDL_LoadBMP("../res/image.bmp");
    SDL_Texture *bmpTex = SDL_CreateTextureFromSurface(renderer, bmpSurf);
    SDL_FreeSurface(bmpSurf);

    //Make a target texture to render too
    SDL_Texture *texTarget = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
        SDL_TEXTUREACCESS_TARGET, WIN_WIDTH, WIN_HEIGHT);
    
    //Now render to the texture
    SDL_SetRenderTarget(renderer, texTarget);
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, bmpTex, NULL, NULL);
    //Detach the texture
    SDL_SetRenderTarget(renderer, NULL);

    //Now render the texture target to our screen, but upside down
    SDL_RenderClear(renderer);
    SDL_RenderCopyEx(renderer, texTarget, NULL, NULL, 0, NULL, SDL_FLIP_VERTICAL);
    SDL_RenderPresent(renderer);

    SDL_Delay(1000);
    SDL_DestroyTexture(texTarget);
    SDL_DestroyTexture(bmpTex);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}