时间: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中添加如下代码:
在NewEventDispatcher.cpp中添加如下代码:
- //NewEventDispatcher.h
- #include "cocos2d.h"
- USING_NS_CC;
- using namespace cocos2d;
- class TouchableSpriteTest : public Scene
- {
- public:
- CREATE_FUNC(TouchableSpriteTest);//首先执行new操作,然后执行init函数
- virtual bool init();
- };
(2)自定义触摸事件
- //NewEventDispatcher.cpp
- bool TouchableSpriteTest::init()
- {
- bool bRet = false;
- do{
- CC_BREAK_IF(!Scene::init());
- auto origin = Director::getInstance()->getVisibleOrigin();
- log("origin.x = %f, origin.y = %f",origin.x,origin.y);
- auto size = Director::getInstance()->getVisibleSize();
- log("size.w = %f, size.h = %f",size.width,size.height);
- auto containerForSprite1 = Node::create();
- auto sprite1 = Sprite::create("CyanSquare.png");
- sprite1->setPosition(origin+Vec2(size.width/2,size.height/2) + Vec2(-80,80));
- containerForSprite1->addChild(sprite1,10);
- addChild(containerForSprite1,11);
- auto sprite2 = Sprite::create("MagentaSquare.png");
- sprite2->setPosition(origin + Vec2(size.width/2, size.height/2));
- addChild(sprite2,20);
- auto sprite3 = Sprite::create("YellowSquare.png");
- sprite3->setPosition(Vec2(0,0));
- addChild(sprite3,1);
- //1.创建侦听事件
- auto listener1 = EventListenerTouchOneByOne::create();
- listener1->setSwallowTouches(true);
- //2.重载onTouch*函数,使用的时lambda方法,如果使用函数重载,需要在.h文件中声明。 //或者在TouchableTest的头文件中声明onTouchBegan的函数重载; //listener1->onTouchBegan = CC_CALLBACK_2(TouchableSpriteTest::onTouchBegan,this); //在TouchableTest的cpp文件中重新定义。
- listener1->onTouchBegan = [](Touch* touch, Event* event) {
- auto target = static_cast<sprite*>(event->getCurrentTarget());
- log("target.Tag = %d",target->getTag());
- auto locationInNode = target->convertToNodeSpace(touch->getLocation());
- auto s = target->getContentSize();
- auto rect = Rect(0,0,s.width,s.height);
- if(rect.containsPoint(locationInNode))
- {
- log("sprite begin...x = %f,y = %f",locationInNode.x,locationInNode.y);
- target->setOpacity(180);
- return true;
- }
- return false;
- };
- listener1->onTouchMoved = [](Touch* touch,Event* event){
- auto target = static_cast<sprite*>(event->getCurrentTarget());
- log("target.Tag = %d",target->getTag());
- target->setPosition(target->getPosition() + touch->getDelta());
- 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);
- };
- listener1->onTouchEnded = [=](Touch* touch,Event* event){
- auto target = static_cast<sprite*>(event->getCurrentTarget());
- log("sprite onTouchedEnded..");
- target->setOpacity(255);
- if(target == sprite2)
- {
- containerForSprite1->setLocalZOrder(100);
- }
- else if(target == sprite1)
- {
- containerForSprite1->setLocalZOrder(0);
- }
- };
- //3.加入事件侦听序列
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);
- bRet = true;
- }while(0);
- return bRet;
- }</sprite*></sprite*></sprite*>
在NewEventDispatcher.h中添加如下代码:
在NewEventDispatcher.cpp中添加如下代码:
- //.h
- class CustomEvent : public Scene
- {
- public:
- CREATE_FUNC(CustomEvent);
- virtual bool init();
- private:
- EventListenerCustom* _listener1;//自定义事件
- EventListenerCustom* _listener2;
- };
- //.cpp
- bool CustomEvent::init()
- {
- bool bRet = false;
- do{
- CC_BREAK_IF(!Scene::init());
- auto origin = Director::getInstance()->getVisibleOrigin();
- auto size = Director::getInstance()->getVisibleSize();
- MenuItemFont::setFontSize(20);
- auto statusLabel = Label::createWithSystemFont("No custom event 1 received!", "", 20);
- statusLabel->setPosition(origin + Vec2(size.width/2, size.height-90));
- addChild(statusLabel);
- //1.创建侦听事件及回调函数,该自定义事件监听的时game_custom_event1事件
- _listener1 = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){
- std::string str("Custom event 1 received, ");
- char* buf = static_cast<char*>(event->getUserData());
- str += buf;
- str += " times";
- statusLabel->setString(str.c_str());
- });
- //2.将侦听事件加入事件侦听序列
- _eventDispatcher->addEventListenerWithFixedPriority(_listener1, 1);
- //设置MenuItem,名字叫Send Custom Event 1,触发的事件是lambda函数,点击“Send Custom Event 1”,触发
- auto sendItem = MenuItemFont::create("Send Custom Event 1", [=](Ref* sender){
- static int count = 0;
- ++count;
- char* buf = new char[10];
- sprintf(buf, "%d", count);
- EventCustom event("game_custom_event1");//创建自定义事件,名字为“game_custom_event1”
- event.setUserData(buf);
- _eventDispatcher->dispatchEvent(&event);//将自定义事件加入侦听,触发事件,
- CC_SAFE_DELETE_ARRAY(buf);
- });
- sendItem->setPosition(origin + Vec2(size.width/2, size.height/2));
- auto statusLabel2 = Label::createWithSystemFont("No custom event 2 received!", "", 20);
- statusLabel2->setPosition(origin + Vec2(size.width/2, size.height-120));
- addChild(statusLabel2);
- //同_listener1
- _listener2 = EventListenerCustom::create("game_custom_event2", [=](EventCustom* event){
- std::string str("Custom event 2 received, ");
- char* buf = static_cast<char*>(event->getUserData());
- str += buf;
- str += " times";
- statusLabel2->setString(str.c_str());
- });
- //同_listener1
- _eventDispatcher->addEventListenerWithFixedPriority(_listener2, 1);
- auto sendItem2 = MenuItemFont::create("Send Custom Event 2", [=](Ref* sender){
- static int count = 0;
- ++count;
- char* buf = new char[10];
- sprintf(buf, "%d", count);
- EventCustom event("game_custom_event2");
- event.setUserData(buf);
- _eventDispatcher->dispatchEvent(&event);
- CC_SAFE_DELETE_ARRAY(buf);
- });
- sendItem2->setPosition(origin + Vec2(size.width/2, size.height/2 - 40));
- auto menu = Menu::create(sendItem, sendItem2, nullptr);
- menu->setPosition(Vec2(0, 0));
- menu->setAnchorPoint(Vec2(0, 0));
- addChild(menu, -1);
- bRet = true;
- }while(0);
- return bRet;
- }</char*></char*>