cocos2d x 座標轉換總結

2021-07-11 19:58:31 字數 3007 閱讀 6547

首先腦補下基礎知識吧:

1、opengl座標系:該座標系原點在螢幕左下角,x軸向右,y軸向上。這也就是cocos2dx中用到的座標系所以沒啥好說的。

2、螢幕座標系:該座標系的原點在螢幕左上角,x軸向右,y軸向下,其實和opengl座標系的差別也就是y軸的方向拉。假設遊戲場景的解析度為(500,500),其中乙個點的座標為(200,200),那麼它在opengl座標系中的座標還是(200,200),在螢幕座標系中則要倒過來,則為(200,500-200)。其實也就是6和9的差別啦,呵呵,六九式...

3、世界座標系:又名絕對座標系,概念啥的就不多說了,我們只要知道世界座標系和opengl座標系方向一致,原點在螢幕左下角,x軸向右,y軸向上。

4、節點座標系:又名相對座標系,和opengl座標系方向一致,不同的是原點在父節點左下角。

下面舉下例子:

1、先說opengl座標系與螢幕座標系吧

前面不是提到ontouchbegan(touch* touch,event* event)麼,引數touch傳來的觸點座標便是螢幕座標系,獲得該座標系的方法如下:

[cpp]view plain

copy

auto point = touch->getlocationinview();//獲得螢幕座標系

當然了,我們一般使用時都應該將螢幕座標系轉成opengl座標系,方法有兩種:

[cpp]view plain

copy

auto point = touch->getlocation();//直接從touch中獲取,在getlocation()原始碼裡會將座標轉成opengl座標系

auto point = touch->getlocationinview();  

point = director::getinstance()->converttogl(point);//先獲得螢幕座標,在呼叫converttogl轉成opengl座標系

下面看下完整的**:

[cpp]view plain

copy

bool helloworld::ontouchbegan(touch* touch,event* event)    

我當前螢幕的解析度為:960x640。輸出結果如下:

有沒有發現乙個有趣的現象,converttogl將point螢幕座標轉成opengl座標後,再對point使用一次converttogl後,point又從opengl座標轉成了螢幕座標,哈哈。

2、接下來說節點座標吧,世界座標不打算詳細介紹,因為自己也沒怎麼去用過...

節點座標的乙個比較典型的用法應該就是scrollview了吧,例如在scrollview的層上有乙個精靈sp,你想獲取sp在scrollview中的哪個位置,可是每次獲取的座標都不一樣。原因就在於你每次獲得的座標都是opengl座標,上面有說道了,opengl的座標原點是在螢幕的左下角,而scrolview是一直在拖動的,每拖動一次sp的opengl座標當然也跟著改變。解決辦法就是將opengl座標轉成節點座標,方法如下:

[cpp]view plain

copy

point = scroll_layer->converttonodespace(point);//假設scrollview中的層是scroll_layer

恩,先這樣吧,每次寫部落格到這個點都好睏。其實也才十一點多~

在開發cocos2d-x程式時一定要注意座標輪換問題,螢幕與opengl座標轉換有相應的函式。

用到cocos2dx的座標轉換,一般兩種情況:

1)從當前座標點獲取世界座標點(螢幕座標點,opengl的座標系)

2)從當前座標點獲取相對於某個ccnode的座標點;

第一種情況,直接用:nodeparent->converttoworldspace(node->getposition());

這裡一定是需要轉換座標物件的父類呼叫converttoworldspace,引數是物件的座標點(相對於父類的座標點);

返回的是螢幕座標點;

第二種情況,直接用:node2->converttonodespace(node1->getposition);

node2並不是node1的父類,現在的情況就是:node1想得到相對於node2座標系的座標點;

返回的是相對於node2座標系的座標點。

注意:以上的呼叫,是沒有考慮nodeparent和node2的anchorpoint的(就是使用了0,0的錨點);考慮到錨點就使用:

converttoworldspacear()和converttonodespacear();

ps: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))

COCOS2DX座標轉換

遊戲中經常會用到一些變換 遊戲中 和角色在乙個layer上,為了效率,會考慮將bullet,effect和 physicsparticle分別放到不用的層上,對應的層上使用batchnode來提高效率 和physicsparticlelauncher 粒子發射器 繫結,發射的時候,會向physics...

cocos2d x座標轉換

cocos2d x中,node類有六個座標轉換函式,分別是 converttoworldspace 把基於當前節點的本地座標系下的座標轉換到世界座標系中。converttonodespace 把世界座標轉換到當前節點的本地座標系中。例如,在飛機大戰專案中,寵物是玩家的子節點,玩家是遊戲場景的子節點,...

cocos2d x 座標辨析

閱讀了cocos2d的幾個方法 ccpoint converttonodespace const ccpoint worldpoint ccpoint converttoworldspace const ccpoint nodepoint ccpoint converttonodespacear c...