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)這樣應該是沒問題的