此代码可以正常使用
class ASpriteNode : public ASceneNode {
public:
explicit ASpriteNode( const sf::Texture& texture );
ASpriteNode( const sf::Texture& texture, const sf::IntRect& rect );
private:
virtual void drawCurrent( sf::RenderTarget& target, sf::RenderStates states ) const;
sf::Sprite sprite;
};
但如果我改行
virtual void drawCurrent( sf::RenderTarget& target, sf::RenderStates& states ) const;
然后精灵不会出现在屏幕上。
为什么?
答案 0 :(得分:2)
正如@Stephan在评论中指出的那样,问题出现了,因为您只在一个派生类中更改了drawCurrent
的函数签名。这会使ASpriteNode::drawCurrent
虚拟函数的更改ASceneNode::drawCurrent
变为重载,但不再覆盖 ASceneNode::drawCurrent
。因此,当调用ASceneNode::drawCurrent
时,不再调用ASpriteNode::drawCurrent
。
您需要将ASceneNode::drawCurrent
以及从ASceneNode
派生的所有类更改为新签名:
class ASceneNode {
....
virtual void drawCurrent( sf::RenderTarget& target, sf::RenderStates& states ) const;
....
};
class ASpriteNode : public ASceneNode {
....
virtual void drawCurrent( sf::RenderTarget& target, sf::RenderStates& states ) const;
....
};