【Cocos2d-x】开发基础-Cocos2d-x坐标系
本篇博客讲解: UI坐标和OpenGL坐标 比如绘制两个精灵在一个位置,精灵之间会有遮挡的问题,这个就和z轴的绘制顺序有关了。 从UI坐标到OpenGL坐标的转换其实就是左上角,左下角之间的转换。 Vec2 touchLocation = touch->getLocationInView(); //获取触摸点的位置,UI坐标系里的坐标
Vec2 touchLocation2 = Director::getInstance()->convertToGL(touchLocation);
touch是触摸点(Touch)对象 右手坐标系和左手坐标系 世界坐标和模型坐标由于OpenGL坐标有可以分为:世界坐标和模型坐标,所以Cocos2d-x的坐标也有世界坐标和模型坐标。 举一个例子: 世界坐标: 所谓模型是什么,就是这个物体,这个精灵,也就是称为模型。 世界坐标的整个坐标的参考系在第三方!也就是不是本身 比如: 采用A的模型坐标来描述B的位置: 世界坐标与模型坐标互相转换通过Node对象如下函数实现: Vec2 convertToNodeSpace ( const Vec2 & worldPoint ) //将世界坐标转换为模型坐标。坐标原点看成模型(对象,精灵)的左下角所在
Vec2 convertToNodeSpaceAR ( const Vec2 & worldPoint ) //将世界坐标转换为模型坐标。AR表示相对于锚点。
Vec2 convertTouchToNodeSpace ( Touch * touch ) //将世界坐标中触摸点转换为模型坐标。
Vec2 convertTouchToNodeSpaceAR ( Touch * touch ) //将世界坐标中触摸点转换为模型坐标。AR表示相对于锚点。
//凡是后面是ToNodeSpace的这个函数,是从世界坐标到模型坐标的转换 Node就是节点,也就是我们说的模型
//所有带有AR的,表示相对于锚点,也就是坐标原点看成模型(对象,精灵)的锚点所在
Vec2 convertToWorldSpace ( const Vec2 & nodePoint ) //将模型坐标中触摸点转换为世界坐标。
Vec2 convertToWorldSpaceAR ( const Vec2 & nodePoint ) //将模型坐标中触摸点转换为世界坐标。AR表示相对于锚点。
实例:世界坐标转换为模型坐标 B(400,500) Node2的世界坐标转换为相对于Node1的模型坐标: //将Node2的位置转换为相对于Node1的模型坐标,不带AR的,表示相对于Node1的坐标原点,也就是A点
Vec2 point1 = node1->convertToNodeSpace(node2->getPosition());
//将Node2的位置转换为相对于Node1的模型坐标,不带AR的,表示相对于Node1的锚点,也就是B点
Vec2 point2 = node1->convertToNodeSpaceAR(node2->getPosition());
所以得出的结果就是: log("Node2 NodeSpace = (%f,%f)",point1.x,point1.y);
//Node2 NodeSpace = (100.000000,-100.000000)
log("Node2 NodeSpaceAR = (%f,point2.x,point2.y);
//Node2 NodeSpaceAR = (-200.000000,-200.000000)
bool HelloWorld::init()
{
// 1. super init first
if ( !Layer::init() )
{
return false;
}
auto node1 = Sprite::create("Node1.png");//Sprite是精灵
node1->setPosition(Vec2(400,500));//设置位置
node1->setAnchorPoint(Vec2(1.0,1.0));//设置锚点
this->addChild(node1,0);//层添加精灵
auto node2 = Sprite::create("Node2.png");//Sprite是精灵
node2->setPosition(Vec2(200,300));//设置位置
node2->setAnchorPoint(Vec2(0.5,0.5));//设置锚点
this->addChild(node2,0);
Vec2 point1 = node1->convertToNodeSpace(node2->getPosition());//将Node2的位置转换为相对于Node1的模型坐标,不带AR的,表示相对于Node1的坐标原点
Vec2 point2 = node1->convertToNodeSpaceAR(node2->getPosition());
log("Node2 NodeSpace = (%f,%f)",point1.x,point1.y);//Node2 NodeSpace = (100.000000,-100.000000)
log("Node2 NodeSpaceAR = (%f,point2.x,point2.y);//Node2 NodeSpaceAR = (-200.000000,-200.000000)
return true;
}
源代码下载地址:GITHUB源码下载地址: 【点我进行下载】 实例:模型坐标转换为世界坐标
在游戏场景中有两个Node对象,其中Node1的坐标是(400,500),大小是300*100像素 Node2相对于Node1的模型坐标转换的世界坐标: Vec2 point1 = node1->convertToWorldSpace(node2->getPosition());
>//node2->getPosition()为Node2在Node1中的模型坐标(相对于Node1的坐标原点得到的坐标) ->(convertToWorldSpace)->转换为世界坐标,Node2在Node1中的坐标实际上是(0,0),在世界坐标中,Node2的坐标其实就是A点的坐标
(150,50)为Node2的宽高 上面的是没加上锚点的,如果加上锚点,是相对于锚点的坐标 Vec2 point2 = node1->convertToWorldSpaceAR(node2->getPosition());
>//node2->getPosition()为Node2在Node1中的模型坐标(相对于再加上Node1的锚点的坐标得到的坐标) ->(convertToWorldSpaceAR)->转换为世界坐标
Vec2 point2 得到的其实就是B点的坐标,也就是A点坐标,加上Node1锚点的坐标相对于A点的坐标。也就是(250,450)+(150,50) = (400,500) bool HelloWorld::init()
{
// 1. super init first
if (!Layer::init())
{
return false;
}
auto node1 = Sprite::create("Node1.png");//Sprite是精灵
node1->setPosition(Vec2(400,500));//设置位置
node1->setAnchorPoint(Vec2(0.5,0.5));//设置锚点
this->addChild(node1,0);//层添加精灵
auto node2 = Sprite::create("Node2.png");//Sprite是精灵
node2->setPosition(Vec2(0.0,0.0));//设置位置
node2->setAnchorPoint(Vec2(0.0,0.0));//设置锚点
node1->addChild(node2,0);//把Node2放到Node1
//将Node2的位置转换为相对于Node1的模型坐标,不带AR的,表示相对于Node1的坐标原点
Vec2 point1 = node1->convertToWorldSpace(node2->getPosition());
Vec2 point2 = node1->convertToWorldSpaceAR(node2->getPosition());
log("Node2 WorldSpace = (%f,point1.y);//Node2 WorldSpace = (250.000000,450.000000)
log("Node2 WorldSpaceAR = (%f,point2.y);//Node2 WorldSpaceAR = (400.000000,500.000000)
return true;
}
node2->setPosition(Vec2(0.0,0.0));//设置位置
node2->setAnchorPoint(Vec2(0.0,0.0));//设置锚点
node1->addChild(node2,0);//把Node2放到Node1
上面代码是使用node1模型坐标来设置位置的 node2->setPosition(Vec2(250,450));
node2->setAnchorPoint(Vec2(0.0,0.0));
this->addChild(node2,0);
源代码下载地址:GITHUB源码下载地址: 【点我进行下载】 本文章由[谙忆]编写, 所有权利保留。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |