当前位置:Gxlcms > mysql > Cocos2d-x3.1事件实例

Cocos2d-x3.1事件实例

时间:2021-07-01 10:21:17 帮助过:24人阅读

1、触摸事件:定义NewEventDispatcher类,用于声明触摸事件 (1)单点触摸事件,在NewEventDispatcher.h中添加如下代码: //NewEventDispatcher.h#include cocos2d.hUSING_NS_CC;using namespace cocos2d;class TouchableSpriteTest : public Scene{public:

1、触摸事件:定义NewEventDispatcher类,用于声明触摸事件

(1)单点触摸事件,在NewEventDispatcher.h中添加如下代码:

  1. //NewEventDispatcher.h
  2. #include "cocos2d.h"
  3. USING_NS_CC;
  4. using namespace cocos2d;
  5. class TouchableSpriteTest : public Scene
  6. {
  7. public:
  8. CREATE_FUNC(TouchableSpriteTest);//首先执行new操作,然后执行init函数
  9. virtual bool init();
  10. };
在NewEventDispatcher.cpp中添加如下代码:
  1. //NewEventDispatcher.cpp
  2. bool TouchableSpriteTest::init()
  3. {
  4. bool bRet = false;
  5. do{
  6. CC_BREAK_IF(!Scene::init());
  7. auto origin = Director::getInstance()->getVisibleOrigin();
  8. log("origin.x = %f, origin.y = %f",origin.x,origin.y);
  9. auto size = Director::getInstance()->getVisibleSize();
  10. log("size.w = %f, size.h = %f",size.width,size.height);
  11. auto containerForSprite1 = Node::create();
  12. auto sprite1 = Sprite::create("CyanSquare.png");
  13. sprite1->setPosition(origin+Vec2(size.width/2,size.height/2) + Vec2(-80,80));
  14. containerForSprite1->addChild(sprite1,10);
  15. addChild(containerForSprite1,11);
  16. auto sprite2 = Sprite::create("MagentaSquare.png");
  17. sprite2->setPosition(origin + Vec2(size.width/2, size.height/2));
  18. addChild(sprite2,20);
  19. auto sprite3 = Sprite::create("YellowSquare.png");
  20. sprite3->setPosition(Vec2(0,0));
  21. addChild(sprite3,1);
  22. //1.创建侦听事件
  23. auto listener1 = EventListenerTouchOneByOne::create();
  24. listener1->setSwallowTouches(true);
  25. //2.重载onTouch*函数,使用的时lambda方法,如果使用函数重载,需要在.h文件中声明。 //或者在TouchableTest的头文件中声明onTouchBegan的函数重载; //listener1->onTouchBegan = CC_CALLBACK_2(TouchableSpriteTest::onTouchBegan,this); //在TouchableTest的cpp文件中重新定义。
  26. listener1->onTouchBegan = [](Touch* touch, Event* event) {
  27. auto target = static_cast<sprite*>(event->getCurrentTarget());
  28. log("target.Tag = %d",target->getTag());
  29. auto locationInNode = target->convertToNodeSpace(touch->getLocation());
  30. auto s = target->getContentSize();
  31. auto rect = Rect(0,0,s.width,s.height);
  32. if(rect.containsPoint(locationInNode))
  33. {
  34. log("sprite begin...x = %f,y = %f",locationInNode.x,locationInNode.y);
  35. target->setOpacity(180);
  36. return true;
  37. }
  38. return false;
  39. };
  40. listener1->onTouchMoved = [](Touch* touch,Event* event){
  41. auto target = static_cast<sprite*>(event->getCurrentTarget());
  42. log("target.Tag = %d",target->getTag());
  43. target->setPosition(target->getPosition() + touch->getDelta());
  44. log("target.x = %lf, target.y = %lf\n touch.x = %lf,touch.y = %lf",target->getPosition().x,target->getPosition().y,touch->getDelta().x,touch->getDelta().y);
  45. };
  46. listener1->onTouchEnded = [=](Touch* touch,Event* event){
  47. auto target = static_cast<sprite*>(event->getCurrentTarget());
  48. log("sprite onTouchedEnded..");
  49. target->setOpacity(255);
  50. if(target == sprite2)
  51. {
  52. containerForSprite1->setLocalZOrder(100);
  53. }
  54. else if(target == sprite1)
  55. {
  56. containerForSprite1->setLocalZOrder(0);
  57. }
  58. };
  59. //3.加入事件侦听序列
  60. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
  61. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
  62. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);
  63. bRet = true;
  64. }while(0);
  65. return bRet;
  66. }</sprite*></sprite*></sprite*>
