使用不可复制对象的向量
Using vectors of non-copyable objects
我正在尝试使用 sfml 构建一个在功能上同时 运行 多个 windows 的应用程序。为了做到这一点,我正在尝试做通常从函数内部的 while 运行 循环完成的操作,该函数具有一个 for 循环,该循环通过 RenderWindows 的向量。还有另一个函数可以添加到该向量中。问题是 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>
应该合适。用 new
或 std::make_unique<sf::RenderWindow>
(C++14).
初始化它
请注意,您的主循环需要完全不同,因为您需要轮询多个 windows。 pollEvent
不适合,因为它会阻塞:如果您在 wnd1
上调用它,您将无法处理到达其他 windows 的事件,直到某些事件到达 wnd1
嗯。
我正在尝试使用 sfml 构建一个在功能上同时 运行 多个 windows 的应用程序。为了做到这一点,我正在尝试做通常从函数内部的 while 运行 循环完成的操作,该函数具有一个 for 循环,该循环通过 RenderWindows 的向量。还有另一个函数可以添加到该向量中。问题是 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>
应该合适。用 new
或 std::make_unique<sf::RenderWindow>
(C++14).
请注意,您的主循环需要完全不同,因为您需要轮询多个 windows。 pollEvent
不适合,因为它会阻塞:如果您在 wnd1
上调用它,您将无法处理到达其他 windows 的事件,直到某些事件到达 wnd1
嗯。