关于creator的C++和Lua插件的一个bug

将creatorReader读取解析出来的scene直接add到游戏中的Node中会导致创建多个默认的camera,因为reader解析导出文件的时候,会创建scene,scene的构造函数会创建默认camera,而我的代码本身已经有scene了。
因为readme给的使用方法都是直接从导出的场景文件读取然后直接runscene,所以不会出现这样的问题。但是https://github.com/ricardoquesada/cocos2d-x/tree/creator_reader这里给出来的例子是直接add解析出来的scene到节点的,这个问题是我在为某个node添加单点触控的时候发现的,因为发现当点击一次的时候touchbegan,touchended的回调都会执行两次(因为我就做了一个界面测试,所以只有两个camera,只执行两次),以下是触摸分发的一部分代码,里面有对camera进行循环。
代码具体位置:
void EventDispatcher::dispatchTouchEventToListeners(EventListenerVector* listeners, const std::function<bool(EventListener*)>& onEvent)


@minggo

修改一下 你需要处理触摸的层级 可以暂时解决这个问题 应该是全局zorder

@_cocoser 给出的链接,最新的代码都是一年前提交的,没看到对应代码,能否提供一个可复现的测试例,我用 creator_to_cocos2dx 的 0.3 版本,对于Button的事件,toughbegan toughend 事件都是正确的执行一次

新建的cpp工程其他没有改动,只是改写了init函数,添加了creator解析的scene。
test.zip (2.3 MB)

@2627993092

设置事件吞没,就避免这个问题了

auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [=](Touch*, Event*) mutable ->bool{
        log("touch begin, time: %d", beginCount++);
        return true;
    };
    listener->onTouchEnded = [=](Touch*, Event*) mutable {
        log("touch end, time: %d", endCount++);
    };
    listener->setSwallowTouches(true);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

这个不能算插件的bug,因为把任何一个场景,里面加入了子场景(不管这个子场景,是插件生成的,还是手动创建的),事件总是会传递,这是正常的逻辑 文档传送

关键是creator导出的只有scene,而且设置吞没不行啊,有些地方触摸不能吞没,而我总不能真的是只能用runScene来显示creator导出的场景了吧,起码我要在onInit onEnter onExit里面做自己的事情,直接runScene都没法做了,所以我是想把导出的场景add到我自己写的node里面,这样方便处理,我原本想的是根据creator获取的scene获取子节点从该scene remove掉然后加到我自己的node上,但是这样做按钮的触摸,粒子效果都没有,具体原因还没查

这个问题是不是你用错方法了,看下面 node 的方法

/**
     * Removes this node itself from its parent node with a cleanup.
     * If the node orphan, then nothing happens.
     * @see `removeFromParentAndCleanup(bool)`
     */
    virtual void removeFromParent();
    /**
     * Removes this node itself from its parent node.
     * If the node orphan, then nothing happens.
     * @param cleanup   true if all actions and callbacks on this node should be removed, false otherwise.
     * @js removeFromParent
     * @lua removeFromParent
     */
    virtual void removeFromParentAndCleanup(bool cleanup);

谢谢,是我用错了,接口不熟悉熟练