Cocos2d-x中__Array容器以及執行個體介紹,cocos2d-x__array

來源:互聯網
上載者:User

Cocos2d-x中__Array容器以及執行個體介紹,cocos2d-x__array
__Array類在Cocos2d-x 2.x時代它就是CCArray類。它是模仿Objective-C中的NSArray類而設計的,通過引用計數管理記憶體。__Array繼承於Ref類,因此它所能容納的是Ref及子類所建立的對象指標。


1、建立__Array對象
建立__Array對象有很多函數,下面是總結常用的函數:
static __Array* create()。建立__Array。
static __Array* create(Ref* object, …)。使用一系列Ref建立__Array。
static __Array* createWithObject(Ref * object)。使用一個Ref建立__Array。 
static __Array* createWithCapacity(unsigned int capacity)。建立__Array,並設定容量。
static __Array* createWith__Array(__Array* other__Array)。用一個已存在的__Array建立另一個__Array。 
static __Array*createWithContentsOfFile(const std::string &pFileName) 。從屬性列表檔案建立__Array。  


2、添加元素
向__Array對象中添加元素都必須是Ref和其子類的對象指標類型,下面是總結常用的函數:
void addObject(Ref* object)。添加一個元素。  
void addObjectsFromArray(__Array* otherArray)。把一個__Array對象中所有元素添加到當前__Array對象中。
void insertObject(Ref* object, ssize_t index)。在指定位置插入元素,ssize_t是int類型別名。


3、移除元素
下面是總結常用的移除__Array容器中元素的函數:
void removeLastObject()。移除最後一個元素。
void removeObject(Ref* object)。移除某個元素。  
void removeObjectAtIndex(ssize_t index)。移除一個指定位置的元素。
void removeObjectsInArray(__Array* otherArray)。移除某個數組__Array對象。 
void removeAllObjects()。移除所有元素。 
void fastRemoveObject(Ref* object)。快速移除某個元素。 
void fastRemoveObjectAtIndex(ssize_t index)。快速移除某個指定位置的元素。


4、替換和交換元素
我們還可以通過下面函數對__Array容器中元素替換和交換:
void exchangeObject(Ref* object1, Ref* object2)。交換2個元素。 
void exchangeObjectAtIndex(ssize_t index1, ssize_t index2)。交換2個指定位置元素。 
void replaceObjectAtIndex(ssize_t uIndex, Ref* object)。用一個對象替代指定位置元素。


5、其它操作函數
此外還有很多操作__Array對象的函數,下面是總結常用的函數:
ssize_t count()。返回元素個數。 
ssize_t capacity()。返回__Array的容量。 
ssize_t indexOfObject(Ref* object)。返回指定Ref對象指標的位置。
Ref* objectAtIndex(ssize_t index)。返回指定位置的Ref對象指標。
Ref* lastObject()。返回最後一個元素。 
Ref* randomObject()。返回隨機元素。 
bool containsObject(Ref* object)。返回某個元素是否存在於__Array容器中。
bool isEqualToArray(__Array* pOtherArray)。判斷__Array對象是否相等。 
void reverseObjects()。反轉__Array容器。 


6、遍曆__Array容器
Cocos2d-x提供了兩個遍曆__Array容器的宏:
CCARRAY_FOREACH。正向遍曆。
CCARRAY_FOREACH_REVERSE。反向遍曆。


執行個體:__Array容器
下面我們通過一個執行個體介紹__Array容器中的相關函數。情境,點擊右下角的Go按鈕,在情境中添加100個精靈。 

__Array容器執行個體

要實現上述功能我們可以不使用__Array,但是為了熟悉__Array類,我們在本例實現中特意使用了__Array類。
下面我們看看代碼部分,HelloWorldScene.h代碼如下: 

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#define MAX_COUNT 100①class HelloWorld : public cocos2d::Layer{cocos2d::__Array* list;②public:~HelloWorld();③    static cocos2d::Scene* createScene();    virtual bool init();          void menuCloseCallback(cocos2d::Ref* pSender);        CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__


