#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 }