绘画“高级”目的

Drawing "higher-level" object

本文关键字:目的 高级 绘画      更新时间:2023-10-16

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

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

有人知道如何解决这个问题吗?(如有必要,我可以提供更多信息/澄清/代码/有用。(

这不是真正"更高级别的绘图"的方法。

您的父母课程不必打扰如何吸引孩子。您正在混合职责。

而不是子类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,但是您'll还需要指针或引用其他Ressources。因此,ChessBoard必须知道,从Square请求哪些组件才能正确绘制它(它具有着色器?我需要纹理吗?(。

没关系。傻我。在Square类中实现了一个返回顶点数组的Getter,&Chessboard内部通过正方形向量循环,调用每次迭代的Getter。