几种坐标系的实战

http://blog.csdn.net/teng_ontheway/article/details/18360925
这篇文章描述的内容大家应该很熟悉,但是根据我的测试,和他说得不一致。
支持以下几种坐标系:
1.屏幕坐标系 原点在左上角,X轴向右,Y轴向下。
2.GL坐标系 原点在左下角,X轴向右,Y轴向上。
3.世界坐标系 指相对于整个屏幕的坐标系,(0,0)就是屏幕的左下角,(320,480)就是屏幕的右上角。
4.本地坐标系 相对于父对象的坐标。

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。
基本的两个坐标系:屏幕坐标系和GL坐标系。
屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。
GL坐标系x轴朝右,y轴朝上。默认原点在左下角。
在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。比如调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。
另一个重要的坐标系就是和Node相关的本地坐标系。这个结构和一般做3D用的场景树的概念是一样的。所以从Node拿到的位置是该节点的本地坐标,需要通过特定的函数才能把本地坐标转换为世界坐标。而且这里的坐标都用的是GL坐标系。在CCNode对象中有几个方便的函数可以做坐标转换。

例子:
myListener->onTouchBegan = =](Touch* touch,Event* event)
{
auto target = static_cast<Sprite*>(event->getCurrentTarget());
auto posInHostCity = hostCity->convertTouchToNodeSpace(touch);
auto size = hostCity->getContentSize();
Rect rc(-0.5size.width, -0.5size.height, size.width, size.height);
if (rc.containsPoint(posInHostCity)) {
log(“Select HostCity StartPoint .2f .2f”, touch->getLocation().x, touch->getLocation().y);
startPos = touch->getLocation();
return true;
}

    return false;

这里的Touch是GL坐标系或者世界坐标系,而不是屏幕坐标系,如果根据屏幕坐标系就永远转换不正确。
本地坐标系实际上是Position为原点的坐标系。
判断Rect是左下方作为原点的坐标系

所以判断矩形应该是(-0.5width, -0.5height,width,height)

这个是个坑,要注意。