2016-03-21 14 views
0

Birkaç sprite içeren bir ui :: ScrollView var.Sprite'ın dışına dokunduğumda bile dokunma olayı neden tetikleniyor?

Her sprite oluşturulan ve böyle bir şey yaparak her sprite dokunmatik dinleyici ekledik:

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); 
} 

Ekranda YERE tıklarsa problem, TÜM dokunmatik olayları tetiklemek gibi görünüyor döngü içinde oluşturulan sprite. Dinleyiciyi nasıl yarattığım konusunda yanlış bir şey var mı, yoksa bir ui :: ScrollView'daki dokunuşlarla bazı çatışmalarla ilgisi var mı? TouchListener Cocos2d-x nasıl çalıştığını ben v 3.10

cevap

0

kullanıyorum

olmasıdır çünkü. Birisi dokunma olayını yutmadıkça tüm dokunma dinleyici çağrılır. Kodunuz olacaktır: Birisi onu yutmak sürece

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); 
} 
0

cocos2dx, dokunmatik olay ekli her Düğüme dokunmatik olayı gönderir.

Ancak "düğüm" varsayılanının içeriğe dokunma konumunun geçerli olup olmadığını yargılamasını isterseniz, "addTouchEventListener" ile "UIWidget" kullanmayı deneyin. Kendi başına hesaplayacaktır.

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; 
} 
İlgili konular