当前位置: 首页 > 工具软件 > Byone > 使用案例 >

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

单于扬
2023-12-01
#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
}

 类似资料: