c++ - 绘图 "higher-level"对象

标签 c++ sfml

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

相关文章:

c++ - C++中的动态调度和后期绑定(bind)有什么区别?

c++ - 由于放置新用法而禁止虚拟功能的体面方法

c++ - 添加方法到库

c++ - 如何阻止着色器扭曲纹理

c++ - 在 C++ 的 SFML 中居中​​形状/对象

c++ - SFML/C++/Windows10 奇怪的消息?

c++ - 为什么 SFML 加载白色方 block 而不是纹理?

c++ - 将可修改的参数传递给 C++ 函数

c++ - 在 iOS 上使用 OpenCV 文件存储

c++ - 字符串和 double 的问题,等号后得到另一个数字