绘画“高级”目的
Drawing "higher-level" object
所以我将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。
- C++中名称篡改的目的是什么
- 通过实例理解std::move及其目的
- 功能原型的目的
- "input.length();"的目的是什么?
- 在函数中拥有函数原型的目的是什么?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 如何在 QTreeWidget 中检索特定项目的 mimeData?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 来自Visual Studio中控制台项目的exe文件?
- -Wlifetime 标志的目的是什么?
- 对于使用高级服务的分钟数和应付金额,我不断得到相同的数字
- 如何创建一个使用开源c项目的c++控制台应用程序
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 出于什么目的,非虚拟方法将与C++一起使用?
- C++ 高级代码未给出正确的输出
- 更改 git 分支名称后,在项目的 Visual Studio 代码中丢失智能感知(建议,转到定义C++
- 在C++中返回 IO 对象的目的是什么?
- 将此私有删除器函数包装在结构中的目的是什么?
- 绘画“高级”目的