坐标系:
<1>引擎坐标(左下为原点)
世界坐标/绝对坐标/全局坐标
本地坐标/相对坐标
<2>屏幕坐标(左上为原点)
<3>Node类转换工具函数:
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;
<4>Director类转换工具函数:
Vec2 convertToGL(const Vec2&point);
Vec2 convertToUI(const Vec2&point);
<5>世界坐标和本地坐标转换函数测试:
auto layer1 = LayerColor::create(Color4B::ORANGE, 200, 200);
layer1->ignoreAnchorPointForPosition(false);
layer1->setAnchorPoint(Vec2(0.5, 0.5));
layer1->setPosition(Vec2(200, 400));
this->addChild(layer1);
Vec2 point(100, 100);
Vec2 v1 = layer1->convertToNodeSpace(point);
log("v1:(%f, %f)", v1.x, v1.y);
Vec2 v2 = layer1->convertToWorldSpace(point);
log("v2:(%f, %f)", v2.x, v2.y);
Vec2 v3 = layer1->convertToNodeSpaceAR(point);
log("v3:(%f, %f)", v3.x, v3.y);
Vec2 v4 = layer1->convertToWorldSpaceAR(point);
log("v4:(%f, %f)", v4.x, v4.y);
v1坐标推导:求节点相对坐标,输入世界坐标为(100,100)。选取layer1的左下角作为参考,与(100,100)距离为(0,200),所以结果输出v1:(0,-200)
v2坐标推导:求世界坐标,输入的相对坐标是(100,100),在世界坐标系就是(200,400)
v3坐标推导:求节点相对坐标,输入世界坐标为(100,100)。选取layer1的锚点作为参考,与(100,100)距离为(100,300),所以结果输出v1:(-100,-300)
v4坐标推导:求世界坐标,输入的相对锚点的相对坐标是(100,100),在世界坐标系就是(300,500)
<6>触摸点坐标转换测试:
touchListener->onTouchBegan = [layer1](Touch* touch, Event* event)
{
Vec2 v = layer1->convertTouchToNodeSpace(touch); //转换成相对layer1的相对位置
log("(%f,%f)", v.x, v.y);
Vec2 vGL = touch->getLocation(); //OpenGL坐标
log("(%f,%f)", vGL.x, vGL.y);
Vec2 vUI = touch->getLocationInView(); //屏幕坐标
log("(%f,%f)", vUI.x, vUI.y);
Vec2 v1 = Director::getInstance()->convertToGL(vUI); //屏幕坐标转OpenGL坐标
log("(%f,%f)", v1.x, v1.y);
Vec2 v2 = Director::getInstance()->convertToUI(vGL); //3.1测试有问题
log("(%f,%f)", v2.x, v2.y);
return true;
};
锚点:
//锚点位置原点坐标左下角区间[0-1]
/*非Layer的节点,默认锚点位置(0.5,0.5)*/
auto sprite = Sprite::create("HelloWorld.png");
sprite->setAnchorPoint(Vec2(0, 0));
sprite->setPosition(0, 200);
/*Layer,默认忽略锚点,即锚点的位置永远是(0,0);默认锚点是(0,0)*/
auto layer = LayerColor::create(Color4B::ORANGE, 800, 400);
layer->ignoreAnchorPointForPosition(false);
sprite->setAnchorPoint(Vec2(0.5, 0.5));
this->addChild(layer);
this->addChild(sprite);
显示结果:
Z值:
setLocalZOrder() 设置本地坐标Z值 老版本对应setZOrder()
setGlobalZOrder() 设置全局坐标Z值 老版本对应setPositionZ() setVertexZ()
注意:在不设置Z值的情况下,调用getter获得的都是0
auto layer1 = LayerColor::create(Color4B::ORANGE, 800, 400);
auto layer2 = LayerColor::create(Color4B::GREEN, 400, 400);
auto layer3 = LayerColor::create(Color4B::RED, 200, 400);
layer1->addChild(layer2);
this->addChild(layer1);
this->addChild(layer3);
不设置Z值时,先根遍历,同一级按添加的先后顺序。顺序为第一个添加的节点layer1[橘]->子节点layer2[绿]->第二个添加的节点layer3[红]
auto layer1 = LayerColor::create(Color4B::ORANGE, 800, 400);
auto layer2 = LayerColor::create(Color4B::GREEN, 400, 400);
auto layer3 = LayerColor::create(Color4B::RED, 200, 400);
layer1->setGlobalZOrder(1);
layer2->setGlobalZOrder(0);
layer3->setGlobalZOrder(2);
this->addChild(layer3);
layer1->addChild(layer2);
this->addChild(layer1);
设置了全局Z值,按全局Z值顺序layer2[绿]-> layer1[橘]-> layer3[红]
auto layer1 = LayerColor::create(Color4B::ORANGE, 800, 400);
auto layer2 = LayerColor::create(Color4B::GREEN, 400, 400);
auto layer3 = LayerColor::create(Color4B::RED, 200, 400);
layer1->setLocalZOrder(1);
layer3->setLocalZOrder(0);
layer1->addChild(layer2);
this->addChild(layer1);
this->addChild(layer3);
设置了本地Z值,先根遍历,同一级按本地Z值顺序。layer3[红]->layer1[橘]->layer2[绿]