Cocos2d-x3.1事件实例

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

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

//NewEventDispatcher.h
#include "cocos2d.h"
USING_NS_CC;
using namespace cocos2d;

class TouchableSpriteTest : public Scene
{
public:
    CREATE_FUNC(TouchableSpriteTest);//首先执行new操作,然后执行init函数
    virtual bool init();
    
};
在NewEventDispatcher.cpp中添加如下代码:

//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;
}
(2)自定义触摸事件

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

//.h
class CustomEvent : public Scene
{
public:
    CREATE_FUNC(CustomEvent);
    virtual bool init();
private:
    EventListenerCustom* _listener1;//自定义事件
    EventListenerCustom* _listener2;
};
在NewEventDispatcher.cpp中添加如下代码:

//.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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值