绘制“更高级别”的对象

时间:2017-04-25 04:13:12

标签: c++ sfml

所以我正在使用SFML进行计算机科学项目 - 制作国际象棋游戏。我有一个类Square,它是棋盘的一个方格 - 目前,它包含四个顶点(成员变量sf::Vertex中的四个sf::VertexArray个对象)并且颜色为白色或黑色。一个班级ChessBoard封装了std::vector个正方形。

使用SFML提供的教程,我可以绘制一个正方形。但是,draw()函数基于顶点工作,并且由于ChessBoard类实际上并不包含顶点,而是包含顶点的对象,我无法绘制棋盘(即其内部draw()函数不起作用。)

有谁知道如何解决这个问题? (如果需要/我可以提供更多信息/说明/代码。)

2 个答案:

答案 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。