将sdl窗口包装在一个类中并创建一个向量。然后,将两个窗口对象合并在一起将只创建一个窗口,尽管希望有两个。
#include <SDL.h>
#include <vector>
class Window
{
SDL_Window* m_window;
SDL_Renderer* m_renderer;
int m_windowID;
public:
Window( int w, int h, Uint32 mode = SDL_WINDOW_SHOWN )
{
m_window = SDL_CreateWindow( "", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, mode );
m_renderer = SDL_CreateRenderer( m_window , -1, SDL_RENDERER_PRESENTVSYNC );
m_windowID = SDL_GetWindowID(m_window);
}
~Window()
{
SDL_DestroyRenderer(m_renderer);
SDL_DestroyWindow( m_window);
}
void render()
{
SDL_SetRenderDrawColor(m_renderer, 0xff, 0xff, 0xff, 0xff);
SDL_RenderClear(m_renderer);
SDL_RenderPresent(m_renderer);
}
void setTitle(const std::string& title)
{
SDL_SetWindowTitle(m_window, title.c_str());
}
};
int main( int argc, char* argv[] )
{
std::vector<Window> window;
window.emplace_back(/*width*/600,/*height*/480);
window.emplace_back(/*width*/600,/*height*/480);
window[0].setTitle(/*title*/"window-1");
window[1].setTitle(/*title*/"window-2");
SDL_Event event;
bool quit = false;
while( !quit )
{
while( SDL_PollEvent( &event ) )
{
if( event.type == SDL_QUIT)
{
quit = true;
}
}
for(auto& w: window)
{
w.render();
}
}
return 0;
}
SDL_CreateWindow
被调用两次却只创建一个窗口,为什么?
更新:设置窗口的标题将显示仅保留最后创建的窗口。
您违反了三五规则。
按下第二个窗口后,将重新分配向量,第一个将Window
被“复制”。新副本被保留,但旧副本的析构函数被调用。现在,新副本指向已损坏的窗口。(此外,该窗口在程序结束时第二次被破坏,这可能会导致未定义的行为)
如果std::unique_ptr
与适当的删除器一起使用,则不会发生这种情况。
#include <SDL2/SDL.h>
#include <vector>
#include <memory>
struct SDLWindowDestroyer
{
void operator()(SDL_Window* w) const
{
SDL_DestroyWindow(w);
}
};
struct SDLRendererDestroyer
{
void operator()(SDL_Renderer* r) const
{
SDL_DestroyRenderer(r);
}
};
class Window
{
std::unique_ptr<SDL_Window, SDLWindowDestroyer> m_window;
std::unique_ptr<SDL_Renderer, SDLRendererDestroyer> m_renderer;
int m_windowID;
public:
Window( int w, int h, const char* name, Uint32 mode = SDL_WINDOW_SHOWN ) :
m_window(SDL_CreateWindow( name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, mode )),
m_renderer(SDL_CreateRenderer( m_window.get() , -1, SDL_RENDERER_PRESENTVSYNC )),
m_windowID(SDL_GetWindowID(m_window.get()))
{
}
void render()
{
SDL_SetRenderDrawColor(m_renderer.get(), 0xff, 0xff, 0xff, 0xff);
SDL_RenderClear(m_renderer.get());
SDL_RenderPresent(m_renderer.get());
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句