所以我将 SFML 用于计算机科学项目 - 制作国际象棋游戏。我有一个 Square
类,它是棋盘的一个正方形 - 目前,它包含四个顶点(成员变量 sf 中的四个
) 并且颜色为白色或黑色。 sf::Vertex
对象: :VertexArrayChessBoard
类封装了一个 std::vector
方 block 。
使用 SFML 提供的教程,我能够绘制一个正方形。但是,draw()
函数基于顶点工作,并且由于 ChessBoard
类实际上并不包含顶点,而是本身包含顶点的对象,所以我无法绘制棋盘(即其内部 draw()
函数不起作用)。
有谁知道如何解决这个问题? (如果有必要/有帮助,我可以提供更多信息/说明/代码。)
最佳答案
这并不是“更高层次的绘图”应该如何工作的。
您的父类不必为如何画 child 而烦恼。你在混合职责。
相反,子类 sf::Drawable
(和 sf::Transformable
,如果需要的话)。
所有这一切都迫使你实现一个 draw()
成员,它完成所有的绘图。
这是您的 ChessBoard
类的一个简单示例:
class ChessBoard : public sf::Drawable {
void draw (RenderTarget &target, RenderStates states) const {
for (auto &tile : mTiles) // Iterate over all board pieces
target.draw(tile, states); // Draw them
}
}
如您所见,这对设置来说是微不足道的。以类似的方式,您可以重载您的 Square
类。 (这个名字是不是太通用了?为什么不简单地重用 sf::RectangleShape
?)
class ChessBoard : public sf::Drawable {
void draw (RenderTarget &target, RenderStates states) const {
target.draw(mVertices, states);
}
}
那么,回到您的主游戏循环。如何绘制ChessBoard
?同样,微不足道:
while (window.isOpen()) {
// All the other things happening
window.draw(mChessBoard);
}
虽然这种方法的优点一开始可能不那么明显,但很容易看出您有能力将责任向下传递。例如,ChessBoard
不必知道如何正确绘制Square
。在一个简单的例子中——只使用单色多边形——它并不那么容易被注意到,但是一旦你开始添加着色器、纹理等,你的代码就会变得更加清晰。突然间你不再需要返回一个 sf::VertexArray
,但您还需要指向其他资源的指针或引用。所以 ChessBoard
必须知道要从 Square
请求哪些组件才能正确绘制它(它有着色器吗?我需要纹理吗?)。
关于c++ - 绘图 "higher-level"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43601456/