所以我正在使用SFML进行计算机科学项目 - 制作国际象棋游戏。我有一个类Square
,它是棋盘的一个方格 - 目前,它包含四个顶点(成员变量sf::Vertex
中的四个sf::VertexArray
个对象)并且颜色为白色或黑色。一个班级ChessBoard
封装了std::vector
个正方形。
使用SFML提供的教程,我可以绘制一个正方形。但是,draw()
函数基于顶点工作,并且由于ChessBoard
类实际上并不包含顶点,而是包含顶点的对象,我无法绘制棋盘(即其内部draw()
函数不起作用。)
有谁知道如何解决这个问题? (如果需要/我可以提供更多信息/说明/代码。)
答案 0 :(得分:2)
这并不是“更高级别的绘画”应该如何运作。
您的父类不应该费心如何画儿童。你在混合责任。
相反,子类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
。在一个简单的例子中 - 仅使用单色多边形 - 它并不容易注意到,但是一旦你开始添加着色器,纹理等,你的代码会更加清晰。突然之间你不再需要返回一个{{1}但是,您还需要指向其他资源的指针或引用。所以sf::VertexArray
必须知道,ChessBoard
请求哪些组件正确绘制它(它是否有着色器?我需要纹理吗?)。
答案 1 :(得分:0)
没关系。傻我。在类Square
内实现了一个返回顶点数组的getter,&在Chessboard
内部循环通过正方形向量,在每次迭代时调用getter。