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