cocos2dx中的核心類

一、節點類(Node)

    任何要顯示在屏幕上的的對象都是結點類,最常見的有場景(Scene),層(Layer),菜單(Menu)精靈(Sprite),菜單類是層的一個子類,層的初始化默認錨點是(0,0),精靈的默認錨點是(0.5,0.5)。一個層或一個精靈在它父類上的位置setposition()函數,其實指的是錨點的位置。並且node的旋轉,縮放,平移各種action都是基於錨點來進行的。

二、導演類(Director)

    Director類是cocos2D-x遊戲引擎的核心,它用來創建並控制主屏幕的顯示,遊戲的開始,結束,暫停,都要調用Director類的方法,調用Director中方法的標準方式Director::getinstance()->函數名

    導演類這幾個方法比較重要

    Scene* getRunningScene();獲取現在正在運行的場景,注:導演類同一時間只能動行一個場景       void runWithScene(Scene *scene);通過傳入參數場景進入導演主循環中

    void replaceScene(Scene *scene);切換場景

    void end();結束遊戲

三、場景類

    Scene有一個子類CCTransitionScene切換場景類,這個類有很多子類,也就是很多種切換場景的方法,之所有有這些類是因爲當運行Director::getinstance()->repleaceScene()方法時(切換場景時),會存在一個內存"峯值",新場景還沒有釋放,舊場景已經進來了,這倆所佔內存的總和就是這個“峯值”,這個時候手機就會出現卡的情況,而切換場景類就相當於一個讀進度條的作用。

    切換場景有很多類,也就是很多種形式,以下是一個翻頁的例子

    Scene *sce = HellowScene::create();
    Director::getinstance()->replaceScene(CCTransitionPageTurn::create(1.0,sce,false));

四、佈景層類(Layer)

    佈景層類不僅繼承Node類,同時還繼承CCTouchDelegate,CCAcceleromelerDelegate,和CCKeypadDelegate,所以它還負責輸入,觸摸,以及加速傳感器功能。

    wKioL1UCfiXSz_3iAAC3-bTdE7U253.jpg


    CCLayerColor類,一般可以做爲蒙板來用,它可以設置rbga值,3.0版本以前可以通過設置它的觸摸級比按鈕的觸摸級高來防止蒙板穿透問題,但是3.0之後就不行了。我們可以

    Layer *cover  = LayerColor::create(ccc4(130,130,130,200));
    cover->setContentSize(CCSizeMake(800,480));
    cover->setPosition(0,0);
    this->addChild(cover);
    
    auto callback = [](Touch * ,Event *)
    {
    return true;
    };
    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = callback;
    listener->setSwallowTouches(true);//不往下傳播
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,cover);

    這樣可以防止穿透問題的發生。只是添加了一個事件監聽器,設置這個事件監聽器吞噬觸摸,在onTouchBegan回調函數返回了true.


    CCScrollView在cocos的擴展庫裏面,用的時候要引用#include "cocos-ext.h"頭文件,以及加入USING_NS_CC_EXT;命名空間。如果要使用cocosstudio導出的JSON、或者使用Extension擴展庫,libCocosStudio,libExtension,libGUI都要手動添加。下面以libExtension庫的添加爲例

    第一步,在"解決方案"中右擊,選擇"添加"->"現有項目",在彈出的對話框中找到“cocos2d\extensions\proj.win32\libExtensions.vcxproj”,點擊確認。

    第二步,對你的項目右鍵,選擇“引用...”。在彈出的屬性頁中點選下面的“添加新引用”。在彈出的子級對話框中勾選我們剛纔剛加入的三個lib項目,點擊確定,這樣就完成添加項目對庫的引用。

        第三步,爲你的項目添加包含目錄。

                $(EngineRoot)
        $(EngineRoot)cocos
        $(EngineRoot)cocos\editor-support

        項目->屬性->c/c++常規->附加包含路徑

    一個簡單的Scroll類調用的小例子:

    bool HelloWorld::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        
       CCNode *pContainer = Layer::create();
       pContainer->setContentSize(CCSizeMake(800,960));
       CCSprite *spr = Sprite::create("Guide_Light_New.png");
       spr->setPosition(400,240);
       pContainer->addChild(spr);
       ScrollView *scrolls = ScrollView::create(CCSizeMake(800,240),pContainer);
       scrolls->setDirection(ScrollView::Direction::VERTICAL);
       this->addChild(scrolls);
        return true;
    }

   

     CCMenu類,只要注意這個類是Layer的一個子類,是一個層,它上面可以放好多MenuItem。


    Control類及其子類,ControlSlider類這兒就寫一個例子

    bool HelloWorld::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        
       ControlSlider  *slider = ControlSlider::create("bossxt.png","bossxt1.png","vip1.png");
       slider->setMinimumValue(0.0f);
       slider->setMaximumValue(100.0f);
       slider->setPosition(400,240);
       slider->addTargetWithActionForControlEvents(this,cccontrol_selector(HelloWorld::sliderCallback),Control::EventType::VALUE_CHANGED);
       this->addChild(slider);
    
       label = Label::create("0","",25);
       label->setPosition(400,120);
       this->addChild(label);
        return true;
    }
     
    void HelloWorld::sliderCallback(cocos2d::Object *sender, Control::EventType controlEvent)
    {
    auto slide_control = (ControlSlider*)sender;//通過回調參數sender 獲得ControlSlider
    int current_value = slide_control->getValue();//獲取slide當前的值
    char str[32];
    sprintf(str,"%d",current_value);
    label->setString(str);
    }

    wKiom1UDoYaRAqgJAABAeUarVSE402.jpg

    

