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;
    }
  • 相关阅读:
    office2013 激活方式
    c# DataGridView绑定DataTable对象之后总会多一行
    oracle函数验证时间格式并返回
    Linux虚拟机与外面系统ping不通,或者连不上网
    恢复oracle中误删除drop掉的表
    WebService 检测到有潜在危险的 Request.Form 值
    mybatis标签之——关联映射
    word使用宏定义来统一设置图片大小
    mybatis常用标签
    mybatis标签之——<trim>
  • 原文地址:https://www.cnblogs.com/fjut/p/2725260.html
Copyright © 2011-2022 走看看