您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關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,所以它還負責輸入,觸摸,以及加速傳感器功能。
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); }
五、精靈類Sprite
精靈類可以用一張圖片,或一張圖片的一部分來定義,Sprite和它的子類可以作為精靈批處理類的子項。
Sprite類
紋理貼圖集是將我們需要的部分圖片放在一張大小固定的圖片,可以節約內存。因為 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; }
精靈幀類 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); }
九、定時器
在游戲中,時常需要隔一段時間更新一些數據或者是人物位置,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) { }
看完上述內容,你們對cocos2dx中的核心類是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。