[cocos2dx]概念——坐标系

前端之家收集整理的这篇文章主要介绍了[cocos2dx]概念——坐标系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

屏幕坐标系和Cocos2d坐标系

屏幕坐标系:iOS,Android,Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点在左上角,X轴向右,Y轴向下。(比如处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。)
OpenGL坐标系:Cocos2D以OpenGL为图形库,所以它使用OpenGL坐标系。OpenGL坐标系原点在屏幕左下角,x轴向右,y轴向上。比如CCNode类的setPosition函数调用就是此坐标系

世界坐标系和本地坐标系

在开发中,我们经常会提到两个比较抽象的概念-世界坐标系和本地坐标系。这两个概念可以帮助我们更好的理解节点在Cocos2d坐标系中的位置以及对应关系。
@H_502_27@世界坐标系
:也叫做@H_502_27@绝对坐标系世界坐标系和GL坐标系一致,原点在屏幕左下角。
cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。
本地坐标系:也叫@H_502_27@相对坐标系,是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联的坐标系将随之移动或改变方向。

关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下四个常用的坐标变换的相关方法

// 把世界坐标转换到当前节点的本地坐标系中
    Point convertToNodeSpace(const Point& worldPoint) const;

    // 把基于当前节点的本地坐标系下的坐标转换到世界坐标系中
    Point convertToWorldSpace(const Point& nodePoint) const;

    // 基于Anchor Point把基于当前节点的本地坐标系下的坐标转换到世界坐标系中
    Point convertToNodeSpaceAR(const Point& worldPoint) const;

    // 基于Anchor Point把世界坐标转换到当前节点的本地坐标系中
    Point convertToWorldSpaceAR(const Point& nodePoint) const;

锚点(AnchorPoint)

将一个节点添加到父节点里面时,需要设置其在父节点上的位置,本质上是设置节点的锚点在父节点坐标系上的位置。
Anchor Point的两个参数都在0~1之间。它们表示的并不是像素点,而是乘数因子。(0.5,0.5)表示Anchor Point位于节点长度乘0.5和宽度乘0.5的地方,即节点的中心.
在Cocos2d-x中Layer的Anchor Point为默认值(0,0),其他Node的默认值为(0.5,0.5)。

//精灵(Sprite)的锚点默认为(0.5,0.5),默认是不忽略锚点的,所以
virtual bool isIgnoreAnchorPointForPosition();//默认返回false

//其他节点比如说CCLayer和CCSense,锚点默认为(0,0),默认是忽略锚点 
virtual bool isIgnoreAnchorPointForPosition();//默认返回true

//所以,如果要在CCLayer和CCSense中设置锚点,要如下设置  
CCLayer* layer1 = CCLayerColor::create(ccc4(255,255),300,200);  
this->addChild(layer1);
layer1->ignoreAnchorPointForPosition(false);//设置不忽略锚点,此时锚点会变为默认的(0.5,0.5)
layer1->setAnchorPoint(ccp(0,0));//然后再这里设置自定义锚点

VertexZ,PositionZ和zOrder

  • VerextZ是OpenGL坐标系中的Z值
  • PositionZ是Cocos2d-x坐标系中Z值
  • zOrder是Cocos2d-x本地坐标系中Z值

即PositionZ的值即为opengl的z值VertexZ。同样节点的PositionZ也是决定了该节点的渲染顺序,值越大,但是与zOrder不同的区别在于,PositionZ是全局渲染顺序即在根节点上的渲染顺序,而zOrder则是局部渲染顺序,即该节点在其父节点上的渲染顺序,与Node的层级有关。用以下事例来说明:

auto red = LayerColor::create(Color4B(255,100,visibleSize.width/2,visibleSize.height/2);
red->ignoreAnchorPointForPosition(false);
red->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));

auto green = LayerColor::create(Color4B(100,255,visibleSize.width/4,visibleSize.height/4);
green->ignoreAnchorPointForPosition(false);
green->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2 - 100));
red->setPositionZ(1);
green->setPositionZ(0);
this->addChild(red,0);
this->addChild(green,1);


虽然green的zOrder大于red的zOder,但是因为red的PositionZ较大,所以red还是在green上面显示

Cocos2d-x 3.0坐标系详解

原文链接:https://www.f2er.com/cocos2dx/342019.html

猜你在找的Cocos2d-x相关文章