Started on adaptive aspect ratio adjustment.
Just one problem: the backgrounds don't get resized and so you get awful mush on the right side/bottom of the screen. Will fix in the next commit.
This commit is contained in:
parent
f10af4aaf3
commit
12a3fcdbab
23
src/engine.c
23
src/engine.c
|
@ -270,12 +270,7 @@ void engine_setMode()
|
|||
engine.useMusic = useMusic;
|
||||
engine.autoPause = autoPause;
|
||||
|
||||
screen = SDL_CreateRGBSurface(0, DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT, 32, 0xff0000, 0xff00, 0xff, 0xff000000);
|
||||
if (screen == NULL)
|
||||
{
|
||||
printf("Couldn't create %ix%ix32 surface: %s\n", DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT, SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
screen_adjustDimensions(DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT);
|
||||
|
||||
window = SDL_CreateWindow("Project: Starfighter",
|
||||
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||
|
@ -289,21 +284,7 @@ void engine_setMode()
|
|||
SDL_SetWindowIcon(window, gfx_loadImage("gfx/alienDevice.png"));
|
||||
SDL_SetWindowFullscreen(window, engine.fullScreen ? FULLSCREEN : 0);
|
||||
|
||||
renderer = SDL_CreateRenderer(window, -1, 0);
|
||||
if (renderer == NULL)
|
||||
{
|
||||
printf("Could not create renderer: %s\n", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
SDL_RenderSetLogicalSize(renderer, screen->w, screen->h);
|
||||
|
||||
renderer_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen->w, screen->h);
|
||||
if (renderer_texture == NULL)
|
||||
{
|
||||
printf("Couldn't create %ix%ix32 texture: %s\n", screen->w, screen->h, SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
renderer_reset();
|
||||
|
||||
#ifndef NOSOUND
|
||||
if (engine.useAudio)
|
||||
|
|
|
@ -337,6 +337,8 @@ void player_getInput()
|
|||
case SDL_WINDOWEVENT:
|
||||
if (engine.event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||
{
|
||||
screen_adjustDimensions(engine.event.window.data1, engine.event.window.data2);
|
||||
renderer_reset();
|
||||
screen_clear(black);
|
||||
renderer_update();
|
||||
screen_clear(black);
|
||||
|
|
|
@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "structs.h"
|
||||
|
||||
#include "screen.h"
|
||||
#include "window.h"
|
||||
|
||||
SDL_Renderer *renderer;
|
||||
SDL_Texture *renderer_texture;
|
||||
|
@ -36,3 +37,28 @@ void renderer_update()
|
|||
SDL_RenderCopy(renderer, renderer_texture, NULL, NULL);
|
||||
SDL_RenderPresent(renderer);
|
||||
}
|
||||
|
||||
// Call after screen_adjustDimensions.
|
||||
void renderer_reset()
|
||||
{
|
||||
if (renderer == NULL)
|
||||
{
|
||||
renderer = SDL_CreateRenderer(window, -1, 0);
|
||||
if (renderer == NULL)
|
||||
{
|
||||
printf("Could not create renderer: %s\n", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
SDL_RenderSetLogicalSize(renderer, screen->w, screen->h);
|
||||
|
||||
if (renderer_texture != NULL)
|
||||
SDL_DestroyTexture(renderer_texture);
|
||||
|
||||
renderer_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen->w, screen->h);
|
||||
if (renderer_texture == NULL)
|
||||
{
|
||||
printf("Couldn't create %ix%ix32 texture: %s\n", screen->w, screen->h, SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,5 +29,6 @@ extern SDL_Renderer *renderer;
|
|||
extern SDL_Texture *renderer_texture;
|
||||
|
||||
void renderer_update();
|
||||
void renderer_reset();
|
||||
|
||||
#endif
|
||||
|
|
40
src/screen.c
40
src/screen.c
|
@ -133,3 +133,43 @@ void screen_drawRect(int x, int y, int w, int h, Uint8 red, Uint8 green, Uint8 b
|
|||
{
|
||||
gfx_drawRect(screen, x, y, w, h, red, green, blue);
|
||||
}
|
||||
|
||||
/*
|
||||
Adjust the dimensions of the screen to match the aspect ratio of the
|
||||
window, using DEFAULT_SCREEN_WIDTH and DEFAULT_SCREEN_HEIGHT as a
|
||||
baseline.
|
||||
*/
|
||||
void screen_adjustDimensions(int w, int h)
|
||||
{
|
||||
double default_ratio = (double)DEFAULT_SCREEN_WIDTH / (double)DEFAULT_SCREEN_HEIGHT;
|
||||
double new_ratio = (double)w / (double)h;
|
||||
|
||||
// Calculate dimensions
|
||||
if (new_ratio > default_ratio)
|
||||
{
|
||||
// Wide screen
|
||||
w = (DEFAULT_SCREEN_HEIGHT * w) / h;
|
||||
h = DEFAULT_SCREEN_HEIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Tall screen
|
||||
w = DEFAULT_SCREEN_WIDTH;
|
||||
h = (DEFAULT_SCREEN_WIDTH * h) / w;
|
||||
}
|
||||
|
||||
// Free previous surface (if it exists)
|
||||
if (screen != NULL)
|
||||
{
|
||||
SDL_FreeSurface(screen);
|
||||
screen = NULL;
|
||||
}
|
||||
|
||||
// Create the surface
|
||||
screen = SDL_CreateRGBSurface(0, w, h, 32, 0xff0000, 0xff00, 0xff, 0xff000000);
|
||||
if (screen == NULL)
|
||||
{
|
||||
printf("Couldn't create %ix%ix32 surface: %s\n", w, h, SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,5 +38,6 @@ void screen_flushBuffer();
|
|||
void screen_unBuffer();
|
||||
void screen_clear(Uint32 color);
|
||||
void screen_drawRect(int x, int y, int w, int h, Uint8 red, Uint8 green, Uint8 blue);
|
||||
void screen_adjustDimensions(int w, int h);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue