class 的矢量未存储单独的纹理
Vector of class not storing separate Textures
我正在使用 SFML 创建汽车模拟。
作为组织和逻辑问题,我创建了一个 class "car",它也继承了 sf::RectangleShape,并且在这个 class 中还有其他 SFML 对象,其中有一个纹理和一个设置它的方法。
我想要多辆车,所以我创建了一个class"car"的向量。
在这个例子中,我只留下了 2 辆车的图像:
"car-red.png" 和 "car-black.png"。
这是我使用的逻辑的摘录(我做了一个测试程序以使其更容易理解):
#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#define debug(x) std::cout << #x << "=" << x << std::endl;
using namespace std;
class car : public sf::RectangleShape {
public:
string s;
sf::Texture tex;
sf::Sprite img;
void imgInit(string imgFile) {
tex.loadFromFile(imgFile);
img.setTexture(tex);
s = imgFile;
}
};
int main()
{
vector<car> vecRet;
car objRet;
objRet.imgInit("car-red.png");
objRet.setSize(sf::Vector2f(150, 70));
objRet.setFillColor(sf::Color::Yellow);
vecRet.push_back(objRet);
objRet.imgInit("car-black.png");
objRet.setPosition(sf::Vector2f(300, 300));
objRet.img.setPosition(objRet.getPosition());
vecRet.push_back(objRet);
debug(vecRet[0].s);
debug(vecRet[1].s);
debug(vecRet[0].img.getTexture());
debug(vecRet[1].img.getTexture());
sf::RenderWindow window(sf::VideoMode(500,500), "Window", sf::Style::Close);
window.setFramerateLimit(120);
while (window.isOpen())
{
for (sf::Event event; window.pollEvent(event);) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(vecRet[0]);
window.draw(vecRet[1]);
window.draw(vecRet[0].img);
window.draw(vecRet[1].img);
window.display();
}
return EXIT_SUCCESS;
}
有两个问题我无法解决:
1) 即使做push_back
两辆车,也只有最后一张图为准。
显然,push_back 指的是图像的单个 RAM 地址。
那么结果是这样的:
也就是说,第二张图片(car-black.png)可能与第一张图片的地址重叠。
奇怪的是,这只发生在纹理 class 上。在示例中,程序 debug
是 class 中的一个字符串,在这种情况下没有重叠:
vecRet[0].s=car-red.png
vecRet[1].s=car-black.png
但是 class 向量中的纹理对象指向相同的内存地址:
vecRet[0].img.getTexture()=000000C57A5FF250
vecRet[1].img.getTexture()=000000C57A5FF250
如何解决?
2) 第二个问题是,对于每个vecRet.push_back(objRet)
,控制台中出现以下错误:
An internal OpenGL call failed in Texture.cpp(98).
Expression:
glFlush()
Error description:
GL_INVALID_OPERATION
The specified operation is not allowed in the current state.
这是什么?
您的第一个问题发生是因为您只实例化了一个 car
,但是您将两个图像加载到它上面。第二个问题可能是由于push_back()
将元素复制到向量中,导致总共创建了四个car
,而不是两个.
试试这个代码:
vector<car> vecRet(2);
vecRet[0].imgInit("car-red.png");
vecRet[0].setSize(sf::Vector2f(150, 70));
vecRet[0].setFillColor(sf::Color::Yellow);
vecRet[1].imgInit("car-black.png");
vecRet[1].setPosition(sf::Vector2f(300, 300));
vecRet[1].img.setPosition(vecRet[1].getPosition());
我正在使用 SFML 创建汽车模拟。
作为组织和逻辑问题,我创建了一个 class "car",它也继承了 sf::RectangleShape,并且在这个 class 中还有其他 SFML 对象,其中有一个纹理和一个设置它的方法。
我想要多辆车,所以我创建了一个class"car"的向量。
在这个例子中,我只留下了 2 辆车的图像:
"car-red.png" 和 "car-black.png"。
这是我使用的逻辑的摘录(我做了一个测试程序以使其更容易理解):
#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#define debug(x) std::cout << #x << "=" << x << std::endl;
using namespace std;
class car : public sf::RectangleShape {
public:
string s;
sf::Texture tex;
sf::Sprite img;
void imgInit(string imgFile) {
tex.loadFromFile(imgFile);
img.setTexture(tex);
s = imgFile;
}
};
int main()
{
vector<car> vecRet;
car objRet;
objRet.imgInit("car-red.png");
objRet.setSize(sf::Vector2f(150, 70));
objRet.setFillColor(sf::Color::Yellow);
vecRet.push_back(objRet);
objRet.imgInit("car-black.png");
objRet.setPosition(sf::Vector2f(300, 300));
objRet.img.setPosition(objRet.getPosition());
vecRet.push_back(objRet);
debug(vecRet[0].s);
debug(vecRet[1].s);
debug(vecRet[0].img.getTexture());
debug(vecRet[1].img.getTexture());
sf::RenderWindow window(sf::VideoMode(500,500), "Window", sf::Style::Close);
window.setFramerateLimit(120);
while (window.isOpen())
{
for (sf::Event event; window.pollEvent(event);) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(vecRet[0]);
window.draw(vecRet[1]);
window.draw(vecRet[0].img);
window.draw(vecRet[1].img);
window.display();
}
return EXIT_SUCCESS;
}
有两个问题我无法解决:
1) 即使做push_back
两辆车,也只有最后一张图为准。
显然,push_back 指的是图像的单个 RAM 地址。
那么结果是这样的:
也就是说,第二张图片(car-black.png)可能与第一张图片的地址重叠。
奇怪的是,这只发生在纹理 class 上。在示例中,程序 debug
是 class 中的一个字符串,在这种情况下没有重叠:
vecRet[0].s=car-red.png
vecRet[1].s=car-black.png
但是 class 向量中的纹理对象指向相同的内存地址:
vecRet[0].img.getTexture()=000000C57A5FF250
vecRet[1].img.getTexture()=000000C57A5FF250
如何解决?
2) 第二个问题是,对于每个vecRet.push_back(objRet)
,控制台中出现以下错误:
An internal OpenGL call failed in Texture.cpp(98).
Expression:
glFlush()
Error description:
GL_INVALID_OPERATION
The specified operation is not allowed in the current state.
这是什么?
您的第一个问题发生是因为您只实例化了一个 car
,但是您将两个图像加载到它上面。第二个问题可能是由于push_back()
将元素复制到向量中,导致总共创建了四个car
,而不是两个.
试试这个代码:
vector<car> vecRet(2);
vecRet[0].imgInit("car-red.png");
vecRet[0].setSize(sf::Vector2f(150, 70));
vecRet[0].setFillColor(sf::Color::Yellow);
vecRet[1].imgInit("car-black.png");
vecRet[1].setPosition(sf::Vector2f(300, 300));
vecRet[1].img.setPosition(vecRet[1].getPosition());