Я создаю симуляцию автомобиля с использованием SFML.
В целях организации и логики я создал отдельный класс "car", который также наследует sf :: RectangleShape, и в этом классе естьдругие объекты SFML, включая текстуру и метод ее настройки.
Я хочу иметь несколько машин, поэтому я создал вектор класса "автомобиль".
В этом примере я оставил только 2 машины с изображениями: "car-red.png" и "car-black.png".![enter image description here](https://i.stack.imgur.com/c8qET.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 ссылается на один адрес ОЗУ для изображения.
Тогда результат выглядит так: ![enter image description here](https://i.stack.imgur.com/zFero.png)
То есть второе изображение (car-black.png), вероятно, перекрывает адрес первого изображения.
Любопытно, что это происходит только с классом Texture.В этом примере программа debug
строка в классе, и в этом случае нет перекрытия:
vecRet[0].s=car-red.png
vecRet[1].s=car-black.png
Однако объекты текстуры в векторе класса указывают на один и тот же адрес памяти:
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.
Чтоэто?