如何编辑SFML源代码来添加一个新的可绘制对象

How to edit SFML source code to add a new Drawable Object?

本文关键字:一个 对象 绘制 何编辑 编辑 SFML 源代码 添加      更新时间:2023-10-16

嘿,我正在制作一个名为"Body"的类,它将形状和精灵作为一个对象放在一起。我想进入源代码并添加一个新的重载RenderWindow的Draw()函数,这样这个新对象就可以很容易地被吸收和绘制。我如何做到这一点?

我正在使用

    Windows 7
  • SFML 1.6
  • 最新msvs++ 2010编译的静态调试库和dll
  • 原始包含文件夹
编辑:

我也在Drawable.hpp header中发现了这一点:

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;

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

备注:

在你派生并实现你自己的Drawable之前,你可能要考虑一下你是否需要这样做。SFML的作者已经声明,sf::Drawable最初并不打算在SFML之外子类化。

,

For 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源代码来创建新的Drawables。

还包括一个简单的例子:

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,它应该包含一个类似的例子。

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

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

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

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

相关文章: