How to disable touchable sprite (stop touch events)?

Hi,

I have a bunch of touchable sprites that I want to disable them from responding to touch events during an animation.

class PotSprite : public Sprite {
protected:
    explicit PotSprite (int priority)
    : _eventListener (nullptr)
    , _fixedPriority (priority) { }

public:
    enum ChildTag {
        kCover = 1
    };
    
    static PotSprite* create (const std::string& filename, int priority = 0);

    virtual bool initWithFile (const std::string& filename) override;

    void onEnter () override;
    void onExit () override;
    
    EventListener* getEventListener () const { return _eventListener; };

    float radius () const {
        return this->getContentSize().width * 0.5f;
    }
    
private:
    EventListener*  _eventListener;
    int             _fixedPriority;
};


    void PotSprite::onEnter () {
        Sprite::onEnter();
        auto listener = EventListenerTouchOneByOne::create();
        listener->setSwallowTouches( true );
            
        listener->onTouchBegan = [this] (Touch* touch, Event* event) {
        };
    
        listener->onTouchMoved = [] (Touch* touch, Event* event) {
    
        };
            
        listener->onTouchEnded = [this] (Touch* touch, Event* event) {
            
        };
    
        _eventListener = listener;
    
        if (_fixedPriority != 0)
            _eventDispatcher->addEventListenerWithFixedPriority( _eventListener, _fixedPriority );
        else
            _eventDispatcher->addEventListenerWithSceneGraphPriority( _eventListener, this );
    }

I’ve tried to call, hoping that it will disable dispatching globally but no luck:

Director::getInstance()->getEventDispatcher()->setEnabled( false )

Following didn’t worked as well:

auto nodes = this->getChildren();
for (auto n : nodes) {
    auto pot = static_cast<PotSprite*>( n );
    auto listener = pot->getEventListener();
    listener->setEnabled( false );
}

Regards,
Mike.

Just don’t add event listeners to event dispatcher.

Yep, but I want the sprite to be able to respond to touch events… I need to disable it only for some time.

Just add Boolean variable to disable/enable touches

2 Likes

disable

Director::getInstance()->getEventDispatcher()->pauseEventListenersForTarget(this);

enable

Director::getInstance()->getEventDispatcher()->resumeEventListenersForTarget(this);

1 Like

@mrjones I tried this one and it didn’t worked. (as argument I’ve passed parent node)

@Meir_yanovich I want to utilize framework and not to introduce one more state in a game.

If you want to disable events for some sprite, don’t pass parent note, pass this.

You have to also pass true as a second argument for recursive disabling on any children.