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;
}
我正在制作一款复古像素游戏,所以我想 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;
}