cocos2d-x 3.x学习之TouchOneByOne单点触摸

来源:互联网 发布:php文件怎么用打开手机 编辑:程序博客网 时间:2024/05/21 01:47
#include <iostream>#include "cocos2d.h"USING_NS_CC;class TouchOneByOneTest:public Layer{public:    static Scene* createScene();    virtual bool init();    void menuCloseCallback(Ref* pSender);    CREATE_FUNC(TouchOneByOneTest);};

#include "TouchOneByOneTest.h"Scene* TouchOneByOneTest::createScene(){    auto scene = Scene::create();    auto layer = TouchOneByOneTest::create();    scene->addChild(layer);    return scene;}bool TouchOneByOneTest::init(){    if(!Layer::init()){        return false;    }    Size visibleSize = Director::getInstance()->getVisibleSize();    Vec2 origin = Director::getInstance()->getVisibleOrigin();        auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(TouchOneByOneTest::menuCloseCallback, this));    closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,origin.y + closeItem->getContentSize().height / 2));    //删除触摸监听器    auto removeAllTouchItem = MenuItemFont::create("删除所有的触摸监听器",[this](Ref* sender){        auto senderItem = static_cast<MenuItemFont*>(sender);        senderItem->setString("触摸监听器删除成功");        _eventDispatcher->removeEventListenersForType(EventListener::Type::TOUCH_ONE_BY_ONE);    });    removeAllTouchItem->setPosition(visibleSize.width / 2, visibleSize.height * 0.2);    //创建菜单    auto menu = Menu::create(removeAllTouchItem,closeItem,NULL);    menu->setPosition(Vec2::ZERO);    this->addChild(menu);        //标题标签    auto title = Label::createWithSystemFont("单点触摸测试","", 64);    this->setPosition(visibleSize.width / 2,visibleSize.height * 0.9);    this->addChild(title);        //提示标签    auto subtitle = Label::createWithSystemFont("请单击或拖动滑块","", 32);    subtitle->setPosition(visibleSize.width / 2,visibleSize.height * 0.8);    this->addChild(subtitle);    //创建三个精灵对象    auto sprite1 = Sprite::create("CyanSquare.png");    sprite1->setPosition(Vec2(visibleSize.width / 2,visibleSize.height / 2) + Vec2(-80, 80));    addChild(sprite1,10);    auto sprite2 = Sprite::create("MagentaSquare.png");    sprite2->setPosition(Vec2(visibleSize.width / 2,visibleSize.height / 2));    addChild(sprite2,20);    auto sprite3 = Sprite::create("YellowSquare.png");    sprite3->setPosition(Vec2(0, 0));    sprite2->addChild(sprite3,1);    //创建一个单点触摸事件监听器,处理触摸事件逻辑    auto listener1 = EventListenerTouchOneByOne::create();    //设置是否向下传递触摸    listener1->setSwallowTouches(true);    listener1->onTouchBegan = [](Touch* touch,Event* event){        //获得当前事件触摸的目标对象        auto target = static_cast<Sprite*>(event->getCurrentTarget());        //获得当前的触摸点        Point locationInNode = target->convertToNodeSpace(touch->getLocation());        //获得触摸对象的ContentSize        Size s = target->getContentSize();        //获得位置矩形        Rect rect = Rect(0, 0, s.width, s.height);        //如果位置矩形包含触摸点        if(rect.containsPoint(locationInNode)){            log("onTouchBegan..x = %f, y = %f",locationInNode.x,locationInNode.y);            //设置透明度            target->setOpacity(180);            //表明用户触摸事件已经被处理,后续的Moved Ended Cancelled会接着响应,其他事件监听器则不会再去进行监听本次触摸事件            return true;        }        return false;    };    listener1->onTouchMoved = [](Touch* touch,Event* event){        log("onTouchMoved...");        auto target = static_cast<Sprite*>(event->getCurrentTarget());        //移动触摸的精灵        target->setPosition(target->getPosition()+touch->getDelta());            };    listener1->onTouchEnded = [=](Touch* touch,Event* event){        auto target = static_cast<Sprite*>(event->getCurrentTarget());        //设置透明度        target->setOpacity(255);        std::string name;        if(target == sprite2){            name = "MagentaSquare.png";            sprite1->setZOrder(100);            subtitle->setString("响应事件的是酒红色滑块,青色滑块的ZOrder修改为100");                    }        else if(target == sprite1){          name = "CyanSquare.png";            sprite1->setZOrder(0);            subtitle->setString("响应事件的是青色滑块,青色滑块的ZOrder值修改为0");        }else{          name = "YellowSquare.png";        }        log("onTouchEnded..您触摸的是%s",name.c_str());    };    //添加场景优先事件监听器    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,sprite1);    //再次使用上面的函数时要使用clone函数创建一个新的克隆    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(),sprite2);    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);    return true;}void TouchOneByOneTest::menuCloseCallback(Ref* pSendr){#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");    return;#endif        Director::getInstance()->end();    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)    exit(0);#endif}

0 0
原创粉丝点击