您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x手机游戏开发笔记(二)--坐标系

2013-08-04 22:44 393 查看
http://cocos2d-x.org/projects/cocos2d-x/wiki/Coordinate_System

介绍不同的坐标体系

笛卡尔坐标系

你可能在以前的几何课里学到了笛卡尔坐标系。如果忘记了,下面的图片可以很快让你想起来。

       


以下三种坐标系将在以后的手机游戏中用到。

UI坐标系

这个坐标系在 IO/Android/Windows SDK平台中的共性:

原点(x=0,y=0)在屏幕的左上角。
x轴线沿着屏幕向右边延伸。
y轴线沿着屏幕向下延伸。

如图:

       


Direct3D 坐标系

  DirectX 采用的是左手式的笛卡尔坐标系。

OpenGL 和 Cocos2d 坐标系

Cocos2d-x/-html5/-iphone 采用的坐标系与OpenGL一致。采用的是右手式的笛卡尔坐标系。


 

在2D游戏世界里,我们只需要X与Y轴所构成的坐标系。所以,在cocos2d中:

坐标系原点(x=0,y=0)是屏幕的左下角,屏幕所在就是右手笛卡尔坐标系的第一象限。
   X轴沿着屏幕往右边延伸。
Y轴沿着屏幕往上延伸。

下面图片能更好的阐明cocos2d坐标系:



注意该坐标系与世界坐标系和DirectX坐标系的区别。

父节点与子节点

每个继承CCNode的类都会有一个锚点属性。当要显示一个对象时(sprite、layer等)元素时,cocos2d将根据对象的位置和锚点两个属性去绘制。如果该对象需要旋转角度,那它的旋转是以锚点为定点的。

创建一个灰色的节点作为父节点,蓝色的作为子节点,设置父节点的位置为(100,100),子节点的锚点为(0.5,0.5),即圆的中心 。

1    CCSprite* parent = CCSprite::create("parent.png");
2    parent->setAnchorPoint(ccp(0, 0));// Anchor Point
3    parent->setPosition(ccp(100, 100));
4    parent->setAnchorPoint(ccp(0, 0));
5    addChild(parent);
6
7    //create child
8    CCSprite* child = CCSprite::create("child.png");
9    child->setAnchorPoint(ccp(0.5, 0.5));
10    child->setPosition(ccp(0, 0));
11    parent->addChild(child);//add child sprite into parent sprite.


我们设置了子节点的位置为(0,0),父节点的位置为(100,100),因而,子节点的位置如图:



锚点的介绍:

见此文: http://blog.csdn.net/o_longzhong/article/details/9493215

getVisibleSize、getVisibleOrigin 与 getWinSize

getVisibleSize获取OpenGL视图的可视界面的尺寸(像素),如果没有调用CCEGLView::setDesignResolutionSize()函数,这个值与用getWinSize获取的值是一样的。

getVisibleOrigin获取OpenGL视图的原点。点击查看更多信息Multi resolution support

转换坐标系

convertToNodeSpace:

当你有一个基于小贴块地图的游戏,但是地图很大。covertToNodeSpace可以将OpenGL坐标系的点转换为.tmx地图的坐标。

下图中node1的锚点为(0,0),node2的锚点为(1,1)。

当调用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 将转换node2的坐标相对于node1的坐标原点的坐标位置,这里node2的位置就是(-25,-60)。(就是把世界坐标系转换到当前节点的本地坐标系中)



 convertToWorldSpace:

convertToWorldSpace(const  CCPoint)将当前节点的本地坐标系转化为世界坐标系。它总是返回节点在视图中的位置。当需要移动或缩放地图才能看到节点时,而又想获取这个节点的taps(不懂),这个函数很有用。

一般是父节点调用这个方法,来返回它的子节点在世界坐标系中的位置。因此,如果没有子节点,一般节点不会调用这个方法。

例如:1CCPoint
point = node1->convertToWorldSpace(node2->getPosition());

这个代码主要将node2的坐标转换到世界坐标系。
例如,如果node2的坐标是(0,0),它将会在在node1的左下角,但不一定在屏幕上。这个转换将会使node2的坐标位置(0,0)转换成相对应的世界坐标(15,20),结果如图:



示例代码:

1
2CCSprite *sprite1 = CCSprite::create("CloseNormal.png");
3
4sprite1->setPosition(ccp(20,40));
5
6sprite1->setAnchorPoint(ccp(0,0));
7
8this->addChild(sprite1);
9
10CCSprite *sprite2 = CCSprite::create("CloseNormal.png");
11
12sprite2->setPosition(ccp(-5,-20));
13
14sprite2->setAnchorPoint(ccp(1,1));
15
16this->addChild(sprite2);
17
18CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
19
20CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
21
22CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
23
24CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
25
26CCLog("position = (%f,%f)",point1.x,point1.y);
27
28CCLog("position = (%f,%f)",point2.x,point2.y);
29
30CCLog("position = (%f,%f)",point3.x,point3.y);
31
32CCLog("position = (%f,%f)",point4.x,point4.y);

结果:

1
2position = (-25.000000,-60.000000)
3
4position = (15.000000,20.000000)
5
6position = (-25.000000,-60.000000)
7
8position = (15.000000,20.000000)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息