關於Cocos2d x中陣列的使用

2021-09-08 04:16:54 字數 2922 閱讀 3391

1.定義和背景

cocos2d::vector是乙個封裝了動態大小的陣列的順序型容器。

它的元素是連續儲存的,cocos2d::vector的儲存是自動處理的。其內部的資料結構實現實際上是stl標準的順序型容器 std::vector。

在 cocos2d-x v3.0 beta 之前,存在另乙個順序性容器 cocos2d::ccarray,這將會被棄用。

官方很細緻地設計了 cocos2d::vector容器作為 cocos2d::ccarray 的替代品,所以我們要使用 cocos2d::vector代替 cocos2d::ccarray。這種陣列的插入資料的方式和刪除資料的方法有很多,而且也很靈活,既可以當表,也可以當棧

2.資料型別

t - 元素型別.

-t 必須是乙個指向 cocos2d::object 子類物件的指標。不能是其他資料型別或者原生型別,因為cocos2d-x 的記憶體管理模型已經整合到 cocos2d::vector中(從 v3.0 beta 開始)。

3.建立和釋放

_data 的記憶體管理是由編譯器自動處理的。如果你在棧上宣告了乙個 cocos2d::vector物件,那就不需要關心記憶體釋放問題。

如果你呼叫了 new 操作符來分配一塊 cocos2d::vector的動態記憶體,那就需要在使用完後呼叫 delete 操作符來釋放記憶體。這同樣適用於 new 和 delete。

注意:在新 c++ 中,它傾向於本地儲存物件而不是堆儲存物件。所以,請不要呼叫 new 操作符來分配 cocos2d::vector的堆物件,而是使用棧物件來代替它。

4.具體用法

//用乙個容量初始化乙個 vector 

vectorvec1(5); 

//定義乙個陣列要在helloworld類的屬性中定義,語法是vector《某個物件的類名*> 陣列名;

vectorgcs;

//在乙個確定的位置插入乙個確定的物件(這裡是在位置0插入乙個sprite型別的sp1變數指標)

vec1.insert(0, sp1); 

//我們也可以加入一整個 vector 

vec1.pushback(*vec0); 

//從 vector 中移除元素 

1.vec1.erase(vec1.find(sp0));  //sp0是乙個物件例項,可以是節點,精靈或者其他一些資料型別

2.pvec1->erase(1); //下標為1的變數

3.pvec1->eraseobject(sp0,true);  //sp0是乙個物件例項,可以是節點,精靈或者其他一些資料型別,這個方法在移除乙個元素後,其他元素的位置就會發生變化,比如

auto it = lifes.begin();

(*it)->removefromparent();

lifes.eraseobject((*it), true);

移除後,原來在1號位的變數就變成0號位了,也就是lifes.begin();用這個方法可以做乙個血量減少,愛心從右往左減少的效果

4.pvec1->popback(); 

5.vec1.clear(); //移除所有元素 

//其他用法

//如果兩個vector 相同的話返回真 

if (vec0->equals(vec2)) else{ 

vec1.shrinktofit();   //收縮 vector 以便記憶體對應上元素的數量 

log("pvec1->capacity()==%zd; pvec1->size()==%zd",vec1.capacity(),vec1.size()); 

//pvec1->swap(0, 1);  //通過索引交換 vector 中的兩個元素 

vec1.swap(vec1.front(), vec1.back());  //通過值交換 vector 中的兩個元素  

if (vec2.contains(sp0)) {  //返回乙個布林值,用於指示該物件是否存在於 vector 中 

log("the index of sp0 in pvec2 is %zd",vec2.getindex(sp0)); 

5.遍歷

如果要遍歷

某個陣列,要用到陣列物件的begin()方法和end()方法,再定義乙個指向各個具體物件的指標,這個指標值加1的時候,所指向的例項物件會後移乙個,初始時讓它指向第乙個例項

for (auto it = gcs.begin(); it != gcs.end(); it++) {

(*it)->onupdate();

注意:如果我們在插入資料的時候是每個都在0的位置插入的話

pic.insert(0, pic1);

pic.insert(0, pic2);

pic.insert(0, pic3);

pic.insert(0, pic4);

那麼各個變數在陣列中的順序是

pic4--pic3---pic2---pic1

所以遍歷起來的話是pic4為pic.begin(),產生了乙個倒序的效果,並不是因為陣列是什麼先進後出,那是錯誤的思維,這個陣列的遍歷還是老老實實按照從左往右從0下標位開始的順序的。

6.詳解(*it)=sprite

如果定義了auto sprite=sprite::create();之類的精靈節點,那麼在

for (auto it = gcs.begin(); it != gcs.end(); it++) {

(*it)->onupdate();

中,(*it)=sprite,而不是it=sprite,所以it是乙個指向精靈節點指標的指標

//從 vector 中移除元素

vec1.erase(vec1.find(sp0)); 

//pvec1->erase(1);

//pvec1->eraseobject(sp0,true);

//pvec1->popback();

vec1.clear(); //移除所有元素

關於cocos2dx中tableView的一些理解

先看 h檔案中 ifndef helloworld scene h define helloworld scene h include cocos2d.h include cocos ext.h using ns cc using ns cc ext class helloworld public ...

關於cocos2dx中動畫的整理

1.瞬時動作 ccactioninstant ccplace 用於定位 cchide ccshow 隱藏和顯示 cctogglevisibility 交替變化換是否為隱藏狀態 ccflipx ccflipy分別為水平翻轉和垂直翻轉 瞬時動畫 auto place place create ccp 5...

cocos2dx中關於場景的管理

runwithscene ccscene scene 啟動遊戲,並執行scene 場景。這個方法在主程式啟動時第一次啟動主場景時呼叫。replacescene ccscene scene 直接使用傳入的scene 替換當前場景來切換畫面,當前場景將被釋放。這是切換場景時 最常用的方法。pushsce...