cocos2dx坐标转化及节点位置获取

先讲获取节点的坐标

直接用一个带有子节点的Sprite来说,获取他和他的子节点的坐标
如下图所示
cocos2dx坐标转化及节点位置获取_第1张图片

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
		}
	}
}

你可能感兴趣的:(游戏开发)