gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:32:15 25 4
gpt4 key购买 nike

所以我将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com