Cocos2d x 为什么我在精灵外部触摸时也会触发触摸事件?
我有一个包含许多精灵的ui::ScrollView 我创建了每个精灵,并通过如下操作为每个精灵添加了一个触摸监听器:Cocos2d x 为什么我在精灵外部触摸时也会触发触摸事件?,cocos2d-x,cocos2d-x-3.0,cocos2d-x-3.x,Cocos2d X,Cocos2d X 3.0,Cocos2d X 3.x,我有一个包含许多精灵的ui::ScrollView 我创建了每个精灵,并通过如下操作为每个精灵添加了一个触摸监听器: for(int i=0; i < 5; i++){ Sprite* foo = Sprite::createWithSpriteFrameName("foo"); myScrollView->addChild(foo); auto listener = EventListenerTouchOneByOne::create(); lis
for(int i=0; i < 5; i++){
Sprite* foo = Sprite::createWithSpriteFrameName("foo");
myScrollView->addChild(foo);
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this,somestring](Touch* touch, Event* event){
......some code
};
listener->onTouchMoved = [foo,this,somestring](Touch* touch, Event* event){
......some code
};
listener->onTouchEnded = [foo,this,somestring](Touch* touch, Event* event){
......some code
};
foo->getEventDispatcher->addEventListenerWithSceneGraphPriority(listener1,foo);
}
for(int i=0;i<5;i++){
Sprite*foo=Sprite::CreateWithPriteFrameName(“foo”);
myScrollView->addChild(foo);
自动侦听器=EventListenerTouchOneByOne::create();
listener->OnTouchStart=[this,somestring](触摸*触摸,事件*事件){
……一些代码
};
listener->onTouchMoved=[foo,this,somestring](触摸*触摸,事件*事件){
……一些代码
};
listener->OnTouched=[foo,this,somestring](触摸*触摸,事件*事件){
……一些代码
};
foo->getEventDispatcher->addEventListenerWithSceneGraphPriority(listener1,foo);
}
问题是,如果我点击屏幕上的任何地方,它似乎会触发在循环中创建的所有精灵的触摸事件。我创建侦听器的方式是否有错误,或者与ui::ScrollView中的触摸冲突有关
我使用V3.10,因为这就是TouchListener在cocos2d-x中的工作方式。除非有人吞下了触摸事件,否则将调用所有触摸侦听器。您的代码是:
auto touchSwallower = EventListenerTouchOneByOne::create();
touchSwallower ->setSwallowed(true);
touchSwallower->onTouchBegan = [](){ return true;};
getEventDispatcher->addEventListenerWithSceneGraphPriority(touchSwallower ,scrollview);
for(int i=0; i < 5; i++){
Sprite* foo = Sprite::createWithSpriteFrameName("foo");
myScrollView->addChild(foo);
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowed(true);
listener->onTouchBegan = [this,somestring](Touch* touch, Event* event){
......some code
Vec2 touchPos = myScrollView->convertTouchToNodeSpace(touch);
return foo->getBoundingBox()->containsPoint(touchPos);
};
listener->onTouchMoved = [foo,this,somestring](Touch* touch, Event* event){
......some code
};
listener->onTouchEnded = [foo,this,somestring](Touch* touch, Event* event){
......some code
};
foo->getEventDispatcher->addEventListenerWithSceneGraphPriority(listener1,foo);
}
auto-touchWallower=EventListenerTouchOneByOne::create();
TouchWallower->SetWallown(真);
TouchWallower->OnTouchBegined=[](){返回true;};
getEventDispatcher->addEventListenerWithSceneGraphPriority(触摸屏、滚动视图);
对于(int i=0;i<5;i++){
Sprite*foo=Sprite::CreateWithPriteFrameName(“foo”);
myScrollView->addChild(foo);
自动侦听器=EventListenerTouchOneByOne::create();
listener->setSwallowed(true);
listener->OnTouchStart=[this,somestring](触摸*触摸,事件*事件){
……一些代码
Vec2 touchPos=myScrollView->convertTouchToNodeSpace(触摸);
返回foo->getBoundingBox()->containsPoint(touchPos);
};
listener->onTouchMoved=[foo,this,somestring](触摸*触摸,事件*事件){
……一些代码
};
listener->OnTouched=[foo,this,somestring](触摸*触摸,事件*事件){
……一些代码
};
foo->getEventDispatcher->addEventListenerWithSceneGraphPriority(listener1,foo);
}
除非有人吞下触摸事件,否则cocos2dx会将触摸事件发送到每个附加了触摸事件的节点
但是如果您想让“node”默认值判断是否在内容中触摸位置,请尝试使用“UIWidget”和“addTouchEventListener”。它将自行计算
bool Widget::onTouchBegan(Touch *touch, Event *unusedEvent)
{
_hitted = false;
if (isVisible() && isEnabled() && isAncestorsEnabled() && isAncestorsVisible(this) )
{
_touchBeganPosition = touch->getLocation();
auto camera = Camera::getVisitingCamera();
if(hitTest(_touchBeganPosition, camera, nullptr))
{
if (isClippingParentContainsPoint(_touchBeganPosition)) {
_hittedByCamera = camera;
_hitted = true;
}
}
}
if (!_hitted)
{
return false;
}
setHighlighted(true);
/*
* Propagate touch events to its parents
*/
if (_propagateTouchEvents)
{
this->propagateTouchEvent(TouchEventType::BEGAN, this, touch);
}
pushDownEvent();
return true;
}