cocos2d-x 3.2 坐标转换

2015年02月25日 16:24 0 点赞 0 评论 更新于 2025-11-21 16:25

在开发基于 cocos2d-x 的应用程序时,坐标转换是一个常见且重要的问题。cocos2d-x 基于 openGLES,因此遵循 OpenGL 的坐标系,即以屏幕的左下角为坐标原点。屏幕坐标系通常也以左下角为坐标原点。

开发 cocos2d-x 程序时,一定要注意坐标转换问题。cocos2d-x 提供了相应的函数用于屏幕与 OpenGL 坐标之间的转换,以下是这些函数的详细介绍:

  1. convertToNodeSpace(const CCPoint& worldPoint):此函数用于将世界坐标转换为对象窗口内的坐标。
  2. convertToWorldSpace(const CCPoint& nodePoint):该函数可将对象窗口内的坐标转换为世界坐标。
  3. convertToNodeSpaceAR(const CCPoint& worldPoint):把世界坐标转换为基于锚点的窗口内的坐标。
  4. convertToWorldSpaceAR(const CCPoint& nodePoint):将基于锚点的对象窗口内的坐标转换为世界坐标。

在实际应用中,使用 cocos2d-x 的坐标转换通常会遇到以下两种情况:

情况一:从当前坐标点获取世界坐标点(屏幕坐标点,OpenGL 的坐标系)

可以直接使用 nodeParent->convertToWorldSpace(node->getPosition())。这里需要注意的是,必须由需要转换坐标对象的父类调用 convertToWorldSpace 函数,参数是对象的坐标点(相对于父类的坐标点),返回的是屏幕坐标点。

情况二:从当前坐标点获取相对于某个 CCNode 的坐标点

直接使用 node2->convertToNodeSpace(node1->getPosition())。在这种情况下,node2 并不一定是 node1 的父类,目的是让 node1 得到相对于 node2 坐标系的坐标点,返回的就是相对于 node2 坐标系的坐标点。

需要注意的是,以上调用没有考虑 nodeParentnode2anchorPoint(即使用了 (0, 0) 的锚点)。如果需要考虑锚点,则应使用 convertToWorldSpaceAR()convertToNodeSpaceAR() 函数。

关于 AR 的含义,推测 AR 可能是 Anchor Relative 的缩写。以下是考虑锚点时的具体情况:

  • nodeParent->convertToWorldSpaceAR(node->getPosition()):因为默认锚点是 (0, 0),所以得到的坐标点是 ccpAdd(nodeParent->convertToWorldSpace(node->getPosition()), ccp(nodeParent->getContentSize().width * 0.5, nodeParent->getContentSize().height * 0.5))
  • node2->convertToNodeSpaceAR(node1->getPosition()):同样因为默认锚点是 (0, 0),得到的坐标点是 ccpSub(nodeParent->convertToWorldSpace(node->getPosition()), ccp(node2->getContentSize().width * 0.5, node2->getContentSize().height * 0.5))

通过以上介绍,希望开发者在处理 cocos2d-x 3.2 坐标转换问题时能更加清晰和准确。

作者信息

boke

boke

共发布了 3994 篇文章