上述代碼第①行代碼#define MAX_COUNT 100定義宏MAX_COUNT,MAX_COUNT定義了一次產生的精靈數。第②行代碼聲明__Array*的成員變數list。第③行代碼是聲明解構函式,我們需要在解構函式中釋放成員變數list。
HelloWorldScene.cpp中的init函數代碼如下:
bool HelloWorld::init(){if ( !Layer::init() ){return false;}Size visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();auto goItem = MenuItemImage::create("go-down.png","go-up.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));goItem->setPosition(Vec2(origin.x + visibleSize.width - goItem->getContentSize().width/2 ,origin.y + goItem->getContentSize().height/2));auto menu = Menu::create(goItem, NULL);menu->setPosition(Vec2::ZERO);this->addChild(menu, 1);this->list  = __Array::createWithCapacity(MAX_COUNT);①this->list->retain();②for(int i = 0;i < MAX_COUNT; ++i){Sprite* sprite = Sprite::create("Ball.png");③this->list->addObject(sprite);④}return true;}


init是初始化情境的函數,我們在該函數中建立了100個精靈,並把它們放到__Array*類型的list成員變數中。其中第①行代碼是建立__Array*類型的list成員變數,使用createWithCapacity函數,其中的參數是list容器的初始化容量。第②行代碼this->list->retain()非常重要,採用靜態函數createWithCapacity建立的list容器物件是autorelease的,如果不調用retain()函數保持記憶體,當init函數結束時候,list容器物件會自動釋放,這樣在其它函數中再使用list容器物件就會出錯。第③行代碼是迴圈建立精靈對象,第④行代碼是將精靈添加到list容器物件中,但是需要注意的是這些精靈對象還沒有被添加到情境中,因此,情境顯示的時候它們是不出現的。
HelloWorldScene.cpp中的menuCloseCallback函數代碼如下:
void HelloWorld::menuCloseCallback(Ref* pSender){log("list->count() = %d",this->list->count());Size visibleSize = Director::getInstance()->getVisibleSize();Ref* obj = nullptr;CCARRAY_FOREACH(this->list, obj) {①Sprite* sprite = (Sprite*)obj;②int x = CCRANDOM_0_1() * visibleSize.width;③int y = CCRANDOM_0_1() * visibleSize.height;④sprite->setPosition( Vec2(x, y) );this->removeChild(sprite);this->addChild(sprite);}}


該函數是在玩家觸摸Go按鈕之後調用的函數,其中第①行代碼是使用CCARRAY_FOREACH宏,迴圈遍曆list容器中的資料。第②行代碼是Sprite* sprite = (Sprite*)obj獲得精靈對象。第③行代碼CCRANDOM_0_1() * visibleSize.width是隨機產生x軸座標,CCRANDOM_0_1()是產生0~1之間的隨機數的宏。類似第④行代碼是隨機產生精靈的y軸座標。
HelloWorldScene.cpp中的解構函式代碼如下:
HelloWorld::~HelloWorld(){this->list->removeAllObjects();①CC_SAFE_RELEASE_NULL(this->list);②}


在解構函式中要釋放一些資源,第①行代碼this->list->removeAllObjects()是移除list容器中的所有對象,但是這還沒有釋放list容器物件本身。第②行代碼CC_SAFE_RELEASE_NULL(this->list)是安全釋放成員變數list容器物件。其中的CC_SAFE_RELEASE_NULL是將list容器物件先釋放,然後再賦予nullptr。


更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com
歡迎加入Cocos2d-x技術討論群:257760386

歡迎關注智捷iOS課堂公用平台



勁樂團行?

我覺得挺好的!
 
cocos2d-x中的精靈拖動

在touchmove中去修改精靈座標值 spirte->setposition(touchpoint)這樣應該是沒問題的
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.