【问题标题】:SDL: How to set size of pixel (stretch) of a windowSDL:如何设置窗口的像素大小(拉伸)
【发布时间】:2020-11-21 06:09:42
【问题描述】:

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

【问题讨论】:

    标签: c++ resize window sdl-2


    【解决方案1】:

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

    接下来,找出游戏纹理在实际窗口上的正确大小和位置,并在那里渲染纹理。这将需要修改 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多