所以我对SFML和C ++ 11有这个问题。
我正在阅读解释使用SFML开发游戏引擎的书。我是一个不错的方式,在这里和那里稍微改变代码,让它为我的项目工作。
我将尝试总结大局:在本书讨论世界物体生成的部分,我们需要建立一个将被世界绘制功能所吸引的场景。我们在buildScene()函数中执行此操作。
可绘制到屏幕的对象是SceneNodes。 SceneNodes有sf :: Drawable和sf :: Transformable,可以将它们绘制到屏幕上。在SceneNode类的内部,我们有一个std :: unique_ptr< SceneNode> Ptr,作为对某些函数快速引用SceneNode的一种方法。
attachChild是这些SceneNode函数之一。绘制或更新SceneNode时,它会自行绘制/更新,然后绘制其子节点。
void SceneNode::attachChild(Ptr child)
{
child->mParent = this;
mChildren.push_back(std::move(child));
}
我对移动语义和std :: move函数非常不熟悉。我知道它与关于不复制内存和保持高效的东西有关,还有关于类型转换的东西,但我对c ++很新,所以很难遵循文档。
无论如何,在buildNode()内部,我们构造我们的实体:
std::unique_ptr<Player> player(new Player(mTextures));
mPlayer = player.get();
mPlayer->setPosition(mSpawnPosition);
mPlayer->setVelocity(0.f, 0.f);
mSceneLayers[Air]->attachChild(std::move(player));
最后一行是问题所在。 attachChild似乎想要一个SceneNode :: Ptr对象,但本书的源代码使用上面的代码,我假设它适用于它们。
||=== Project2, Debug ===|
C:\Users\Game\Documents\CodeBlocks Workspace\Project2\Game\classes\World.cpp||In member function 'void World::buildScene()':|
C:\Users\Game\Documents\CodeBlocks Workspace\Project2\Game\classes\World.cpp|62|error: no matching function for call to 'SceneNode::attachChild(std::remove_reference<std::unique_ptr<Player>&>::type)'|
C:\Users\Game\Documents\CodeBlocks Workspace\Project2\Game\classes\World.cpp|62|note: candidate is:|
C:\Users\Game\Documents\CodeBlocks Workspace\Project2\Game\classes\..\headers\..\..\engine\headers\SceneNode.hpp|19|note: void SceneNode::attachChild(SceneNode::Ptr)|
C:\Users\Game\Documents\CodeBlocks Workspace\Project2\Game\classes\..\headers\..\..\engine\headers\SceneNode.hpp|19|note: no known conversion for argument 1 from 'std::remove_reference<std::unique_ptr<Player>&>::type {aka std::unique_ptr<Player>}' to 'SceneNode::Ptr {aka std::unique_ptr<SceneNode>}'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|
这是错误。此外,这里是教程书源代码的链接:here 源代码按章节组织,第3章之后的任何内容都应该包含我正在查看的代码(在World.cpp内部和飞机文件,就像我的播放器一样)