zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    类 7.2访问控制与封装 笔记
    第七章 类(class)7.1 笔记
    10.4.3反向迭代器Reverse_iterator笔记
    10.4再探迭代器笔记
    10.3.4参数绑定 bind
    10.3lambda表达式笔记
    第10章 10.1-10.3笔记
    关于按下ctrl+z后,之后的cin失效的问题
    构造和改变一个string的其他方法
    BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
  • 原文地址:https://www.cnblogs.com/fjut/p/2725260.html
Copyright © 2011-2022 走看看