Home > Database > Mysql Tutorial > Cocos2d-x3.1事件实例

Cocos2d-x3.1事件实例

WBOY
Release: 2016-06-07 15:01:08
Original
1033 people have browsed it

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.h
#include "cocos2d.h"
USING_NS_CC;
using namespace cocos2d;

class TouchableSpriteTest : public Scene
{
public:
    CREATE_FUNC(TouchableSpriteTest);//首先执行new操作,然后执行init函数
    virtual bool init();
    
};
Copy after login
在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;
}</sprite></sprite></sprite>
Copy after login
(2)自定义触摸事件

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

//.h
class CustomEvent : public Scene
{
public:
    CREATE_FUNC(CustomEvent);
    virtual bool init();
private:
    EventListenerCustom* _listener1;//自定义事件
    EventListenerCustom* _listener2;
};
Copy after login
在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;
}</char></char>
Copy after login





Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template