cocos2dx坐标系分为两块,一块是ui坐标,另外一块是世界坐标,也就是OpenGL的坐标.OpenGl是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库.OpenGL坐标是coco2dx的默认坐标.ui坐标就是以左上角为原点建立的坐标系,OpenGL坐标是以左下角为原点建立的三维坐标系.
一.ui坐标系和OpenGL坐标系的相互转换.在导演类中封装了两个坐标系的转换方法.
//ui坐标转化为OpenGL坐标.
1.Director::getInstance()->convertToGL(const Vec2 &point);
//OpenGL坐标转化为ui坐标.
2.Director::getInstance()->convertToUI(const Vec2 &ponit);
二.锚点和位置.
在cocos2dx中,位置是根据锚点和坐标位置两个因素来确定的,对于坐标大家都应该很清楚,主要就是锚点的问题了,首先锚点一定在精灵的身上,相对于矩形来说,锚点的大小范围是0-1左右都可取到.当锚点为0时,也就是锚点在矩形的左下角的点上,锚点为0.5时,在矩形的正中间,锚点为1时,在矩形的右上角的点上,下面做了个测试,可以很明显的看出结果.
auto sp1 = Sprite::create("HelloWorld.png");
sp1->setPosition(Vec2(200,200));
sp1->setAnchorPoint(Vec2(0,0));
this->addChild(sp1,0);
auto sp2 = Sprite::create("HelloWorld.png");
sp2->setPosition(Vec2(200, 200));
this->addChild(sp2, 1);
auto sp3 = Sprite::create("HelloWorld.png");
sp3->setPosition(Vec2(200, 200));
sp3->setAnchorPoint(Vec2(1, 1));
this->addChild(sp3, 2);
auto label1 = Label::createWithSystemFont("0,0","",20);
label1->setPosition(300,300);
this->addChild(label1,4);
auto label2 = Label::createWithSystemFont("0.5,0.5", "", 20);
label2->setPosition(200, 200);
this->addChild(label2, 4);
auto label3 = Label::createWithSystemFont("1,1", "", 20);
label3->setPosition(100, 100);
this->addChild(label3, 4);
继承Node的锚点默认都为0.5,0.5,锚点和坐标共同作用位置,即是把当前锚点的位置放置在指定坐标上!
三.OpenGL坐标的转换.
看下图,有两个精灵,且宽和高都为300,10.求Node1相对于Node2的位置.这里要搞清楚一个问题,我们把Node1中的(400,500)这个点相对于Node2的位置,那到底是Node2的哪个位置呢?一般默认是Node2左下角的这个点,当然也可以指定是Node2的锚点位置.
1.Vec2 convertToNodeSpace(const Vec2 &point);
Vec2 basePos = sp2->convertToNodeSpace(sp1->getPosition());
2.Vec2 convertToNodeSpaceAR(const Vec2 &point);
Vec2 baseARPos = sp2->convertToNodeSpaceAR(sp1->getPosition());
3.Vec2 convertTouchToNodeSpace(Touch *touch)
4.Vec2 convertTouchToNodeSpaceAR(Touch *touch)
5.Vec2 convertToWorldSpace(const Vec2 &point);
6.Vec2 convertToWorldSpaceAR(const Vec2 &point);