[cocos2d-x3.x学习笔记]坐标系 锚点 Z值

坐标系:

<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[绿]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值