cocos2dx 坐标转换相关函数应用演示
坐标问题对于每一个初学者都是一个必须清晰的问题,但是一口气不能吃成胖子,面对这么函数怎么能一口气全部知道呢,毕竟初学(包括我),所以用现象说话,用实验论证,与其百度,不妨亲手一试,废话不多说上Demo,Code。 Size visableSize=Director::getInstance()->getVisibleSize(); auto block= LayerColor::create(Color4B(255,255),200,200); block->ignoreAnchorPointForPosition(false); block->setPosition(visableSize.width/2,visableSize.height/2); this->addChild(block); auto listenerTouch=EventListenerTouchOneByOne::create(); listenerTouch->onTouchBegan=[=](Touch* t,Event* e){ //Director::convertToUI Vec2 ViewPos= t->getLocationInView(); Vec2 TouchPos=t->getLocation();//内部用的就是convertToGL Vec2 NodeSpaceToblock=block->convertToNodeSpace(TouchPos); Vec2 WorldSpaceToblock=block->convertToWorldSpace(TouchPos); std::string Info=""; Info+= StringUtils::format("%20s:(%.0f,%.0f)rn","getLocationInView",ViewPos.x,ViewPos.y); Info+= StringUtils::format("%20s:(%.0f,"getLocation",TouchPos.x,TouchPos.y); Info+= StringUtils::format("%20s:(%.0f,"convertToNodeSpace",NodeSpaceToblock.x,NodeSpaceToblock.y); Info+= StringUtils::format("%20s:(%.0f,"convertToWorldSpace",WorldSpaceToblock.x,WorldSpaceToblock.y); MessageBox(Info.c_str(),"test"); return true; }; _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerTouch,this); 随便找一个空场景的Init里面加上此段,就可以用鼠标点击来看看,各种坐标到底转化成了什么。 最后总结:
注:以下位置都是以cocos2dx标准世界坐标系左下角0,0而说的。 Touch类中 getLocationInView:等效于 点击位置-右上角位置 getLocation:等效于 点击位置-左下角位置 Node类中 convertToNodeSpace:等效于 点击位置-参照物(本Node)的左下角 convertToNodeSpaceAR:等效于 点击位置-参照物(本Node)的锚点位置 convertToWorldSpace:等效于 点击位置+参照物(本Node)的左下角 convertToWorldSpaceAR:等效于 点击位置+参照物(本Node)的锚点位置 补充:一个简单获得锚点位置的方法 static Vec2 GetWorldPoint(Node* node) { return node->getParent()->convertToWorldSpaceAR(node->getPosition()); } 可以发现如果锚点为(0,0) convertToNodeSpace等效于convertToNodeSpaceAR convertToWorldSpace等效于convertToWorldSpaceAR Director::类静态 注:UIKIT原点左上角,OpenGL原点左下角 convertToGL:把UIKIT坐标->OpenGL坐标 convertToUI:把OpenGL坐标->UIKIT坐标 TMXTiledMap坐标转换 以下是TMX地图坐标转换函数 //pos为OpenGL世界坐标 static Vec2 ConvertToTMXMapPoint(Vec2 pos,TMXTiledMap* map) { Vec2 location=map->convertToNodeSpace(pos); Size MapSize=map->getMapSize(); Size TitleSize=map->getTileSize(); return Vec2(location.x/TitleSize.width,MapSize.height-1- location.y/TitleSize.height); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |