如何编辑SFML源代码来添加一个新的可绘制对象
How to edit SFML source code to add a new Drawable Object?
嘿,我正在制作一个名为"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
的对象。这意味着,在理论上,你可以让你的Body
类Drawable
的子和重载一些虚拟方法,使其呈现。
但情况似乎并非如此。Drawable
的文档表明,该类中只有一个虚函数:析构函数。这是……有点愚蠢。
然而,外表是具有欺骗性的。我正在检查2.0文档,看看他们是否已经弄清楚了如何正确地创建继承层次结构,结果发现他们确实有要重写的虚拟方法。只是它们都是私有的(这本身很好,实际上是一件非常好的事情),并且SFML人员没有告诉氧为私有成员生成文档。我向他们提交了一个bug。
在他们更新文档之前,我唯一能说的就是查看标题,也许是Sprite的源代码,并尝试找出如何正确创建派生的Drawable类。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值