使用vector emplace创建两个sdl窗口仅创建一个窗口

阿贝什·卡玛查里亚(Aabesh Karmacharya)

将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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C ++和SDL2创建一个带有矩形的窗口

来自分类Dev

使用Tkinter创建两个窗口并从第二个窗口获取名称

来自分类Dev

在一个Firefox窗口中使用两个帐户(例如,在Gmail中)登录

来自分类Dev

如何在电子 js 中创建一个新窗口,以使原始窗口在关闭新窗口之前无法使用?

来自分类Dev

如何让 Selenium 仅使用一个驱动程序 selenium(使用 c# 和 chromedriver)来操作两个浏览器窗口?

来自分类Dev

使用 bash 创建一个具有 2 个分离视图部分的窗口

来自分类Dev

如何使用一个命令创建一个有4个窗口的GNU会话,每个窗口运行不同的命令?

来自分类Dev

C#创建一个弹出窗口而不使用表格

来自分类Dev

如何使用Eclipse Kepler中的WindowBuilder核心创建一个简单的窗口?

来自分类Dev

使用另一个线程在WPF中创建新窗口时的奇怪行为

来自分类Dev

如何使用Eclipse Kepler中的WindowBuilder核心创建一个简单的窗口?

来自分类Dev

使用一个类创建和运行多个Java窗口

来自分类Dev

单击菜单命令时,使用createwindow()创建一个窗口

来自分类Dev

尝试创建一个Tk()窗口+使用while循环在shell中打印

来自分类Dev

使用菜单栏在 OS X 应用程序中创建一个新窗口

来自分类Dev

使用R中两个列表中的数据创建一个特殊矩阵

来自分类Dev

使用React每隔两个元素创建一个新的ul

来自分类Dev

Bouncycastle openpgpg:如何使用两个用户ID创建一个PGP密钥对?

来自分类Dev

使用两个分组名称来创建一个“组合”分组变量

来自分类Dev

如何使用LVM在两个磁盘上创建一个逻辑卷?

来自分类Dev

ASP.Net使用一个控制器创建两个模型

来自分类Dev

使用R在两个圆的交点上创建一个点

来自分类Dev

使用嵌套ifelse语句创建两个列而不是一个列的mutate函数

来自分类Dev

使用ggplot为数据帧的两个不同列创建一个boxplot

来自分类Dev

使用JavaScript中的循环从一个对象创建两个对象时出错

来自分类Dev

如何使用LVM在两个磁盘上创建一个逻辑卷?

来自分类Dev

如何使用Groovy的JsonBuilder创建一个包含两个元素的对象?

来自分类Dev

如何合并两个不同的表,然后使用vba创建一个新表?

来自分类Dev

约束错误MySQL 5.6同时使用一个外键创建两个表

Related 相关文章

  1. 1

    使用C ++和SDL2创建一个带有矩形的窗口

  2. 2

    使用Tkinter创建两个窗口并从第二个窗口获取名称

  3. 3

    在一个Firefox窗口中使用两个帐户(例如,在Gmail中)登录

  4. 4

    如何在电子 js 中创建一个新窗口,以使原始窗口在关闭新窗口之前无法使用?

  5. 5

    如何让 Selenium 仅使用一个驱动程序 selenium(使用 c# 和 chromedriver)来操作两个浏览器窗口?

  6. 6

    使用 bash 创建一个具有 2 个分离视图部分的窗口

  7. 7

    如何使用一个命令创建一个有4个窗口的GNU会话,每个窗口运行不同的命令?

  8. 8

    C#创建一个弹出窗口而不使用表格

  9. 9

    如何使用Eclipse Kepler中的WindowBuilder核心创建一个简单的窗口?

  10. 10

    使用另一个线程在WPF中创建新窗口时的奇怪行为

  11. 11

    如何使用Eclipse Kepler中的WindowBuilder核心创建一个简单的窗口?

  12. 12

    使用一个类创建和运行多个Java窗口

  13. 13

    单击菜单命令时,使用createwindow()创建一个窗口

  14. 14

    尝试创建一个Tk()窗口+使用while循环在shell中打印

  15. 15

    使用菜单栏在 OS X 应用程序中创建一个新窗口

  16. 16

    使用R中两个列表中的数据创建一个特殊矩阵

  17. 17

    使用React每隔两个元素创建一个新的ul

  18. 18

    Bouncycastle openpgpg:如何使用两个用户ID创建一个PGP密钥对?

  19. 19

    使用两个分组名称来创建一个“组合”分组变量

  20. 20

    如何使用LVM在两个磁盘上创建一个逻辑卷?

  21. 21

    ASP.Net使用一个控制器创建两个模型

  22. 22

    使用R在两个圆的交点上创建一个点

  23. 23

    使用嵌套ifelse语句创建两个列而不是一个列的mutate函数

  24. 24

    使用ggplot为数据帧的两个不同列创建一个boxplot

  25. 25

    使用JavaScript中的循环从一个对象创建两个对象时出错

  26. 26

    如何使用LVM在两个磁盘上创建一个逻辑卷?

  27. 27

    如何使用Groovy的JsonBuilder创建一个包含两个元素的对象?

  28. 28

    如何合并两个不同的表,然后使用vba创建一个新表?

  29. 29

    约束错误MySQL 5.6同时使用一个外键创建两个表

热门标签

归档