2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)
openGL & UI坐標體系
OpenGL坐標系:該坐標原點在屏幕左下角,x軸向右,y軸向上。這也就是cocos2dx中用到的坐標系。
??? 屏幕坐標系:該坐標系的原點在屏幕左上角,x軸向右,y軸向下,其實和OpenGL坐標系的差別也就是y軸的方向。假設游戲場景的分辨率為(500,500),其中一個點坐標為(200,200),那么它在OpenGL坐標系中的坐標還是(200,200),在屏幕坐標系中則倒過來,則為(200,500-200)。其實也就是6和9的差別。
|
圖: UI坐標系 |
圖: GL坐標系 |
?
2 轉化函數
| CCDirector::sharedDirector()->convertToUI(); |
| CCDirector::sharedDirector()->convertToGL(); |
節點坐標系:又名相對坐標系,本地坐標,和OpenGL坐標系方向一致,不同的是原點的父節點左下角。
世界坐標系:又名絕對坐標系,世界即指游戲世界,我們只要知道世界坐標系和OpenGL坐標系方向一致,原點在屏幕左下角,x軸向右,y軸向上。
?
節點坐標與世界坐標轉化
?
幾乎所有的游戲引擎都會使用本地坐標系而非世界坐標系來指定元素
的位置,這樣做的好處是當計算物體運動的時候使用同一本地坐標系的元素
可以作為一個子系統獨立計算,最后再加上坐標系的運動即可,這是物理研
究中常用的思路。例如一個在行駛的車廂內上下跳動的人,我們只需要在每
幀繪制的時候計算他在車廂坐標系中的位置,然后加上車的位置就可以計算
出人在世界坐標系中的位置,如果使用單一的世界坐標系,人的運動軌跡就
變復雜了。
?
3 關于坐標體系的案例:
| Coordinate.h |
| #ifndef __COORDINATE_H__ #define __COORDINATE_H__ ? #include "cocos2d.h" USING_NS_CC; ? //坐標體系 class Coordinate :public CCLayer { public: ??? static CCScene * scene(); ??? CREATE_FUNC(Coordinate); ??? bool init(); ? ??? //觸摸事件開始的一個事件,第二個參數只是為了做蘋果的兼容才保留的 ??? virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); }; ? #endif |
| Coordinate.cpp |
| #include "Coordinate.h" #include "AppMacros.h" ? CCScene * Coordinate::scene() { ??? CCScene * scene = CCScene::create(); ??? Coordinate * layer = Coordinate::create(); ??? scene->addChild(layer); ??? return scene; } ? bool Coordinate::init() { ??? CCLayer::init(); ??? //打開觸摸開關 ??? setTouchEnabled(true); ??? ??? //下面的kCCTouchesOneByOne是一個枚舉: ??? //typedef enum { ??? //? kCCTouchesAllAtOnce, ??? //? kCCTouchesOneByOne, ??? //} ccTouchesMode; ??? setTouchMode(kCCTouchesOneByOne); ? ??? //創建一個精靈 ??? CCSprite *big = CCSprite::create(); ??? big->setColor(ccRED); ??? //設置錨點 ??? big->setAnchorPoint(ccp(0, 0)); ??? //表示的是一個矩形,CCRectMake是一個宏 ??? big->setTextureRect(CCRectMake(0,0,150,150)); ??? big->setPosition(ccp(100,100)); ??? addChild(big); ? ??? CCSprite *little = CCSprite::create(); ??? little->setColor(ccYELLOW); ??? little->setAnchorPoint(ccp(0,0)); ??? little->setTextureRect(CCRectMake(0, 0, 50, 50)); ??? little->setPosition(ccp(100,100)); ??? //從下面可以知道一個精靈中可以添加另外一個精靈 ??? big->addChild(little); ? ??? CCLog("little x = %f,y = %f", little->getPositionX(), little->getPositionY()); ??? CCPoint toWorld = big->convertToWorldSpace(little->getPosition()); ??? CCLog("toWorld x = %f,y=%f", toWorld.x, toWorld.y); ? ??? CCSprite *little2 = CCSprite::create(); ??? little2->setColor(ccGREEN); ??? little2->setAnchorPoint(ccp(0, 0)); ??? little2->setTextureRect(CCRectMake(0,0,50,50)); ??? little2->setPosition(ccp(0,0)); ??? addChild(little2); ? ??? CCPoint toNode = big->convertToNodeSpace(little2->getPosition()); ??? CCLog("little2 x = %f,y = %f", little2->getPositionX(), little2->getPositionY()); ??? CCLog("toNode x = %f,y = %f", toNode.x, toNode.y); ? ??? CCMoveBy *by = CCMoveBy::create(2,ccp(200,0)); ??? CCMoveBy *by2 = (CCMoveBy *)by->reverse(); ??? //最后一個NULL是一個哨兵 ??? CCSequence *seq = CCSequence::create(by, by2, NULL); ??? big->runAction(CCRepeatForever::create(seq)); ??? ??? //第一個參數是:duration ??? //第二個參數是:移動位置.表示上下移動 ??? CCMoveBy *lby = CCMoveBy::create(2, ccp(0, -100)); ??? CCMoveBy *lby2 = (CCMoveBy *)lby->reverse(); ??? CCSequence *lseq = CCSequence::create(lby, lby2, NULL); ? ??? little->runAction(CCRepeatForever::create(lseq)); ? ??? return true; } ? //觸摸事件開始 bool Coordinate::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { ??? CCLog("ccTouchBegan"); ??? //基于OpenGL的世界坐標 ??? CCPoint pGl = pTouch->getLocation(); ??? CCLog("GL:x = %f,y = %f", pGl.x, pGl); ? ??? //基于UI屏幕的坐標 ??? CCPoint pUi = pTouch->getLocationInView(); ??? CCLog("UI:x = %f,y = %f", pUi.x, pUi.y); ? ??? //將基于GL的坐標轉換成為UI的屏幕坐標 ??? CCPoint toUi = CCDirector::sharedDirector()->convertToUI(pGl); ??? CCLog("ToUix = %f ,y = %f", toUi.x, toUi.y); ? ??? //將屏幕坐標的轉換成為本地坐標 ??? CCPoint toGL = CCDirector::sharedDirector()->convertToGL(pUi); ??? CCLog("ToGLx = %f,y=%f", toGL.x, toGL.y); ? ??? //轉換成節點坐標 ??? CCPoint node = this->convertToNodeSpace(pGl); ??? CCLog("Node:x = %f,y = %f", node.x, node.y); ? ??? return false; } |
| 運行結果:
|
?
?
?
?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二手房过户流程是什么
- 下一篇: 芝麻信用分提不上去