(原文出处找不到了)

无论是搞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函数完成最终的判定操作。

最后想说的一点是,尽可能用相对坐标。换句话说,程序中所有对象在设置大小和位置时,都应该以父对象的大小和位置为依据。 这样程序发布在以各种不同的分辨率发布时,只需要调整根对象的大小就可以了。

最新文章

  1. ASP.NET Core--基于授权的资源
  2. ThoughtWorks.QRCode源码
  3. 安装mysql odbc遇到error 1918.errror installing ODBC driver mysql ODBC 5.3 ANSI Drive
  4. const,static,extern简介(重要)
  5. hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)
  6. Linux_屏蔽360、scanv、QQ管家等IP扫描
  7. SqlSever基础 delete 删除一个表中的所有数据
  8. DBA_Oracle PFile and SPFile文件的管理和使用(案例)
  9. 使用mysqladmin ext 了解MySQL运行状态 转
  10. Java创建线程的第二种方式:实现runable接口
  11. ANDROID_MARS学习笔记_S04_008_用Listview、自定义adapter显示返回的微博数据
  12. Sort Colors 解答
  13. C#属性总结
  14. Jdom读取XML文件
  15. 异步解决方案promise及源码实现
  16. 兼容ios和Android的复制js代码
  17. springboot - Constructor、@Autowired、@PostConstruct分析
  18. Spark2 Dataset分析函数--排名函数row_number,rank,dense_rank,percent_rank
  19. ubuntu 12.10上安装tftpd-hpa
  20. 【JUnit】@Test 报错,"Test cannot be resolved to a type"

热门文章

  1. Coding4Fun.Phone.Controls的使用
  2. ios 分类(Category)
  3. Codeforces Round #231 (Div2) 迟到的解题报告
  4. BZOJ1037: [ZJOI2008]生日聚会Party
  5. 用 VIPER 构建 iOS 应用架构(2)
  6. 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?
  7. C#&java重学笔记(面向对象)
  8. HDU 1028 Ignatius and the Princess III (递归,dp)
  9. DevExpress TreeList 那些事儿
  10. 几点基于Web日志的Webshell检测思路