(2)自定义触摸事件

在NewEventDispatcher.h中添加如下代码:

  1. //.h
  2. class CustomEvent : public Scene
  3. {
  4. public:
  5. CREATE_FUNC(CustomEvent);
  6. virtual bool init();
  7. private:
  8. EventListenerCustom* _listener1;//自定义事件
  9. EventListenerCustom* _listener2;
  10. };
在NewEventDispatcher.cpp中添加如下代码:
  1. //.cpp
  2. bool CustomEvent::init()
  3. {
  4. bool bRet = false;
  5. do{
  6. CC_BREAK_IF(!Scene::init());
  7. auto origin = Director::getInstance()->getVisibleOrigin();
  8. auto size = Director::getInstance()->getVisibleSize();
  9. MenuItemFont::setFontSize(20);
  10. auto statusLabel = Label::createWithSystemFont("No custom event 1 received!", "", 20);
  11. statusLabel->setPosition(origin + Vec2(size.width/2, size.height-90));
  12. addChild(statusLabel);
  13. //1.创建侦听事件及回调函数,该自定义事件监听的时game_custom_event1事件
  14. _listener1 = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){
  15. std::string str("Custom event 1 received, ");
  16. char* buf = static_cast<char*>(event->getUserData());
  17. str += buf;
  18. str += " times";
  19. statusLabel->setString(str.c_str());
  20. });
  21. //2.将侦听事件加入事件侦听序列
  22. _eventDispatcher->addEventListenerWithFixedPriority(_listener1, 1);
  23. //设置MenuItem,名字叫Send Custom Event 1,触发的事件是lambda函数,点击“Send Custom Event 1”,触发
  24. auto sendItem = MenuItemFont::create("Send Custom Event 1", [=](Ref* sender){
  25. static int count = 0;
  26. ++count;
  27. char* buf = new char[10];
  28. sprintf(buf, "%d", count);
  29. EventCustom event("game_custom_event1");//创建自定义事件,名字为“game_custom_event1”
  30. event.setUserData(buf);
  31. _eventDispatcher->dispatchEvent(&event);//将自定义事件加入侦听,触发事件,
  32. CC_SAFE_DELETE_ARRAY(buf);
  33. });
  34. sendItem->setPosition(origin + Vec2(size.width/2, size.height/2));
  35. auto statusLabel2 = Label::createWithSystemFont("No custom event 2 received!", "", 20);
  36. statusLabel2->setPosition(origin + Vec2(size.width/2, size.height-120));
  37. addChild(statusLabel2);
  38. //同_listener1
  39. _listener2 = EventListenerCustom::create("game_custom_event2", [=](EventCustom* event){
  40. std::string str("Custom event 2 received, ");
  41. char* buf = static_cast<char*>(event->getUserData());
  42. str += buf;
  43. str += " times";
  44. statusLabel2->setString(str.c_str());
  45. });
  46. //同_listener1
  47. _eventDispatcher->addEventListenerWithFixedPriority(_listener2, 1);
  48. auto sendItem2 = MenuItemFont::create("Send Custom Event 2", [=](Ref* sender){
  49. static int count = 0;
  50. ++count;
  51. char* buf = new char[10];
  52. sprintf(buf, "%d", count);
  53. EventCustom event("game_custom_event2");
  54. event.setUserData(buf);
  55. _eventDispatcher->dispatchEvent(&event);
  56. CC_SAFE_DELETE_ARRAY(buf);
  57. });
  58. sendItem2->setPosition(origin + Vec2(size.width/2, size.height/2 - 40));
  59. auto menu = Menu::create(sendItem, sendItem2, nullptr);
  60. menu->setPosition(Vec2(0, 0));
  61. menu->setAnchorPoint(Vec2(0, 0));
  62. addChild(menu, -1);
  63. bRet = true;
  64. }while(0);
  65. return bRet;
  66. }</char*></char*>

人气教程排行