繁体   English   中英

使用不可复制对象的向量

[英]Using vectors of non-copyable objects

我正在尝试使用 sfml 来构建一个在功能上同时运行多个窗口的应用程序。 为了做到这一点,我试图做通常会从一个函数内部的 while 运行循环中完成的操作,该函数具有一个通过 RenderWindows 向量的 for 循环。 还有另一个函数可以添加到该向量。 问题是 RenderWindows 是不可复制的。 任何帮助表示赞赏。

我的矢量

    vector <MakeKey::NewKey> KeyArray;
    vector <sf::RenderWindow> WindowArray;
    int VectorSize;

五月主

int main()
{
    sf::RenderWindow window(sf::VideoMode(100, 100, 32), "Main Window", sf::Style::Default);
    MakeKey MakeKey;
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            //Key Presses
            if (event.type == sf::Event::KeyPressed) {
                if (event.key.code == sf::Keyboard::A)
                    MakeKey.DrawKey("A");
                else if (event.key.code == sf::Keyboard::D)
                    MakeKey.DrawKey("D");
                //Ect
            }
            if (event.type == sf::Event::Closed)
                window.close();
        }
        MakeKey.StepWindows();
    }
    return EXIT_SUCCESS;
}

我的 StepWindows 功能

void MakeKey::StepWindows()
{
    for (int i{ 0 }; i > VectorSize; i++)
    {
        cout << "Inside Step Windows For Loop" << endl;
        WindowArray[i].setActive(true);
        WindowArray[i].clear(sf::Color::Transparent);
        WindowArray[i].draw(KeyArray[i].Sprite);
        WindowArray[i].display();
    }
}

我的 DrawKey 功能

void MakeKey::DrawKey(string input)
{
    MakeKey::NewKey Key;
    if (input == "A")
        Key.Img.loadFromFile("Assets/Images/A.png");
    else if (input == "D")
        Key.Img.loadFromFile("Assets/Images/D.png");
    VectorSize++;
    //WindowArray.reserve(VectorSize);
//attempting to reference deleted function error
    //WindowArray.emplace_back(); 
//same error
    WindowArray[VectorSize].create(sf::VideoMode(Key.Img.getSize().x, Key.Img.getSize().y, 32), "Key", sf::Style::None);
    Key.Tex.loadFromImage(Key.Img);
    Key.Sprite.setTexture(Key.Tex);
    KeyArray.emplace_back(move(Key));
    cout << "KeyArray Has " << KeyArray.size() << " Elements\n" << "WindowArray Has " << WindowArray.size() << " Elements" << endl;
}

和我的关键结构

    typedef struct KeyStruct {
        sf::Image Img;
        sf::Texture Tex;
        sf::Sprite Sprite;
    }NewKey;

而是存储一个指针。 std::unique_ptr<sf::RenderWindow>应该是合适的。 newstd::make_unique<sf::RenderWindow> (C++14) 初始化它。

请注意,您的主循环需要完全不同,因为您需要轮询多个窗口。 pollEvent不适合,因为它会阻塞:如果您在wnd1上调用它,则在某些事件也到达wnd1之前,您将无法处理到达其他窗口的事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM