3

嘿,我正在研究一个名为“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;

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

4

2 回答 2

4

笔记:

在派生并实现自己的 Drawable 之前,您可能需要考虑是否需要这样做。SFML 的作者表示,sf::Drawable 最初并不意味着要在 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;

};

这方面的一个例子可以在 SFML 论坛上找到

对于 SFML 2.0:

SFML的Drawable头文件包含描述如何派生您自己的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,但如果您Drawable.hpp从任何版本的 SFML 检查它应该包含一个类似的示例。

于 2011-07-10T02:27:09.893 回答
0

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

但情况似乎并非如此。的文档Drawable表明该类中只有一个虚函数:析构函数。这是......有点愚蠢。

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

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

于 2011-07-10T01:48:04.203 回答