多次调用C++cocos2dx事件回调

C++ cocos2dx event callback called multiple times

本文关键字:事件 回调 C++cocos2dx 调用      更新时间:2023-10-16

Yo!我做了一个小实验,在这个实验中我有很多可触摸的方块。一旦触摸,块必须更改其属性,如大小、颜色和不透明度。但当我触摸一个区块时,分配给其他区块的回调也会被触发。我应该如何使用Cocos2dx的Event Dispatcher机制来只触发一个回调(一个,也是唯一分配给它的回调(?换句话说,如果我单击块A,分配给它的onTouchBegin回调将被触发。这是我的实际代码:

bool SimpleGameLayer::init() {
  // ...
  // begin loop here
  auto square = DrawNode::create();
  square->setContentSize( Size(square_size, square_size) );
  // ...
  square->drawSolidPoly(verts, 4, Color4F(0x8b/255.0, 0xb7/255.0, 0xc4/255.0, 1.0f));
  addChild(square, 1);
  // ...
  auto listener = EventListenerTouchOneByOne::create();
  listener->setSwallowTouches( true );
  listener->onTouchBegan = [](Touch* touch, Event* event) {
            auto target = static_cast<DrawNode*>(event->getCurrentTarget());
            log("TouchBegan on %s", target->getName().c_str());
            return false;
        };
  _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, square);
  // ...
  // end loop here
}

无论我触摸(或点击(哪个方块或正方形,我总是会得到一堆线:

TouchBegan on ....
TouchBegan on ....
TouchBegan on ....
TouchBegan on ....
TouchBegan on ....

我还通过添加具有不同优先级的所有方块来测试我的代码,但没有成功。

因为onTouchBegin一直返回false,所以它无法接受触摸。如果你只想让一个区块获得触摸事件,你需要在TouchBegin回调列表中更改这一点。

listener->onTouchBegan = [](Touch* touch, Event* event) {
            auto target = static_cast<DrawNode*>(event->getCurrentTarget());
            log("TouchBegan on %s", target->getName().c_str());
            return true;
        };