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

C++ 如何编辑SFML源代码以添加新的可绘制对象?,c++,open-source,transform,edit,sfml,C++,Open Source,Transform,Edit,Sfml,嘿,我正在研究一个叫做“身体”的类,它把形状和精灵作为一个对象放在一起。我想进入源代码并添加一个新的重载RenderWindow的Draw()函数,这样就可以轻松地获取和绘制这个新对象我该怎么做? 我目前正在使用 视窗7 SFML 1.6 新msVS++2010编译的静态调试库和DLL 原始包含文件夹 编辑: 我在Drawable.hpp标题中也发现了这一点: private : friend class RenderTarget; ///////////////////////

嘿,我正在研究一个叫做“身体”的类,它把形状和精灵作为一个对象放在一起。我想进入源代码并添加一个新的重载RenderWindow的Draw()函数,这样就可以轻松地获取和绘制这个新对象我该怎么做?

我目前正在使用

  • 视窗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;
但是我不知道每个函数的完整代码在哪里,只有声明。
不幸的是,我也没有在那里找到迷你教程…

RenderWindow::Draw
获取抽象类类型的对象
Drawable
。这意味着,从理论上讲,您可以将您的
主体
类设置为
可绘制
的子类,并重载一些虚拟方法以使其呈现

但事实似乎并非如此。显示该类中只有一个虚拟函数:析构函数。这是。。。有点愚蠢

然而,外表可能是骗人的。我正在检查他们是否已经找到了正确创建继承层次结构的方法,结果发现他们确实有虚拟方法要重写。只是它们都是私有的(这本身很好,事实上是一件非常好的事情),而且SFML人员没有告诉Doxygen为私有成员生成文档。我在这件事上向他们提出了一个错误

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

注意:

在您派生并实现自己的可绘制功能之前。SFML的作者指出,
sf::Drawable

除此之外

对于SFML 1.6:

似乎您所需要做的就是从
sf::Drawable
派生类,然后实现一个虚拟
呈现
函数

class MyDrawable : public sf::Drawable {

private:

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

    sf::Sprite mySubSprite;

};
这方面的一个例子是

对于SFML 2.0:

包含描述如何派生自己的
Drawable
类的注释。您不需要修改SFML源代码来创建新的绘图表

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

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

你指的是什么“Windows Draw()”函数?我知道我是通过键入Window.Draw(obj)来绘制东西的;SFML的窗口类没有绘图函数。所以我重申:你指的是什么
Windows.Draw
函数?这是在您自己的代码中还是在某个库中?哦,这是一个RenderWindow,让我把它放在问题中。@Griffin完整的代码(实现)将在相应的
.cpp
文件中,而不是在头文件中。比较
Sprite.hpp
Sprite.cpp
。好的,谢谢!另外,难道不可能简单地在drawable中添加一个draw函数来简单地绘制每个形状和精灵,这样我就可以使用它们的draw()函数吗?@Griffin:除了需要更改一个不是你的库之外,你还不知道它是如何工作的,这几乎肯定会引入一些bug,如果你按照他们的方式去做的话,图书馆就不会有这些bug了?是的,你可以这样做。但您也可以自己重写SFML。我建议你花点时间去弄清楚如何按照图书馆希望你的方式做事,而不是破坏图书馆,强迫它按照你的方式做事。好吧,所以我浏览了来源并编辑了这个问题,新的信息有帮助吗?但是我找不到完整的函数定义……这个例子不在1.6中,并且没有渲染器对象,只有RenderTarget和RenderWindow。(也许我应该升级..=/Example已过时;请签出更新的
sf::Drawable
抽象类。@Di-0xide:感谢您指出这一点。我已在回答中用SFML主干中当前用于
sf::Drawable
的内容更新了示例。