Add Comment
Just messing around getting ready to put multiple window support into SDL_gpu… I couldn’t find a good reference for how to use multiple windows, even in SDL2’s demos. So here’s what I put together for a functioning demo (warning: no error-checking). This uses SDL2’s built-in rendering system (SDL_Renderer) so I could explore the limitations that I need to work with.
#include "SDL.h"
typedef struct Sprite
{
SDL_Texture* texture;
float x, y;
float velx, vely;
} Sprite;
typedef struct Group
{
Uint32 windowID;
SDL_Renderer* renderer;
Sprite sprite;
} Group;
#define screen_w 300
#define screen_h 300
#define sprite_w 100
#define sprite_h 100
Group create_group()
{
Group g;
SDL_Window* window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screen_w, screen_h, 0);
g.windowID = SDL_GetWindowID(window);
SDL_Log("New windowID: %u\n", g.windowID);
g.renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface* surface = SDL_LoadBMP("data/test.bmp");
g.sprite.texture = SDL_CreateTextureFromSurface(g.renderer, surface);
g.sprite.x = rand()%screen_w;
g.sprite.y = rand()%screen_h;
g.sprite.velx = 10 + rand()%screen_w/10;
g.sprite.vely = 10 + rand()%screen_h/10;
SDL_FreeSurface(surface);
return g;
}
int main(int argc, char* argv[])
{
int max_groups = 30;
Group groups[max_groups];
memset(groups, 0, sizeof(Group)*max_groups);
int num_groups = 0;
groups[num_groups] = create_group();
num_groups++;
int i = 0;
float dt = 0.010f;
Uint32 startTime = SDL_GetTicks();
long frameCount = 0;
Uint8 done = 0;
SDL_Event event;
while(!done)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
done = 1;
else if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_ESCAPE)
done = 1;
else if(event.key.keysym.sym == SDLK_EQUALS || event.key.keysym.sym == SDLK_PLUS)
{
if(num_groups < max_groups)
{
groups[num_groups] = create_group();
num_groups++;
SDL_Log("num_groups: %d\n", num_groups);
}
}
else if(event.key.keysym.sym == SDLK_MINUS)
{
if(num_groups > 0)
{
for(i = max_groups-1; i >= 0; i--)
{
if(groups[i].windowID != 0)
{
SDL_DestroyTexture(groups[i].sprite.texture);
SDL_DestroyRenderer(groups[i].renderer);
SDL_DestroyWindow(SDL_GetWindowFromID(groups[i].windowID));
groups[i].windowID = 0;
num_groups--;
SDL_Log("num_groups: %d\n", num_groups);
break;
}
}
if(num_groups == 0)
done = 1;
}
}
}
else if(event.type == SDL_WINDOWEVENT)
{
if(event.window.event == SDL_WINDOWEVENT_CLOSE)
{
Uint8 closed = 0;
for(i = 0; i < max_groups; i++)
{
if(groups[i].windowID != 0 && groups[i].windowID == event.window.windowID)
{
SDL_DestroyTexture(groups[i].sprite.texture);
SDL_DestroyRenderer(groups[i].renderer);
SDL_DestroyWindow(SDL_GetWindowFromID(groups[i].windowID));
groups[i].windowID = 0;
closed = 1;
num_groups--;
SDL_Log("num_groups: %d\n", num_groups);
break;
}
}
// The main window was closed, then.
if(!closed || num_groups == 0)
done = 1;
}
}
}
for(i = 0; i < max_groups; i++)
{
groups[i].sprite.x += groups[i].sprite.velx*dt;
groups[i].sprite.y += groups[i].sprite.vely*dt;
if(groups[i].sprite.x < 0)
{
groups[i].sprite.x = 0;
groups[i].sprite.velx = -groups[i].sprite.velx;
}
else if(groups[i].sprite.x > screen_w)
{
groups[i].sprite.x = screen_w;
groups[i].sprite.velx = -groups[i].sprite.velx;
}
if(groups[i].sprite.y < 0)
{
groups[i].sprite.y = 0;
groups[i].sprite.vely = -groups[i].sprite.vely;
}
else if(groups[i].sprite.y > screen_h)
{
groups[i].sprite.y = screen_h;
groups[i].sprite.vely = -groups[i].sprite.vely;
}
}
for(i = 0; i < max_groups; i++)
{
if(groups[i].windowID == 0)
continue;
SDL_RenderClear(groups[i].renderer);
SDL_Rect dstrect = {groups[i].sprite.x, groups[i].sprite.y, sprite_w, sprite_h};
SDL_RenderCopy(groups[i].renderer, groups[i].sprite.texture, NULL, &dstrect);
SDL_RenderPresent(groups[i].renderer);
}
SDL_Delay(10);
}
for(i = 0; i < max_groups; i++)
{
if(groups[i].windowID == 0)
continue;
SDL_DestroyTexture(groups[i].sprite.texture);
SDL_DestroyRenderer(groups[i].renderer);
SDL_DestroyWindow(SDL_GetWindowFromID(groups[i].windowID));
}
SDL_Quit();
return 0;
}
In case that doesn’t display well in blog format… Download the source here: sdl2_multiwindow