• cocos2dx CCLayer上精灵的点击判断的问题


    今天发现的问题,记录下,对cocos2d坐标转换的理解还不透彻,看来有必要去学习下OpenGL的基础知识了。

    //使用的2dx是老版本.

    1. 平时在CCLayer上放置的CCSprite,判断是否被点击到的,我一般这样做:

    //on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
    		
            //Get window size. 
            CCSize size = CCDirector::sharedDirector()->getWinSize();
    		
            //pSprite is a CCSprite for test.
            pSprite = CCSprite::spriteWithFile("fjut.png");
            CC_BREAK_IF(! pSprite);
    		
            //Place the sprite on the center of the screen	
            pSprite->setPosition(ccp(size.width/2, size.height/2));
    		
            this->addChild(pSprite, 0);
            bRet = true;
        } while (0);
    	
        this->setIsTouchEnabled(true);
        return bRet;
    }
    void HelloWorld::registerWithTouchDispatcher()
    {
        CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, -1988, true);
    }
    
    static CCRect getRect(CCNode* pNode)
    {
        CCRect rc;
        rc.origin = pNode->getPosition();
        rc.size = pNode->getContentSize();
        rc.origin.x -= rc.size.width*0.5;
        rc.origin.y -= rc.size.height*0.5;
        return rc;
    }
    
    void HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* event)
    {
        CCPoint touchLocation = convertTouchToNodeSpace(pTouch);
        if(CCRect::CCRectContainsPoint(getRect(pSprite), touchLocation))
        {
    	    printf("我被点中了!\n");
        }
    }
    
    bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
    {
        return true;
    }

    2. 要是在CCLayer1上放置CCLayer2(有偏移),再向CCLayer2上放置CCSprite的点击判断需要计算偏移量:

    eg:

    //on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
            bRet = true;
        } while (0);
    	
        this->setIsTouchEnabled(true);
    	
        this->testLayer();
    	
        return bRet;
    }
    
    void HelloWorld::testLayer()
    {
        CCLayer* ly = CCLayer::node();
        /*x, y轴各偏移100*/
        ly->setPosition(ccp(100, 100));
    
        //layer2 add to layer1
        this->addChild(ly);
    
        pSprite = CCSprite::spriteWithFile("fjut.png");
        pSprite->setPosition(ccp(20, 20));
        ly->addChild(pSprite, 0);
    }
    
    void HelloWorld::registerWithTouchDispatcher()
    {
        CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, -1988, true);
    }
    
    static CCRect getRect(CCNode* pNode)
    {
        CCRect rc;
        rc.origin = pNode->getPosition();
        rc.size = pNode->getContentSize();
        /*x, y轴各偏移100*/
        rc.origin.x -= rc.size.width*0.5 - 100;//!!!!
        rc.origin.y -= rc.size.height*0.5 - 100;//!!!!
        return rc;
    }
    
    void HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* event)
    {
        CCPoint touchLocation = convertTouchToNodeSpace(pTouch);
        if(CCRect::CCRectContainsPoint(getRect(pSprite), touchLocation))
        {
    	    printf("我被点中了!\n");
        }
    }
    
    bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
    {
        return true;
    }
  • 相关阅读:
    结构型模式のBridge桥梁模式
    创建型模式のBuilder建造者模式
    设计模式的一点思考
    创建型模式のAbstractFactory抽象工厂模式
    初试phoenix
    内网搭建git server
    nsq 学习(三)nsqlookupd
    nsq 学习(二)简单使用
    nsq 学习(一)源码安装nsq
    go学习实践-protobuf
  • 原文地址:https://www.cnblogs.com/fjut/p/2725260.html
Copyright © 2020-2023  润新知