今天发现的问题,记录下,对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; }