zoukankan      html  css  js  c++  java
  • 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.     //创建父节点  
    8.     CCSprite* back = CCSprite::create("ui_miss_butt_bj2song.png");  
    9.     back->setPosition(ccp(size.width*0.5, size.height*0.5));  
    10.     this->addChild(back,1,123);  
    11.       
    12.     //创建子节点  
    13.     CCSprite* buttonSP = CCSprite::create("team_ok_butt.png");  
    14.     buttonSP->setPosition(ccp(back->getContentSize().width*0.8, back->getContentSize().height*0.5));  
    15.     back->addChild(buttonSP,1,321);  
    16.       
    17. }  
    18.   
    19. bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)  
    20. {  
    21.     beganPoint = pTouch->getLocation();  
    22.     return true;  
    23. }  
    24.   
    25. void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
    26. {  
    27.     CCPoint endPoint = pTouch->getLocation();  
    28.       
    29.     CCSprite* back = (CCSprite*)this->getChildByTag(123);  
    30.     CCSprite* buttonSP = (CCSprite*)back->getChildByTag(321);  
    31.       
    32.     //convertToNodeSpace 把世界坐标转换到当前节点的本地坐标系中。  
    33.     CCPoint nodeBeganPoint = back->convertToNodeSpace(beganPoint);  
    34.     CCPoint nodeEndPoint = back->convertToNodeSpace(endPoint);  
    35.       
    36.     //判断子节点是否被点击  
    37.     if (buttonSP->boundingBox().containsPoint(nodeBeganPoint) && buttonSP->boundingBox().containsPoint(nodeEndPoint)) {  
    38.         CCLog("被点到了");  
    39.     }  
    40. }  

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

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

    总结:例如

    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()的相对坐标]

  • 相关阅读:
    Java ee第七周作业
    Java ee第六周作业
    Java ee第五周作业
    Java ee第四周作业
    Java ee第三周作业
    第二周作业-web后台应用开发与xml
    Java ee第一周的作业
    在团队项目中我对自己的总结
    两人合作,黄金点游戏
    c语言实现wc功能
  • 原文地址:https://www.cnblogs.com/guangyun/p/5286375.html
Copyright © 2011-2022 走看看