Cocos2dx 小技巧(十三)聊聊坐标系

一好友考上了空姐,她说:以后基本上不会回来了,等下次见面时请叫我白富美!虽然有点羡慕,但我依旧不甘示弱回复:下次见面时请叫我高富帅!
未来,谁说得准呢?

------------------
有段时间没用到onTouchBegan,近来写代码时发现对convertToGL(),getLocation()这些接口都有点陌生了,所以趁这次机会就写个总结到博客里,下次忘了就来博客里看看,当笔记用咯。

首先脑补下基础知识吧:
1、OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系所以没啥好说的。
2、屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向拉。假设游戏场景的分辨率为(500,500),其中一个点的坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则要倒过来,则为(200,500-200)。其实也就是6和9的差别啦,呵呵,六九式...
3、世界坐标系:又名绝对坐标系,概念啥的就不多说了,我们只要知道世界坐标系和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。
4、节点坐标系:又名相对坐标系,和OpenGL坐标系方向一致,不同的是原点在父节点左下角。

下面举下例子:
1、先说OpenGL坐标系与屏幕坐标系吧

前面不是提到onTouchBegan(Touch* touch,Event* event)么,参数touch传来的触点坐标便是屏幕坐标系,获得该坐标系的方法如下:

auto point = touch->getLocationInView();//获得屏幕坐标系

当然了,我们一般使用时都应该将屏幕坐标系转成OpenGL坐标系,方法有两种:

auto point = touch->getLocation();//直接从touch中获取,在getLocation()源码里会将坐标转成OpenGL坐标系

auto point = touch->getLocationInView();
point = Director::getInstance()->convertToGL(point);//先获得屏幕坐标,在调用convertToGL转成OpenGl坐标系

下面看下完整的代码:

bool HelloWorld::onTouchBegan(Touch* touch,Event* event)
{
	auto point = touch->getLocation();//获得OpenGl坐标系
	CCLOG("Location point x=%f , y=%f",point.x,point.y);

	auto point2 = touch->getLocationInView();//获得屏幕坐标
	CCLOG("LocationInView point x=%f , y=%f",point2.x,point2.y);

	point2 = Director::getInstance()->convertToGL(point2);//将屏幕坐标转成OpenGL坐标
	CCLOG("convertToGL1 point x=%f , y=%f",point2.x,point2.y);

	point2 = Director::getInstance()->convertToGL(point2);//注意这个
	CCLOG("convertToGL2 point x=%f , y=%f",point2.x,point2.y);

	return true;
}

我当前屏幕的分辨率为:960x640。输出结果如下:

有没有发现一个有趣的现象,convertToGL将point屏幕坐标转成OpenGL坐标后,再对point使用一次convertToGL后,point又从OpenGL坐标转成了屏幕坐标,哈哈。

2、接下来说节点坐标吧,世界坐标不打算详细介绍,因为自己也没怎么去用过...
节点坐标的一个比较典型的用法应该就是scrollView了
吧,例如在scrollView的层上有一个精灵sp,你想获取sp在scrollView中的哪个位置,可是每次获取的坐标都不一样。原因就在于你每次获得的坐标都是OpenGL坐标,上面有说道了,OpenGL的坐标原点是在屏幕的左下角,而scrolView是一直在拖动的,每拖动一次sp的OpenGL坐标当然也跟着改变。解决办法就是将OpenGl坐标转成节点坐标,方法如下:

point = scroll_layer->convertToNodeSpace(point);//假设scrollView中的层是scroll_layer

说到scrollView,下一篇要不要讲点scrollView的技巧呢?

恩,先这样吧,每次写博客到这个点都好困。其实也才十一点多~
尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/25250031

Cocos2dx 小技巧(十三)聊聊坐标系,布布扣,bubuko.com

时间: 2024-10-11 21:59:31

Cocos2dx 小技巧(十三)聊聊坐标系的相关文章

