【Cocos2d-x游戏开发】浅谈游戏中的坐标系
无论是开发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开发游戏。
【Cocos2d-x游戏开发】浅谈游戏中的坐标系的更多相关文章
- 【转载】浅谈游戏开发之2D手游工具
浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android 程序设计: 其它 编程语言: 引擎/SDK ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
[游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态 阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- Android开发-浅谈架构(二)
写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
随机推荐
- Android缓存学习入门(二)
本文主要包括以下内容 内存缓存策略 文件缓存策略 内存缓存策略 当有一个图片要去从网络下载的时候,我们并不会直接去从网络下载,因为在这个时代,用户的流量是宝贵的,耗流量的应用是不会得到用户的青睐的.那 ...
- 按键的使用(一)------verilog
按键在项目中应用还是很频繁的,这里主要介绍按键的几种用法. 1.按下一次有效:按下一次计数器增加一下. 2.按下连续有效:按下不松,计数器就一直增加. 3.按下无效,松开有效:按下时计数器值不变,按键 ...
- python获取指定星期的日期
- python 取两数的百分比
Python (r266:, Jan , ::) [GCC (Red Hat -)] on linux2 Type "help", "copyright", & ...
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- MYSQL的增删改查语句样码
慢慢来,慢慢来.. 增: INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'William ...
- C++ 基础 构造函数的使用
- Nginx+lua环境搭建
其实有点类似WampServer一站式安装包 wget http://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz tar -zxvf ng ...
- 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...
- 程序员最喜爱的12个Android应用开发框架二(转)
在上一篇程序员最喜爱的12个Android应用开发框架(一)中,我们为大家介绍了前6个Android应用开发框架,主要包括了 Xamarin.Phonegap.Corona SDK等.接下来,小编将继 ...