【问题标题】:Drawing "higher-level" object绘制“更高级别”对象
【发布时间】:2017-04-25 04:13:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    这并不是“高级绘图”应该如何工作的。

    您的父类不必费心如何绘制孩子。你在混合职责。

    改为子类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 请求哪些组件才能正确绘制它(它有着色器吗?我需要纹理吗?)。

    【讨论】:

    • 非常感谢您提供的所有信息。稍后将不得不详细查看,因为我正忙于完成我的项目,但非常感谢。
    【解决方案2】:

    没关系。傻我。在类Square 内实现了一个getter,它返回顶点数组,在Chessboard 内循环遍历正方形向量,在每次迭代时调用getter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多