Cocos2dx 小技巧(十四)ScrollView实现缩放效果

这阶段心绪比較乱,所以这篇开头就不扯淡了.(谁说大姨夫来了我跟谁急!~~)说到大姨夫我突然想到英雄联盟有个美女讲解叫伊芙蕾亚,她的堂弟ID居然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了).------------前天有个网友问我一些关于scrollView的使用方法,因为在QQ上实在讲不清,所以就利用晚上的时间写这篇博客出来了.本篇要实现的功能是用scrollView 拖动对象时,对象移动到某个固定范围会有放大.缩小的效果.以下開始.在进入正题前我先简短的介绍下scrollView

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

【转载】Cocos2dx 小技巧(十四)ScrollView实现缩放效果

Cocos2dx 小技巧(十四)ScrollView实现缩放效果 这阶段心绪比较乱,所以这篇开头就不扯淡了.(谁说大姨夫来了我跟谁急!~~)说到大姨夫我突然想到英雄联盟有个美女解说叫伊芙蕾亚,她的堂弟ID竟然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了). ------------前天有个网友问我一些关于scrollView的用法,由于在QQ上实在讲不清,所以就利用晚上的时间写这篇博客出来了.本篇要实现的功能是用scrollView 拖动对象时,对象移动到某个固定范围会有放大.缩小的

Cocos2dx 小技巧(一)预定义文件路径

我们的主题是:有些技巧你不知道不要紧,但知道后会很牛逼. 假设在项目工程的Resource有好多个目录,如image,fonts,Menu,InterfaceUI,等等,而我要创建的几个精灵对应的图片分别在这几个目录里,如: auto sprite = Sprite::create("image/sp.png"); 但要命的是我记忆力不好(假的),忘了图片都分别在哪个目录里,这时候就要跑到目录里去搜索下,这样是不是很麻烦?(说不麻烦的现在就给我出去!out!). 现在有一种办法可以从根

Cocos2dx 小技巧(九)现成的粒子特效

和高中的她 差点儿相同有两三年没见面了吧.下午她正好来泉州.我俩出来一起吃了个饭. 怎么说呢,自从高中毕业后我俩的联系就少了非常多.大学期间也就见过两三面吧. 现在毕业也快一年了,她已是人妇,而我自己的感情也是经历的长期的稳定与最近的跌宕.事实上那份感觉一直都不曾改变,变了的是周边不断影响自己的人和事. 你要好好的幸福下去.而我也在争取幸福的路上. ----- 这篇讲的是粒子,事实上我对粒子这一块没什么研究,由于当初刚開始接粗cocos2dx时.总经理和我说粒子这块能够临时不去了解.由于还用不到

Cocos2dx 小技巧(三)Label的换行

好了,这次又把Label这货拉出来鞭一鞭.我先创建一个label std::string star_str = "star is not star in the sky,it is on heart";//先定义一个string auto m_label = LabelTTF::create(star_str,"Arial",25);//创建一个labelm_label->setPosition(Point(300,300));this->addChil

Cocos2dx 小技巧(二)单例

我们的主题是:有些技巧你不知道不要紧,但知道后会很牛逼. ----------------------------------------------------------------------------------------------------------- 首先来说下什么是单例:单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例

Cocos2d-x 游戏发布攻防篇01:防止打包党的小技巧

其实这方面的心得我倒是没有多少,也没什么高深的心得,只不过我曾经有4.5个游戏被打包过而已(小若:赤裸裸地炫耀你的失败). 虽然我这文章标题写着"攻防篇01",但不代表就一定有"攻防篇02",只是,随意取的.(小若:敢负责任一点吗?) 这里科普一下,什么叫做打包党. 打包党是一种职业,一种不光彩的职业,他们专门去下载别人的游戏安装包,反编译,然后加入自己的广告,最后重新打包上传到各个市场,从而谋取收益. 别小看他们,部分打包党过得比我们还要滋润. 什么?你心动了?你

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