Cocos2d-x 缩放以后的触摸判断

news/2024/7/17 17:35:22

cocos2d坐标系

支持以下几种坐标系:
1.屏幕坐标系 原点在左上角,X轴向右,Y轴向下。
2.GL坐标系 原点在左下角,X轴向右,Y轴向上。
3.世界坐标系 指相对于整个屏幕的坐标系,(0,0)就是屏幕的左下角,(320,480)就是屏幕的右上角。
4.本地坐标系 相对于父对象的坐标。

[obj.parent convertToWorldSpace:[obj position]];  //获得obj的世界坐标
[obj.parent convertToNodeSpace:[obj position]];  //获得obj的本地坐标
[[CCDirector sharedDirector] convertToGL:*****(0,0)];  //获得GL坐标
[[CCDirector sharedDirector] convertToUI:*****(0,0)];  //获得屏幕坐标

锚点(anchor):
锚点是对象的坐标参考点,比方说 如果你要把一个门牌钉在门上,那么那颗钉子就是门牌的锚点,之后设置position时将会相对于锚点来设置。

 

obj.anchor = *****(0,0)  //obj的锚点是左下角
obj.position = *****(0,0)  //此时 obj会以它的左下角会参考点贴在父对象的左下角

这里要注意的是 CCLayer默认是禁用锚点的,即使你设置了它的锚点也根没设置一样!你需要使用以下代码开启它对锚点的支持:

[obj setIsRelativeAnchorPoint:YES];  //启用 obj 的锚点

 

 

 

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。
  基本的两个坐标系:屏幕坐标系和GL坐标系。
  屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。
  GL坐标系x轴朝右,y轴朝上。默认原点在左下角。
  在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。比如调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。
  另一个重要的坐标系就是和Node相关的本地坐标系。这个结构和一般做3D用的场景树的概念是一样的。所以从Node拿到的位置是该节点的本地坐标,需要通过特定的函数才能把本地坐标转换为世界坐标。而且这里的坐标都用的是GL坐标系。在CCNode对象中有几个方便的函数可以做坐标转换。convertToWorldSpace方法可以把基于当前node的本地坐标系下的坐标转换到世界坐标系中。convertToNodeSpace方法可以把世界坐标转换到当前node的本地坐标系中。
  另一个关键的问题就是在cocos2d里面就是各种对象的大小问题。因为在cocos2d里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候就必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d里提供了对应的函数来完成这些操作。
  getContentSize 函数用来获得节点原始的大小。
  boundingBox 函数用来获得经过缩放和旋转之后的外框盒大小。
  举个简单的例子:
  bool ret = CCRect::CCRectContainsPoint(
  this->boundingBox() , this->getParent()->convertTouchToNodeSpace( pTouch ));
  这个例子的功能是来判定当前的触摸操作是否发生在自己的node对象上。其中pTouch是CCTouch对象的指针,包含了当前触摸事件发生点的坐标。
  CCRectContainsPoint这个函数用来判断一个点是否在一个矩形范围内。我们就想用这个函数来判断当前触摸操作的这个点是否在当前node的范围内。
  this->boundingBox() 方法获得了当前节点对象在父节点对象下的缩放之后的本地坐标大小,并且是用GL坐标系表示的。
  pTouch对象中的坐标是屏幕坐标系,所以必须转换到GL坐标系,再转换到父节点的本地坐标下。好在convertTouchToNodeSpace这个函数一次完成了这两个转换,可以参考该库的源码,其中有具体的计算过程。
  所有数据都转换到同一个坐标系下了以后,就可以通过CCRectContainsPoint函数完成最终的判定操作。
  最后想说的一点是,尽可能用相对坐标。换句话说,程序中所有对象在设置大小和位置时,都应该以父对象的大小和位置为依据。 这样程序发布在以各种不同的分辨率发布时,只需要调整根对象的大小就可以了。


http://www.niftyadmin.cn/n/4518221.html

相关文章

饭局上两位领导都让你先敬对方,老实人愣在原地,高手懂3个顺序

小张入职后,心直口快,闷头苦干,出手快质量高,深得领导赏识。领导愿意栽培他,就开始带小张参加饭局了。前不久,小张陪领导接待上级评价组。在领导敬酒的开场阶段,小张知道自己不能喧宾夺主&#…

领导是不是真心提拔你?听懂这3句话就够了,听话听音看人看心

职场如江湖,听懂领导讲话的潜台词,需要很深的悟性。经常被表扬的员工未必能得到提拔重用,经常被批评的人也不是被领导放弃。听话听音,看人看心,领导真的对你好,想培养提携你,有时候很简单&#…

饭局上领导说“我的酒你敢不喝”,别说“我过敏”,这3句话管用

小林985金融硕士毕业,今年入职一家银行,工作地点在北京“高大上”的亚运村。前几天,银行领导召集员工在北京最高档的盘古七星(级)酒店聚餐。头一次到这么高档的酒店吃饭,小林还有点小激动呢。行长对大家说&…

lua 写文件io

DEBUG_MODE trueOPEN_CTDUMP truecclog function(...)--if false thenprint(string.format(...))--endend--输出table变量至iolocal function serialize (file, o)if type(o) "number" thenfile:write(o)elseif type(o) "string" thenfile:write(stri…

使用Eclipse调试Java 程序的10个技巧

你应该看过一些如《关于调试的N件事》这类很流行的帖子 。假设我每天花费1小时在调试我的应用程序上的话,那累积起来的话也是很大量的时间。由于这个原因,用这些时间来重视并了解所有使我们调试更方便的功能。那能为你省下一些时间,也将会使你…

员工中奖1000请客,同事狂点贵菜3000,转身就走,网友:别给脸

楼下公司发生这样一件“糗事”。员工林子买彩票中奖1000元,同事阿虎起哄请客,并订了高档餐厅。阿虎狂点生猛海鲜,眼看着超过了3000元,同事们还在起哄,既然林子出血,我们就好好宰他一次。林子脸色很难看&…

HTTP1和HTTP2和HTTP3的区别

超文本传输协议是一个简单的请求-响应协议,它通常运行在TCP之上。 目录 HTTP1.1: HTTP2 HTTP3 参考文献 HTTP1.1: 特点: 1.一条链接只能一次请求一次返回这样子来回。一般的我们浏览器会帮我们一次次请求和收到。…

体制内只有4种人,不巴结领导不讨好人,走好这条赛道也能受重用

体制内,其实只有4种人,他们的成长发展,各有各的规律。小鸡尿尿,各有各道,如果切换了赛道,欲速则不达,甚至翻车掉沟里。尤其是群体最大的第二种人,不巴结领导,不讨好别人&…