0

这绝对是不可理解的。

首先我有这个功能:

void RenderSystem::onDraw( sf::RenderWindow& window, const sf::IntRect& viewRect ) {

    for(auto it = mComponents.begin() ; it != mComponents.end() ; ++it) {
        if ( viewRect.intersects( sf::IntRect( it->second->getGlobalBounds() ) ) )
            window.draw(*it->second);
    }
}

由这个调用:

void Game::onDraw()
{
    mWindow.clear(sf::Color(208,244,247));
    mWindow.setView(mCamera);

    SystemManager::instance()->getSystem<RenderSystem>()->onDraw( mWindow, mCamera.getCameraBounds()); 
    mWindow.setView(mWindow.getDefaultView());
    mWindow.display();
}

我遇到了一个简单的问题:在 RenderSystem::onDraw 中,viewRect.left、.top、.width 和 .height 的值不是好的值,而且看起来是随机的。我试过了:

void Game::onDraw()
{
    mWindow.clear(sf::Color(208,244,247));
    mWindow.setView(mCamera);

    const sf::IntRect cCoordCamera = mCamera.getCameraBounds();

    SystemManager::instance()->getSystem<RenderSystem>()->onDraw( mWindow, cCoordCamera );
    mWindow.setView(mWindow.getDefaultView());
    mWindow.display(); 
}

并且......它完美地工作。我不明白为什么...

有任何想法吗 ?

PS : GCC4.7 with Code::Blocks12 on Win7 32bits

4

1 回答 1

0

getCameraBounds()返回sf::IntRect&

class YourCamera {
    sf::IntRect intrect;

    // v--- Valid behavior ---v
    sf::IntRect getValid() { return intrect; } // returns intrect (copy or move)
    sf::IntRect& getValid2() { return intrect; } // returns a reference to intrect
    sf::IntRect getValid3() { sf::IntRect temporary; return temporary; } // returns a temporary IntRect (copy or move)
    sf::IntRect getValid4() { return sf::IntRect{...}; } // returns a temporary IntRect (copy or move)

    // v--- Undefined behavior ---v
    sf::IntRect& getInvalid2() { sf::IntRect temporary; return temporary; } // returns an invalid reference to temporary: undefined behavior
    sf::IntRect& getInvalid3() { return sf::IntRect{...}; } // returns an invalid reference to temporary: undefined behavior
};

我怀疑getCameraBounds()getInvalid()我的示例类似。如果函数是临时的,则不能从函数返回非const&值:它的生命周期不够长,并且会导致未定义的行为。


无关:

for(auto it = mComponents.begin() ; it != mComponents.end() ; ++it) {

您的循环复制 的所有元素mComponents,因为您使用的是auto代替auto&or const auto&。我想您不想在每一帧都复制所有组件,而只想“观察”它们(使用const auto&)或修改它们(使用auto&)。

于 2013-09-08T15:49:26.607 回答