我正在使用c ++和SFML,但是我尝试从他们的sf :: Sprite抽象类继承时遇到了问题。由于我的空间分区的性质,每个精灵都有可能被绘制为接触到的网格单元格,这里是渲染代码
for(int i = 0; i < board.GetGrid().size(); i++){
for(int k = 0; k < board.GetGrid()[i].GetMovableObjects().size(); k++){
window.draw(board.GetGrid()[i].GetMovableObjects()[k]);
}
for(int j = 0; j < board.GetGrid()[i].GetStationaryObjects().size(); j++){
window.draw(board.GetGrid()[i].GetStationaryObjects()[j]);
}
}
因此循环告诉每个单元格绘制它包含的所有对象,因此可以多次绘制一些对象(sf :: Sprites),这是我不想要的。解决方案是给每个对象一个bool drawn
,这样我就可以看到是否已经绘制了一个给定的对象,如此
for(int i = 0; i < board.GetGrid().size(); i++){
for(int k = 0; k < board.GetGrid()[i].GetMovableObjects().size(); k++){
if(!board.GetGrid()[i].GetMovableObjects()[k].drawn){
//draw
问题是:std :: vectors movableObjects
和stationaryObjects
是sf :: Sprite对象的向量:std::vector<sf::Sprite> movableObjects, stationaryObjects;
和sf :: Sprite没有我可以使用的bool drawn;
,所以我必须创建自己的派生类
#include "SFML\Graphics.hpp"
class MoveableObject : sf::Sprite{
//this is a pure virtual function, must be implemented by inheriting classes
virtual void draw(sf::RenderTarget &target, sf::RenderStates &states) {};
public:
bool drawn;
};
所以我将我的向量更改为std::vector<MovableObject> movableObjects, stationaryObjects;
,以便这里的对象像sprite一样,但也可以返回drawn
或其他我想要添加的内容。很长的帖子,所以我会明白:我如何处理抽象类的向量?当我尝试向moveableObjects.push_back(sprite)
这些向量添加项目时(sprite是一个简单的sf :: Sprite)我得到编译器错误“没有合适的用户定义转换”sf :: Sprite“到”MoveableObject“存在”
尝试继承SFML的类,所以我可以添加自己的函数让我发疯,所以我该怎么办呢?