Вектор класса не хранит отдельные текстуры - PullRequest
0 голосов
/ 02 июня 2018

Я создаю симуляцию автомобиля с использованием SFML.

В целях организации и логики я создал отдельный класс "car", который также наследует sf :: RectangleShape, и в этом классе естьдругие объекты SFML, включая текстуру и метод ее настройки.

Я хочу иметь несколько машин, поэтому я создал вектор класса "автомобиль".

В этом примере я оставил только 2 машины с изображениями: "car-red.png" и "car-black.png".enter image description here

Вот выдержка из логики, которую я использую (я сделал тестовую программу, чтобы облегчить понимание):

#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

То есть второе изображение (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.

Чтоэто?

1 Ответ

0 голосов
/ 02 июня 2018

Ваша первая проблема возникает потому, что вы создаете только один экземпляр 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());
...