五、精靈類Sprite

    精靈類可以用一張圖片,或一張圖片的一部分來定義,Sprite和它的子類可以作爲精靈批處理類的子項。

    Sprite類

    wKioL1UDqaPwfWNOAAC-GlAVvng981.jpg

    

紋理貼圖集是將我們需要的部分圖片放在一張大小固定的圖片,可以節約內存。因爲 OpenGL 機制會把單張圖處理成相應大小的長寬都是 2 的 n 次方的圖片,所以把圖片放在一起可以節約空間。

    貼圖類CCTexture2D,貼圖類CCTexture2D是OpenGL的概念,在OpenGL中稱圖片爲貼圖,在Cocos2dx中是圖片對象的意思,可以通過它創建精靈對象。它直接繼承於Ref類

    精靈批處理類CCSpriteBatchNode,當要處理倆張或倆張以上的相同精靈時,如果逐個渲染,每一次渲染都會調用OpenGL函數,因爲當系統在屏幕上渲染一張貼圖的時候,圖形處理硬件必須首先準備渲

染,然後渲染圖形,最後完成渲染以後的清理工作。以上是每次渲染固定的開銷,這樣幀率就會下降 15% 左右或者更多。如果將所有需要渲染的同一張貼圖只進行一次準備,一次渲染,一次清理就可以解決這個問題了。這時可以使用 CCSpriteBatchNode 類來批處理這些精靈,比如遊戲屏幕中的***等就可以這樣做。用它作爲父層來創建子精靈,並且使用它來管理精靈類,這樣可以提高程序的效率。(***等一次出現很多的相同精靈),這裏需要說明的是,加入 CCSpriteBatchNode 類的精靈類越多,提高效率的效果就越明顯。可以把CCSpriteBatchNode 類理解爲CCLayer 類,只不過CCSpriteBatchNode類只接受CCSprite 類和它的子類。

    bool HelloWorld::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        CCSpriteBatchNode *batch = CCSpriteBatchNode::create("info_prop9.png");
    batch->setPosition(0,0);
    this->addChild(batch);//默認錨點是0,0,CCSpriteBatchNode相當於一個層,只是它裏面只能放精靈
    for (int i = 0; i < 100; i++)
    {
    int x = CCRANDOM_0_1()*700+50;
    int y = CCRANDOM_0_1()*380+50;//CCRANDOM_0_1()這個宏是產生0-1之間的隨機數
    CCSprite *spr = Sprite::createWithTexture(batch->getTexture());
    spr->setPosition(x,y);
    batch->addChild(spr);
    }
        return true;
    }

wKioL1UD1o-Bjah4AASdi-J0930211.jpg

    精靈幀類 CCSpriteFrame,精靈幀的概念是相對於動畫而產生的。一個精靈是固定的節點,它可以擁有許多精靈幀(CCSpriteFrame) ,在它們之間切換就形成了動畫。

    精靈幀緩存類 CCSpriteFrameCache 用來存儲精靈幀,提前緩存起來有助於提高程序的效率CCSpriteFrameCache是一個單例模式,不屬於某個精靈,是所有精靈共享使用的。

六、攝像機類 CCCamera

    所有節點都擁有一個攝像機類 CCCamera。只有通過攝像機類,節點纔會被渲染出來。當節點發生縮放旋轉和位置變化的時候,都需要覆蓋 CCCamera 類,讓這個節點通過CCCamera 類重新渲染。

    可以通過    Sprite *spr = Sprite::create("aaa.png");

                CCCamera *came = spr->getCamera();來獲得屬於該節點的攝像機,然後做一些操作,比如came->setEyeXYZ(0, 0, m_z);通過設置m_z的值就可以讓一個精靈看起來離自己越來越遠。

七、容器類CCArray

    CCArray *array = CCArray::create();它不用確定存儲對像的類型,每個對像類型可以不相同。 

八、繪製圖形類

    在節點類CCNode中可以重寫 draw(Renderer *renderer, const kmMat4& transform, bool transformUpdated)函數並在其中繪製圖形

     void HelloWorld::draw(Renderer *renderer, const kmMat4& transform, bool transformUpdated)
     {
        Node::draw(renderer,transform,transformUpdated);
        //畫線
        glLineWidth(3.0f);
        ccDrawColor4B(255,0,255,255);
        ccDrawLine(Point(0,0),Point(800,480));
        //畫圓
        glLineWidth(2);
        ccDrawColor4B(0, 255, 255, 255);
        ccDrawCircle( Point(400,240), 50, CC_DEGREES_TO_RADIANS(90), 50, true);
        //畫多邊形
        CCPoint vertices2[] = { ccp(30,130), ccp(30,230), ccp(50,200) };
        ccDrawPoly( vertices2, 3, true);
        //畫貝塞爾曲線
        ccDrawQuadBezier(ccp(0,480), ccp(400,240), ccp(800,480), 50);
     }

   

spacer.gif九、定時器

    在遊戲中,時常需要隔一段時間更新一些數據或者是人物位置,Cocos2D-x 中提供了這些時間調度的函數,所有 CCNode 類的子類都有這樣的函數。

    1.更新定時器

    //開啓定時器          

      this->scheduleUpdate();

    //重寫虛函數update

 void HelloWorld::update(float dt)
     {
     }

    2.自定義定時器

    //開啓定時器,延時2s執行,執行3+1次,執行間隔1s

 this->schedule(schedule_selector(HelloWorld::log),1,3,2);

    //回調函數

 void HelloWorld::log(float dt)
    {
    }

   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章