提问者:小点点

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


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


共1个答案

匿名用户

首先,将你的游戏渲染成256x256的纹理。 这个要旨有一个例子,我会在下面内联它。

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

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