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

来源:互联网 发布:网络慈善活动策划方案 编辑:程序博客网 时间:2024/05/18 03:21

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); 910CCSprite *sprite2 = CCSprite::create("CloseNormal.png");1112sprite2->setPosition(ccp(-5,-20));1314sprite2->setAnchorPoint(ccp(1,1));1516this->addChild(sprite2);1718CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());1920CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());2122CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());2324CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());2526CCLog("position = (%f,%f)",point1.x,point1.y);2728CCLog("position = (%f,%f)",point2.x,point2.y);2930CCLog("position = (%f,%f)",point3.x,point3.y);3132CCLog("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)








原创粉丝点击