SFML отрисовывает только некоторые спрайты

У меня странная проблема, когда один спрайт загружается, а другой нет.

Вот мой main.cpp

    window.draw(universe.getPlayer()->draw());  //Draw Player

    std::list<AbstractBlock*>::const_iterator i;
    std::list<AbstractBlock*>* values = universe.getLoadedBlocks();

    for (i = values->begin(); i != values->end(); ++i){
        window.draw((*i)->draw()); //Draw Blocks
    }

    window.display();

Здесь вы можете увидеть рисунок игрока и рисунок всех блоков вселенной. Однако рисует только игрок, а блоки вообще не рисуются. Я убедился, что цикл действительно работает. Однако, поскольку draw() возвращает void, я не могу понять, работает он или нет.

Вот DirtBlock.cpp (наследуется от AbstractBlock)

DirtBlock::DirtBlock(int x, int y, float rotation, b2World *world){
    bodyDef.position.Set(x, y);
    bodyDef.linearDamping = .03f;
    bodyDef.type = b2_dynamicBody;

    fixDef.density = .1f;

    b2PolygonShape shape;
    shape.SetAsBox(16, 16);

    fixDef.shape = &shape;

    body = world->CreateBody(&bodyDef);
    body->CreateFixture(&fixDef);

    texture.loadFromFile("Dirt.bmp");

    sprite.setTexture(texture);
    sprite.setOrigin(16, 16);


}

sf::Sprite DirtBlock::draw(){
    sprite.setPosition(body->GetPosition().x, body->GetPosition().y);
    return sprite;
}

Не все включено, только то, что связано с рисованием.

Мой класс Player очень похож:

Player::Player(b2World *world){

    texture.loadFromFile("player.bmp");
    bodyDef.position.Set(10, 10);
    bodyDef.type = b2_dynamicBody;
    fixDef.density = .1f;
    b2PolygonShape shape;
    shape.SetAsBox(16, 16);
    fixDef.shape = &shape;

    body = world->CreateBody(&bodyDef);
    body->CreateFixture(&fixDef);
    body->SetLinearDamping(.03f);

    sprite.setTexture(texture);
    sprite.setOrigin(16, 16);

    force = 10.f;

}

sf::Sprite Player::draw(){
    sprite.setPosition(body->GetPosition().x, body->GetPosition().y);
    sprite.setRotation(body->GetAngle() * (180 / b2_pi));
    return sprite;
}

Если они так похожи, почему один рисунок, а другой нет? У меня такое чувство, что это может быть из-за моего наследства. Обычно я программист на Java, и я не уверен на 100%, что правильно выполнил наследование в C++. Должно ли быть так? (Мой DirtBlock.h)

class DirtBlock: public AbstractBlock
{
public:
    DirtBlock();
    DirtBlock(int x, int y, float rotation, b2World *world);
    ~DirtBlock();
    virtual sf::Sprite draw();
    virtual void destroy(b2World *world);
private: 
    sf::Sprite sprite;
};

person MagnusCaligo    schedule 31.08.2015    source источник
comment
Возможно ли, что ваша текстура загружается неправильно?   -  person bpgeck    schedule 02.09.2015


Ответы (1)


Я на самом деле исправил это сам. Это оказалось глупой ошибкой с моей стороны, но я мог бы написать и ответить, поэтому, если кто-то еще совершит эту ошибку, они могут найти это, и это может решить их проблему.

Я не делал функцию draw в классе AbstractBlock virtual. Из-за этого, когда я вызывал отрисовку для DirtBlock, он искал метод отрисовки в AbstractBlock, у которого не было виртуального флага.

person MagnusCaligo    schedule 03.09.2015