Я просто пытаюсь масштабировать (увеличивать пропорционально) свой персонаж, основываясь на весе и высоте окон. Как я могу это сделать? Я попробовал SDL_BlitScaled (newsurface, NULL, screen, NULL); но это не сработало. Мой код:
SDL_Surface* screen = SDL_GetWindowSurface(win);
SDL_Surface* mySprite = IMG_Load( SPRITE_PNG_PATH);
SDL_Rect rcSprite;
rcSprite.x = 250;
rcSprite.y = 100;
SDL_BlitSurface(mySprite, NULL, screen, &rcSprite);
Лучший способ добиться этого - иметь среднюю поверхность, ширина и высота которой - собственное разрешение игры. Затем вы визуализируете весь кадр на эту поверхность и визуализируете эту поверхность в окне с SDL_BlitScaled
функции SDL_BlitScaled
.
Например, если вы хотите, чтобы ваше родное разрешение было 600x400, вы бы создали поверхность 600x400, blit ваш персонаж и все остальное на этой поверхности, а затем, наконец, масштабировали blit, что поверхность к окну. Если вы измените размер окна до 1200x800, все будет выглядеть вдвое большим.
SDL_Surface* screen = SDL_GetWindowSurface(win);
// Create a surface with our native resolution
int NATIVE_WIDTH = 600;
int NATIVE_HEIGHT = 400;
SDL_Surface* frame = SDL_CreateRGBSurface(0, NATIVE_WIDTH, NATIVE_HEIGHT,
screen->format->BitsPerPixel, screen->format->Rmask,
screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
assert(frameSurface);
SDL_Surface* mySprite = IMG_Load( SPRITE_PNG_PATH);
SDL_Rect rcSprite;
rcSprite.x = 250;
rcSprite.y = 100;
// Blit everything to the intermediate surface, instead of the screen.
SDL_BlitSurface(mySprite, NULL, frame, &rcSprite);
// Once we've drawn the entire frame, we blit the intermediate surface to
// the window, using BlitScaled to ensure it gets scaled to fit the window.
SDL_BlitScaled(frame, NULL, screen, NULL);