3

我正在尝试将一些代码从 Objective-C 转换为 C++

我有一个 CCNode,我想递归遍历它拥有的所有节点。

我不知道如何写这个:

 for(CCNode* child in [self children])
 {

 }

谁能帮我翻译一下?

更新:这是另一个 SO 答案的代码:CCNode recursive getChildByTag

4

3 回答 3

3

由于 C++ 中没有快速枚举,您可以通过迭代器或计数器对其进行迭代,当计数器达到集合大小时停止。然后使用objectAtIndex()获取每个对象:

for(int i = 0; i < getChildren()->count(); i++)
{
    CCNode *child = getChildren()->objectAtIndex(i);
    < Your code >
}
于 2013-07-03T00:18:16.690 回答
1

我假设您使用的是 Cocos2d-iPhone 的 c++ 端口?如果是这种情况,那么您可以使用 Cocos2d-x 的宏来迭代 CCArrays。

例子:

CCObject* pObj = nullptr;
CCARRAY_FOREACH(getChildren(), pObj)
{
    // do something
}
于 2013-07-06T11:03:01.200 回答
1

在 C++11 中,我们有具有for类似语法的基于范围的循环。

为此,您需要一个基于迭代器的包装器。

最简单的方法是使用# include <boost/iterator/iterator_facade.hpp>. 将基于索引的容器包装在iterator_facadeat begin/end中非常容易。

如果你已经写了一个struct my_iterator:boost::iterator_facade<my_iterator> {...};类型,那么只需写my_iterator begin( CCArray& )const版本和end版本。

完成此操作后,您将获得:

for(CCObject* obj : *getChildren()) 很接近,但使用CCObject而不是CCNode. 你碰巧知道thisare的孩子CCNode,但 Cocos2d 界面只告诉你孩子是CCObjects。

我会编写一个CCArrayAs<T>适配器函数,它返回一个CCArray带有类型T信息的包装。IE:

template<typename T>
struct CCArrayAs {
  CCArray* arr;
};

您会注意到它不会在T任何地方使用该类型。我们再次编写迭代器,但是对于上面struct的,返回类型而不是 aCCObject*T*using static_cast。然后我们编写begin( CCArrayAs& )endconst版本,我们从中得到的是:

for( CCNode* node : CCArrayAs<CCNode>(getChildren()) )

这非常接近于 Objective-C 的语法。如果您想要更漂亮的语法,请编写CCArrayAs<CCNode> GetChildren( CCNode* self ) { return self->getChildren(); },为您提供:

for( CCNode* node : GetChildren(this) )

这样做的缺点是它有很多样板,所有这些都是为了获得更漂亮的语法。这是您希望 Cocos2d 开发人员做的事情,而不是必须自己做。

如果你不想做所有这些工作,你可以简单地遍历索引。有关该解决方案,请参阅@RamyAlZuhouri 的答案。这要容易得多。

于 2013-07-03T02:25:05.263 回答