如何编辑SFML源代码以添加新的可绘制对象?

时间:2011-07-10 00:00:31

标签: c++ open-source transform edit sfml

嘿,我正在研究一个名为“Body”的类,它将形状和精灵作为一个对象保存在一起。我想进入源代码并添加一个新的重载RenderWindow的Draw()函数,这样就可以很容易地获取和绘制这个新对象。 我该怎么做?

我正在使用

  • Windows 7
  • SFML 1.6
  • 最近msVS ++ 2010编译了静态调试库和dll
  • 原始包含文件夹

编辑:

我也在Drawable.hpp标题中找到了这个:

private :

    friend class RenderTarget;

////////////////////////////////////////////////////////////
/// Draw the object into the specified window
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
void Draw(RenderTarget& Target) const;

////////////////////////////////////////////////////////////
/// Render the specific geometry of the object
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
virtual void Render(RenderTarget& Target) const = 0;

但我无法弄清楚每个函数的完整代码在哪里,只是声明。 不幸的是,我没有找到那里的迷你教程......

2 个答案:

答案 0 :(得分:4)

注意:

在您衍生并实施自己的Drawable之前,you may want to consider if you need to do it at all。 SFML的作者声明sf::Drawable was not initially meant to be subclassed outside of SFML

除此之外,

对于SFML 1.6:

您需要做的就是从sf::Drawable派生您的课程,然后实施虚拟Render功能。

class MyDrawable : public sf::Drawable {

private:

    virtual void Render(RenderTarget& target) const {
        // Do some rendering of whatever...
        target.Draw(mySubSprite);
    }

    sf::Sprite mySubSprite;

};

这方面的一个例子可以是found on the SFML forums

对于SFML 2.0:

The Drawable header file from SFML包含描述如何派生自己的Drawable类的注释。您无需修改​​SFML源代码即可创建新的Drawable。

它还包括一个简单的例子:

class MyDrawable : public sf::Drawable
{
public :
   ...
private :
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // You can draw other high-level objects
        target.draw(m_sprite, states);
        // ... or use the low-level API
        states.texture = &m_texture;
        target.draw(m_vertices, states);
        // ... or draw with OpenGL directly
        glBegin(GL_QUADS);
        ...
        glEnd();
    }
    sf::Sprite m_sprite;
    sf::Texture m_texture;
    sf::VertexArray m_vertices;
};

此示例可能适用于SFML 2.0,但是如果从任何版本的SFML检查Drawable.hpp,它应该包含类似的示例。

答案 1 :(得分:0)

RenderWindow::Draw获取抽象类类型Drawable的对象。这意味着,理论上,您可以让Body类成为Drawable的子级,并重载一些虚拟方法以使其呈现。

但事实似乎并非如此。 The docs for Drawable表明该类中只有一个虚函数:析构函数。哪个......有点愚蠢。

然而,外表可能是骗人的。我正在检查the 2.0 documentation,看看他们是否已经弄清楚如何正确地创建继承层次结构,结果发现他们有虚拟方法来覆盖。只是他们都是私人的(这本身就很好,实际上是一件非常好的事情),SFML人员并没有告诉Doxygen为私人成员生成文档。我在这上面提出了一个错误。

在他们更新文档之前,我唯一可以说的是查看标题,也许是Sprite的源代码,并尝试弄清楚如何正确创建派生的Drawable类。