读书人

Cocos2d-x 开发 点击交互的四种处

发布时间: 2013-10-27 15:21:50 作者: rapoo

Cocos2d-x 开发 点击交互的四种处理

1、函数回调
  1. void menuCloseCallback(Object* pSender);
  2. auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",
  3. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
  4. void HelloWorld::menuCloseCallback(Object* pSender)
  5. {
  6. Director::getInstance()->end();
  7. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  8. exit(0);
  9. #endif
  10. }

2、Layer的touch消息响应
  1. //单点响应
  2. virtual bool onTouchBegan(Touch* touch, Event *event) override;
  3. virtual void onTouchMoved(Touch* touch, Event *event) override;
  4. virtual void onTouchEnded(Touch* touch, Event *event) override;
  5. virtual void onTouchCancelled(Touch *touch, Event *event) override;
  6. //多点响应
  7. virtual bool onTouchesBegan(Touch* touch, Event *event) override;
  8. virtual void onTouchesMoved(Touch* touch, Event *event) override;
  9. virtual void onTouchesEnded(Touch* touch, Event *event) override;
  10. virtual void onTouchesCancelled(Touch *touch, Event *event) override;

重写这些函数来对layer的点击做处理。当然,我们需要:

[cpp] view plaincopyprint?
  1. setTouchEnabled(true)。

此外有个小改动。对于单点触控响应,可以调用:

[cpp] view plaincopyprint?
  1. //设置为单点响应
  2. setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
  3. //设置为多点响应(默认)
  4. setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);

3、TouchEvent响应 这是新加入的响应方式。它主要是使用在UIWidget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:
[cpp] view plaincopyprint?
  1. //声明
  2. void touchButton(Object* object,TouchEventType type);
  3. //挂接到控件上
  4. uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));
  5. //实现
  6. void HelloWorld::touchButton(Object* object,TouchEventType type)
  7. {
  8. LabelTTF* label;
  9. switch (type)
  10. {
  11. case TouchEventType::TOUCH_EVENT_BEGAN:
  12. label = static_cast<LabelTTF*>(getChildByTag(11));
  13. label->setString("按下按钮");
  14. break;
  15. case TouchEventType::TOUCH_EVENT_MOVED:
  16. label = static_cast<LabelTTF*>(getChildByTag(11));
  17. label->setString("按下按钮移动");
  18. break;
  19. case TouchEventType::TOUCH_EVENT_ENDED:
  20. label = static_cast<LabelTTF*>(getChildByTag(11));
  21. label->setString("放开按钮");
  22. break;
  23. case TouchEventType::TOUCH_EVENT_CANCELED:
  24. label = static_cast<LabelTTF*>(getChildByTag(11));
  25. label->setString("取消点击");
  26. break;
  27. default:
  28. break;
  29. }
  30. }

4、Listener消息响应方式[cpp] view plaincopyprint?
  1. auto dispatcher = EventDispatcher::getInstance();
  2. auto myListener = EventListenerTouch::create(Touch::DispatchMode::ONE_BY_ONE);
  3. //如果不加入此句消息依旧会向下传递
  4. myListener->setSwallowTouches(true);
  5. myListener->onTouchBegan = [=](Touch* touch,Event* event)
  6. {
  7. <span style="white-space:pre"> </span>//some check
  8. <span style="white-space:pre"> </span> if (pass)
  9. <span style="white-space:pre"> </span>{
  10. return true;
  11. }
  12. return false;
  13. };
  14. myListener->onTouchMoved = [=](Touch* touch,Event* event)
  15. {
  16. //do something
  17. };
  18. myListener->onTouchEnded = [=](Touch* touch,Event* event)
  19. {
  20. //do something
  21. };
  22. dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite1);
  23. dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite2);

读书人网 >操作系统

热点推荐