日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)

發布時間:2024/9/27 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • openGL & UI坐標體系

  • OpenGL坐標系:該坐標原點在屏幕左下角,x軸向右,y軸向上。這也就是cocos2dx中用到的坐標系。

    ??? 屏幕坐標系:該坐標系的原點在屏幕左上角,x軸向右,y軸向下,其實和OpenGL坐標系的差別也就是y軸的方向。假設游戲場景的分辨率為(500500),其中一個點坐標為(200,200),那么它在OpenGL坐標系中的坐標還是(200,200),在屏幕坐標系中則倒過來,則為(200500-200)。其實也就是69的差別。

    圖: 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坐标系,本地坐标,世界坐标,节点坐标)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。