直接用一个带有子节点的Sprite来说,获取他和他的子节点的坐标
如下图所示
Sprite *pTest1 = Sprite::create("CloseNormal.png");
pTest1->setPosition(ccp(100.0f, 120.0f));
Sprite *pTest2 = Sprite::create("CloseNormal.png");
pTest2->setPosition(ccp(10.0f, 12.0f));
pTest1->addChild(pTest2);
this->addChild(pTest1);
//获取pTes2在this内的坐标(也就是pTest2->getParent()所在的坐标系下的坐标)
Vec2 point = pTest2->getParent()->convertToWorldSpaceAR(pTest2->getPosition());
在触摸判断中,经常用到坐标转换
下面例子中:mSprite1,mSprite2是this的子节点
void TouchScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
//将触摸点转化到当前this的坐标系中,也就是mSprite1和mSprite2所在的坐标系
CCPoint touchPoint=convertTouchToNodeSpace(pTouch);
if(mSprite1->boundingBox().containsPoint(touchPoint))
{
CCMessageBox("mSprite1 touched","");
}
if(mSprite2->boundingBox().containsPoint(touchPoint))
{
CCMessageBox("mSprite2 touched","");
}
}
转换坐标有以下几个接口
Vec2 convertToNodeSpace(const Vec2& worldPoint) const ;//将世界坐标转换为本地坐标
Vec2 convertToWorldSpace(const Vec2& nodePoint) const;//将本地坐标转换为世界坐标
Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const;//考虑参考点锚点的情况下,将世界坐标转换为本地坐标
Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const;//考虑参考点锚点的情况下,将本地坐标转换为世界坐标
Vec2 convertTouchToNodeSpace(Touch * touch) const;//将世界坐标中的触摸点转换为本地坐标
Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;//考虑参考点锚点的情况下,将世界坐标中的触摸点转换为本地坐标
Sprite *A = Sprite::createWithSpriteFrameName("dsq_zyx_btn_lt.png");
Sprite *B = Sprite::createWithSpriteFrameName("dsq_zyx_btn_lt.png");
A->setPosition(ccp(10, 20));
B->setPosition(ccp(2, 8));
A->setAnchorPoint(ccp(0, 0));
B->setAnchorPoint(ccp(0, 0));
addChild(A);
addChild(B);
Point pos1 = A->convertToNodeSpace(B->getPosition()); //(B-A)(-8, -12)
Point pos2 = A->convertToWorldSpace(B->getPosition()); //(B+A)(12, 28)
此时设置了锚点ccp(0,0)
转换位置convertToNodeSpace()实际上是将B放在了以A的左下角为原点的坐标系中,
则pos1 = B->getPosition() - A->getPosition()
转换位置convertToWorldSpace()是将A的世界坐标系拷贝一份给B用,那么A相对于自己世界坐标系原点位置的偏移拷贝一份,当作B自己世界坐标系原点相对于转换后的世界坐标的偏移,
则pos2 = B->getPosition() + A->getPosition()
如果设置没有设置锚点,默认ccp(0.5, 0.5)
转换坐标时要考虑锚点影响,因为转换后是以A的左下角为原点计算的
则
Pos1 = B->getPosition() - A->getPosition() + (A->getContentSize().width*A->getAnchorPoint().x, A->getContentSize().height*A->getAnchorPoint().y);
pos2 = Pos1 = B->getPosition() + A->getPosition() - (A->getContentSize().width*A->getAnchorPoint().x, A->getContentSize().height*A->getAnchorPoint().y);
如果使用convertToNodeSpaceAR()或者convertToWorldSpaceAR()则不用考虑锚点,默认计算位置时时用锚点位置为原点的,也就是和设置为锚点ccp(0, 0)结果一致
通常转换坐标用于触摸判断,是否点击target
void DsqGameBrow::onTouchesEnded(const std::vector<Touch*>& touches, Event * unused_event)
{
Point location = CC_POINT_POINTS_TO_PIXELS(convertTouchToNodeSpace((CCTouch*)(touches[0])));
int i = 0;
for (i = 0; i<6; i++)
{
if (m_pSpineBrow[i]->getBoundingBox().containsPoint(location))
{
//doSomeThing
}
}
}