cocos2d-x 3.2 坐标转换
在开发基于 cocos2d-x 的应用程序时,坐标转换是一个常见且重要的问题。cocos2d-x 基于 openGLES,因此遵循 OpenGL 的坐标系,即以屏幕的左下角为坐标原点。屏幕坐标系通常也以左下角为坐标原点。
开发 cocos2d-x 程序时,一定要注意坐标转换问题。cocos2d-x 提供了相应的函数用于屏幕与 OpenGL 坐标之间的转换,以下是这些函数的详细介绍:
convertToNodeSpace(const CCPoint& worldPoint):此函数用于将世界坐标转换为对象窗口内的坐标。convertToWorldSpace(const CCPoint& nodePoint):该函数可将对象窗口内的坐标转换为世界坐标。convertToNodeSpaceAR(const CCPoint& worldPoint):把世界坐标转换为基于锚点的窗口内的坐标。convertToWorldSpaceAR(const CCPoint& nodePoint):将基于锚点的对象窗口内的坐标转换为世界坐标。
在实际应用中,使用 cocos2d-x 的坐标转换通常会遇到以下两种情况:
情况一:从当前坐标点获取世界坐标点(屏幕坐标点,OpenGL 的坐标系)
可以直接使用 nodeParent->convertToWorldSpace(node->getPosition())。这里需要注意的是,必须由需要转换坐标对象的父类调用 convertToWorldSpace 函数,参数是对象的坐标点(相对于父类的坐标点),返回的是屏幕坐标点。
情况二:从当前坐标点获取相对于某个 CCNode 的坐标点
直接使用 node2->convertToNodeSpace(node1->getPosition())。在这种情况下,node2 并不一定是 node1 的父类,目的是让 node1 得到相对于 node2 坐标系的坐标点,返回的就是相对于 node2 坐标系的坐标点。
需要注意的是,以上调用没有考虑 nodeParent 和 node2 的 anchorPoint(即使用了 (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 坐标转换问题时能更加清晰和准确。