【问题标题】:How to add multiple identical nodes to ListView如何将多个相同的节点添加到 ListView
【发布时间】:2023-04-05 17:43:01
【问题描述】:

我尝试将 Node 添加到 ListView 中:

auto nodeToAdd = loadCcbAsNode("fileccb.ccbi").get();

for (size_t i = 1; i < 10; i++)
{
    listView->addChild(nodeToAdd);       // it's cocos2d::ui::ListView
                                         // which i load to scene
}

但得到这样的错误:

CCASSERT(child->_parent == nullptr, "子已经添加,不能再添加");

我需要做什么?

【问题讨论】:

    标签: c++ cocos2d-x cocosbuilder


    【解决方案1】:

    这些节点可以简单地克隆吗?如果是,您可以在每次迭代时添加相同的副本:

    auto nodeToAdd = loadCcbAsNode("fileccb.ccbi").get();
    listView->addChild(nodeToAdd);
    
    for(size_t i = 1; i < 9; i++) {
        listView->addChild(nodeToAdd->clone());
    }
    

    或者,如果它是一次性操作,则随时加载一些实例:

    for(size_t i = 1; i < 10; i++) {
        listView->addChild(loadCcbAsNode("fileccb.ccbi").get());
    }
    

    【讨论】:

    • cocos2d::node 没有方法克隆,并且 2 个变体仅将一个节点添加到列表中。这没有帮助
    • 好的,尝试使用new cocos2d::node(*nodeToAdd),而不是它缺少的-&gt;clone()。
    • 关于变体 2,在您自己的回应中,您实际上是在做同样的事情,但要设置位置。是不是 ListView 不会自动处理其节点的位置,而您实际上已经看到了 9 个相同的节点彼此重叠?
    【解决方案2】:
    for (int i = 1; i < 100; i++)
    {
        NodePtr nodeToAdd = loadCcbAsNode("fileccb.ccbi");
        nodeToAdd->setPosition(0,i*45);                      // 45-size of height my node
                                                             // need to bias
        listView->addChild(nodeToAdd.get());
    }
    

    事实证明,当我创建auto nodeToAdd = loadCcbAsNode("fileccb.ccbi").get(); 时,nodeToAdd 有一个类型 Node,但 cocos 有一个特殊的智能指针 NodePtr,我用 NodePtr 类型调用值,它的指针自动将计数器加一,而 Node这没有。

    【讨论】:

    • 如果你把NodePtr nodeToAdd = loadCcbAsNode("fileccb.ccbi");移出循环,它会起作用吗?
    • 不工作。也调用断言CCASSERT(child-&gt;_parent == nullptr, "child already added. It can't be added again");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多