convertToNodeSpace 与 convertToWorldSpace 的使用

convertToWorldSpace 这个是将坐标转换到游戏世界坐标。因为一个精灵有一个坐标通过 getPosition来得到,但是这个坐标是一个相对于parent的坐标 所以实际的绝对坐标是取决于parent的position。所以通过getParent()->convertToWorldSpace就可以将这个坐标转换成游戏的绝对坐标。

转换成世界坐标后 就可以和其他不在一个坐标系下的精灵转换到了同一个坐标系下 这样就可以进行坐标的计算了。

计算完坐标 如果需要重新设置精灵的坐标 那么 这时候又要转换回相对坐标了(因为setPosition 也是设置的相对坐标) 这时候调用getParent()->convertToNodeSpace

即可转换回来 调用setPosition来设置。

convertToNodeSpace:把世界坐标转换到当前节点的本地坐标系中。

  1. //可以应用于判断子节点是否被点击,这时就需要把坐标从世界坐标系转换为父节点的坐标系。
  2. //当然大多数情况会用CCMenu,但有时CCMenu就不适用了,比如长按触发响应的时候。
  3. void HelloWorld::myInit14()
  4. {
  5. CCSize size = CCDirector::sharedDirector()->getWinSize();
  6. //创建父节点
  7. CCSprite* back = CCSprite::create("ui_miss_butt_bj2song.png");
  8. back->setPosition(ccp(size.width*0.5, size.height*0.5));
  9. this->addChild(back,1,123);
  10. //创建子节点
  11. CCSprite* buttonSP = CCSprite::create("team_ok_butt.png");
  12. buttonSP->setPosition(ccp(back->getContentSize().width*0.8, back->getContentSize().height*0.5));
  13. back->addChild(buttonSP,1,321);
  14. }
  15. bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
  16. {
  17. beganPoint = pTouch->getLocation();
  18. return true;
  19. }
  20. void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
  21. {
  22. CCPoint endPoint = pTouch->getLocation();
  23. CCSprite* back = (CCSprite*)this->getChildByTag(123);
  24. CCSprite* buttonSP = (CCSprite*)back->getChildByTag(321);
  25. //convertToNodeSpace 把世界坐标转换到当前节点的本地坐标系中。
  26. CCPoint nodeBeganPoint = back->convertToNodeSpace(beganPoint);
  27. CCPoint nodeEndPoint = back->convertToNodeSpace(endPoint);
  28. //判断子节点是否被点击
  29. if (buttonSP->boundingBox().containsPoint(nodeBeganPoint) && buttonSP->boundingBox().containsPoint(nodeEndPoint)) {
  30. CCLog("被点到了");
  31. }
  32. }

convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

  1. //sp3是sp2的子节点,sp2是sp1的子节点。
  2. void HelloWorld::myInit13()
  3. {
  4. CCSize size = CCDirector::sharedDirector()->getWinSize();
  5. CCSprite* sp1 = CCSprite::create("Icon.png");
  6. sp1->setPosition(ccp(size.width*0.5, size.height*0.5));
  7. this->addChild(sp1);
  8. CCSprite* sp2 = CCSprite::create("Icon.png");
  9. sp2->setColor(ccYELLOW);
  10. sp2->setPosition(ccp(sp1->getContentSize().width, sp1->getContentSize().height));
  11. sp1->addChild(sp2);
  12. CCSprite* sp3 = CCSprite::create("Icon.png");
  13. sp3->setColor(ccBLUE);
  14. sp3->setPosition(ccp(sp2->getContentSize().width, sp2->getContentSize().height));
  15. sp2->addChild(sp3);
  16. //convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。
  17. CCPoint worldPoint = sp2->convertToWorldSpace(sp3->getPosition());
  18. CCLog("worldX == %f, worldY == %f",worldPoint.x,worldPoint.y);
  19. //sp4正好覆盖掉sp3,说明转换到世界坐标系中的坐标正确。
  20. CCSprite* sp4 = CCSprite::create("Icon.png");
  21. sp4->setColor(ccGREEN);
  22. sp4->setPosition(worldPoint);
  23. this->addChild(sp4);
  24. }

总结:例如

r0为根节点

r1的父节点是r0

r2的父节点是r1

要想得到r2的世界坐标则 r2->getParent()->convertToWorldSpace(r2->getPostion());

[自己理解:将r2->getParent()转换成世界坐标,然后将r2->getPostion()转换成当前世界坐标下的坐标]

