SFML只绘制一些精灵

SFML only draws some sprites

本文关键字:精灵 绘制 SFML      更新时间:2023-10-16

我遇到了一个奇怪的问题,一个精灵正在加载,而另一个却没有

这是我的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(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;
};

实际上我自己修复了它。这原来是我的一个愚蠢的错误,但我不妨写下来回答,所以如果其他人犯了这个错误,他们可能会发现这一点,这可能会解决他们的问题。

我没有在AbstractBlock类virtual中创建函数draw。因此,当我为DirtBlock调用draw时,它会在AbstractBlock中寻找没有虚拟标志的draw方法。