嘿,我正在研究一个名为“Body”的类,它将形状和精灵作为一个对象保存在一起。我想进入源代码并添加一个新的重载RenderWindow的Draw()函数,这样就可以很容易地获取和绘制这个新对象。 我该怎么做?
我正在使用
编辑:
我也在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;
但我无法弄清楚每个函数的完整代码在哪里,只是声明。 不幸的是,我没有找到那里的迷你教程......
答案 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类。