首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Cocos2d-x游戏开发】浅谈游戏中的坐标系

【Cocos2d-x游戏开发】浅谈游戏中的坐标系

作者头像
马三小伙儿
发布2018-09-12 15:06:30
1.1K0
发布2018-09-12 15:06:30
举报

  无论是开发2D还是开发3D游戏,首先必须弄清楚坐标系的概念。在Cocos2d-x中,需要了解的有OpenGL坐标系、世界坐标系和节点坐标系。

 1.UI坐标系

 IOS/Android/Windows SDK中通用的UI坐标系默认起点坐标(x=0,y=0)位于坐上角,x轴从屏幕最左边开始,由左向右逐渐增加;Y轴坐标从屏幕最上方开始,由上至下逐渐增加,如图所示:

  UI坐标系又被称为纹理坐标系,在Cocos2d-x中,只有从纹理截取部分矩形时才使用这个坐标系,例如Sprite的TextureRect属性。

2.OpenGL坐标系

  OpenGL坐标系又称为绘图坐标系,Cocos2d-x以OpenGL和OpenGL ES为基础,所以支持的自然是OpenGL坐标系。OpenGL坐标系默认原点坐标(X=0,Y=0)在屏幕左下角,X轴从屏幕最左边开始,由左向右逐渐增加, Y轴从屏幕最下方开始,由下至上逐渐增加。

  而IOS设备的屏幕坐标系(即UI坐标系)默认原点在左上角,X轴向右,Y轴向下(Y轴和OpenGL坐标正好相反)。IOS的屏幕触摸时间Touch传入的位置信息使用的是屏幕坐标系,因此在Cocos2d-x中对触摸时间进行处理时,需要先把触摸点的位置转换成OpenGL坐标,可以使用Director类中的convertToGL函数来进行转换。

3.世界坐标系

  世界坐标系又称绝对坐标系,是游戏开发中的概念,它建立了描述其他坐标系所需要的参考标准。我们可以用世界坐标系来描述其他坐标系的位置。

  Cocos2d-x中的元素结构是有父子关系的层级结构,通过Node的position设定元素的位置使用的是相对其父节点的本地坐标系,而非世界坐标系。最后在绘制屏幕的时候,Cocos2d-x会把这些元素的本地节点坐标映射成世界坐标系坐标。世界坐标系和OpenGL坐标系一致,原点默认在屏幕左下角,X轴向右,Y轴向上。

4.节点坐标系 

  节点坐标系又称本地坐标系,是特定节点相关联的坐标系。每个节点都有独立的坐标系。当节点移动或者改变方向的时候,和该节点关联的坐标系(它的子节点)也将随之移动或者改变方向。这是相对的。

  例如乘坐出租车的时候对驾驶员说“向左转”,使用的是节点(出租车)坐标系,“前”、“后”、“左”、“右”只有在相对于出租车的坐标系中才有意义。但是如果我们说“向东开”,我们使用的就是世界坐标系了,无论是车内还是车外的人都知道应该向什么方向开了。

5.Vec2和Point

在Cocos2d-x3.0版本中,使用Point来表示一个坐标点,Point中包含了一个x和一个y坐标,都是浮点数。从Cocos2d-x 3.1版本开始,使用Vec2来代替Point,而Point作为typedef存在,在Vec2.h源代码中是这样定义的:

typedef Vec2 Point;

6.锚点

  锚点是Cocos2d-x中一个非常重要的概念,每一个Node都有一个锚点(anchor point),锚点指定了纹理图像和所在节点原点(即position所表示的点)重合的点的位置。锚点值的范围从(0,0)到(1,1)之间,默认情况下,锚点位于纹理图像的几何中心,即(0.5,0.5),该值表示的并不是一个像素点,而是一个乘数因子。(0.5,0.5)表示锚点位于纹理图像长度乘以0.5的地方,即纹理图像的中心。因此,只有在Node类节点使用了纹理图像的情况下,锚点才有意义。

  锚点的最大作用就是辅助节点进行界面布局定位。可以将锚点想象成使用图钉在一面空白的墙上固定一张照片,被钉住的照片就相当于节点,墙壁就相当于设备的屏幕,而图钉就是锚点。在Cocos2d-x中,锚点的默认位置在纹理图像的几何中心位置。例如将某个精灵图像的位置设为(50,50)的时候,该精灵图像的几何中心位置默认情况下也应该是(50,50)。但是如果将锚点设置在精灵图像的左下角(0,0),并将精灵图像的位置设置为(50,50),那么此时应该是精灵图像的左下角位于(50,50)的位置,而不是精灵图像的几何中心处在(50,50)的位置了。

  Node的position使用的就是父节点的节点坐标系,它和OpenGL坐标系也是一致的,X轴向右,Y轴向上,原点默认在父节点的左下角。如果父节点是场景树中的顶层节点,那么它使用的节点坐标系就和世界坐标系重合了。

  Node类有两个方便的函数可以用于坐标转换:

    *convertToNodeSpace: 把世界坐标转换成当前节点的节点坐标。

    *convertToWorldSpace; 把基于当前节点的节点坐标系下的坐标转换成世界坐标。

  需要注意的是,这两种转换都是基于当前的节点坐标,并且不考虑锚点,而一个节点的position所使用的坐标是基于它父节点的坐标的,因此,我们要把Node的位置转换到世界坐标系中应该调用父节点的convertToWorldSpace函数。Node类还提供了convertToNodeSpaceAR和convertToWorldSpaceAR两个函数。这两个函数完成同样的转换功能,但是他们是基于坐标锚点的。

了解并掌握了以上几种最基本的坐标系知识,才能高效快捷的使用Cocos2d-x开发游戏。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  1.UI坐标系
  • 2.OpenGL坐标系
  • 3.世界坐标系
  • 4.节点坐标系 
  • 5.Vec2和Point
  • 6.锚点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档