要想得到r2相对父节点的坐标 则 r2->getParent()->convertToNodeSpace(r2->getPostion());

[自己理解:将r2->getPostion()坐标转换成相对r2->getParent()的相对坐标]

时间: 2024-10-12 20:45:20

convertToNodeSpace 与 convertToWorldSpace 的使用的相关文章

【cocos2dx游戏开发】之 坐标系(二) convertToNodeSpace和convertToWorldSpace

游戏中经常会用到一些变换: 游戏中武器和角色在一个layer上,为了效率,会考虑将bullet, effect和 PhysicsParticle分别放到不用的层上,对应的层上使用batchnode来提高效率 武器和PhysicsParticleLauncher(粒子发射器)绑定,发射的时候,会向PhysicsParticleLayer的武器相同的位置上生成一个物理粒子特效 会经常用到convertToNodeSpace和convertToWorldSpace转换坐标 我们加三个sprite,r0

Cocos坐标之convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR区别和用法

convertToNodeSpace.convertToWorldSpace.convertToNodeSpaceAR.convertToWorldSpaceAR,在他们的下一层看到下面的注释: /** * Converts a Point to node (local) space coordinates. The result is in Points. */ Point convertToNodeSpace(const Point& worldPoint) const; /** * Con

cocos2dx中的坐标系统

一. (1)OpenGL坐标系 Cocos2D-x以OpenGL和OpenGL ES为基础,所以自然支持OpenGL坐标系.该坐标系原点在屏幕左下角,x轴向右,y轴向上. (2)屏幕坐标系 屏幕坐标系使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下.iOS的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系.因此在Cocos2D-x中对触摸事件做出响应前,需要首先把触摸点转化到OpenGL坐标系.这一点在后面的触屏信息中会详细介绍,可以使用CCDirector的convertT

ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中.重点说明:基于...   不一定要是真实的,  convertToWorldSpace 的结果也只是一个新的位置, 这个位置一般都没有什么实际意义的,大部分都是用在碰撞检测 ,一个虚拟的新位置(主要用在子弹和敌人不在同一层的情况,把子弹和敌人转换到同一节点下的本地坐标系进行位置比较,方便进行碰撞检测) 为什么官方文档,在这个文档描叙的时候,写的是基于当前节点下的坐标系....   中文还是值得深入的推敲

coco2d-x convertToWorldSpace介绍

看泰然网的关于坐标系的介绍的时候(http://www.tairan.com/archives/5739/)对convertToWorldSpace的解释的时候很不理解博主为什么要那么解释,一开始让我很费解,我觉得可以这样解释:解释convertToWorldSpace可以吧他的例子改一下,如下: auto *sprite1 = Sprite::create("HelloWorld.png"); sprite1->setPosition(ccp(20,40)); sprite1-

学习3-Cocos2D-X坐标系统

1.屏幕坐标系 屏幕坐标系是以左上角作为坐标原点,x正方向向右,y正方向向下,如图 的一个坐标系. 2.OpenGL坐标系 以左下角作为坐标原点,x正方向向右,y正方向向上,如图的一个坐标系. 3.世界坐标系 又叫绝对坐标系,其值是固定的,默认原点在左下角. 4.本地坐标系 物体本身的坐标系 5.锚点 由x,y值在0~1之间的点,按比例设置. eg: (0,1) (1,1) (0,0) (1,0) 分别为:左上顶点,右上顶点,左下顶点,右下顶点. setAnchorPoint(); getAnc

CCNode Class-----Cocos2D-Swift v3.3

CCNode Class Reference Inherits from CCResponder : NSObject Conforms to CCSchedulerTarget Declared in CCNode.h Overview CCNode is the base class for all objects displayed by Cocos2D. CCNode handles transformations, can have a content size and provide

【Cocos2d-x】源码分析之 2d/ui/Widget

从今天开始 咱也模仿 红孩儿这些大牛分析源码 ,由于水平有限 不对之处欢迎狂喷.哈哈. #ifndef __UIWIDGET_H__ #define __UIWIDGET_H__ #include "ui/CCProtectedNode.h" #include "ui/UILayoutDefine.h" #include "ui/UILayoutParameter.h" #include "ui/GUIDefine.h" NS

Cocos2d-x 3.0坐标系详解(转载)

Cocos2d-x 3.0坐标系详解Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.笛卡尔坐标系笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系.屏幕坐标系和Cocos2d坐标系标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系.iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下.Cocos2d坐标系和Ope