【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集合可以存储和操 ...
随机推荐
- PHP面向对象——异常处理
Error_reporting(0); //在网站正式上线的时候不准他报任何错误. 错误级别为不允许报错 Exception 是所有异常的基类. 测试并捕捉一个错误的例子: class mysq ...
- Android ANR分析(2)
转自:http://blog.csdn.net/ruingman/article/details/53118202 定义 主线程在特定的时间内没有做完特定的事情 常见的场景 A.input事件超过 ...
- 使用Asyncio的Coroutine来实现一个有限状态机
如图: #!/usr/bin/env python # -*- coding: utf-8 -*- import asyncio import datetime import time from ra ...
- Win10 安装Vs2015 社区版和企业版各个问题汇总
1.前提下已经下载ISO文件 2.你的电脑没有连接网络或者你使用了宽带通类似的运营商网络. 3.你确保你正确安装了win10 并且已经激活 出现的问题如下 一.当你安装离线下载的ISO for Vs2 ...
- hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***
新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...
- RTP 与RTCP 解释. 含同步时间戳
转自:http://blog.csdn.net/wudebao5220150/article/details/13816225 RTP协议是real-time transport protocol的缩 ...
- TensorFlow
转自:http://blog.csdn.net/stdcoutzyx/article/details/51645396 本片博文是参考文献[1]的阅读笔记,特此声明 TensorFlow,以下简称TF ...
- C# RFID windows 服务 串口方式
话说RFID以前很火所以整理一下一年前自己处理的RFID程序,放源码. 一开始觉得他是个很神奇的东西. 包含串口通讯和网络通讯. 由于网络通讯设备太贵,所以国内的设备基本上都是在外置一个比较便宜的模块 ...
- APP交互
交互设计基本功!5个值得学习的APP交互方式http://www.uisdc.com/5-interactive-design-worth-learning 移动App交互设计10大趋势–你用到了吗? ...
- 在Salesforce中创建Web Service供外部系统调用
在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...