我的Cocos2d-x学习笔记(六)坐标体系与锚点

在游戏中坐标系统是少不了的,坐标涉及到各种游戏元素的布局,是必须掌握、搞清楚的重点!

笛卡尔右手坐标系:


定义:原点在左下角,x轴向右,y轴向上,z轴向外,OpenGL与Cocos2d-x坐标系都为笛卡尔右手坐标系。

OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。

Cocos2d-x坐标系:与OpenGl坐标系一样。

屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下。IOS、Android、Windows Phone开发应用时候都使用标准屏幕坐标系。

存在的坐标系有两种类型,还有两种坐标:世界坐标和节点坐标。

世界坐标:也叫做绝对坐标,世界指的是游戏世界,世界坐标与OpenGL坐标方向一致。

本地坐标:也叫做相对坐标、节点坐标,本地坐标也和OpenGL方向一致,每个节点都有独立的坐标系。

通过触摸得到的坐标是世界坐标。

    游戏中Scene、Layer与Sprite对象中坐标原点都为左下角;子节点添加到父节点时候,参考父节点对象的左下角,与父节点锚点没关系;子节点在父节点中的位置与子节点的锚点有关系。

    UI坐标系用在触摸事件的参数中,在重载virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event)函数时,touch中携带的坐标就是UI坐标系,当用来判断某个精灵是否被点击时,需要将touch转为GL坐标系。

锚点:

    将一个节点添加到父节点里时,需要设置其在父节点上的位置,本质上是设置节点的锚点在父坐标系上的位置。

    Anchor Point的两个参数都在0~1之间。它们表示的并不是像素点,而是乘数因子。(0.5, 0.5)表示Anchor Point位于节点长度乘0.5和宽度乘0.5的地方,即节点的中心。

    在Cocos2d - x中CCLayer的Anchor Point为默认值(0, 0),其他Node的默认值为(0.5, 0.5)。
忽略锚点:

    Ignore Anchor Point全称是ignoreAnchorPointForPosition,作用是将锚点固定在一个地方。
    如果设置其值为true,则图片资源的Anchor Pont固定为左下角,否则即为所设置的位置。


GL坐标和UI坐标转换:

导演类(CCDirector)中:
    CCPoint CCDirector::convertToGL(const CCPoint& obPoint);
    CCPoint CCDirector::convertToUI(const CCPoint& obPoint);


世界坐标与本地坐标转换:

CCNode中提供了本地坐标与世界坐标转换的方法,CCNode中部分相关代码如下:

class CC_DLL CCNode : public CCObject
{
public:
	CCPoint convertToNodeSpace(const CCPoint& worldPoint);
	CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);
	CCPoint convertToWorldSpace(const CCPoint& nodePoint);
	CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);
	CCPoint convertTouchToNodeSpace(CCTouch * touch);
	CCPoint convertTouchToNodeSpaceAR(CCTouch * touch);
}

用法详解:

1)convertToNodeSpace:用于将一个世界坐标转换到该元素的本地坐标系中。

node2->convertToNodeSpace(node1->getPosition);

    以参照物的左下角作为坐标点原点,向右和向上创建坐标系。

    结合代码意思是:node2不是node1的父节点,把node1坐标转换为以node2的坐下角为坐标原点的坐标。

2)convertToNodeSpaceAR:把世界坐标转换为基于锚点的窗口内的坐标。

node2->convertToNodeSpaceAR(node1->getPosition);

    以参照物的锚点为原点,向右、向上创建坐标系。

    结合代码的意思是:node2不是node1的父节点,把node1坐标转换为以node2的锚点为坐标原点,向左向上坐标系中的坐标。

3)convertToWorldSpace:用于把一个本地坐标系中的位置转换为世界坐标系中,通常父元素可以通过此方法计算一个子元素的世界坐标。

nodeParent->convertToWorldSpace(node->getPosition());

    需要转换坐标的对象的父类对象调用convertToWorldSpace,参数是对象的坐标点(相对于父类的坐标点),返回的是世界坐标。

    以参照物的左下角作为坐标点原点,向右和向上创建坐标系。

    结合代码的意思:node的父节点为nodeParent,node的坐标参考nodeParent左下角坐标原点,转换为世界坐标。

4)convertToWorldSpaceAR:该方法用于计算以该元素锚点为原点的坐标系中的某个位置的世界坐标。

nodeParent->convertToWorldSpaceAR(node->getPosition());
    以参照物的锚点为原点,向右、向上创建坐标系。

    结合代码的意思:node的父节点为nodeParent,node的坐标是以nodeParent的锚点为坐标原点向右向上坐标系的坐标,转化为世界坐标。

总结:没有AR后缀的函数参考左下角的坐标进行转换;而有AR后缀的函数参照锚点为坐标系原点进行转换。


原文地址:https://www.cnblogs.com/gongyan/p/4539407.html