1. 程式人生 > >Cocos2d-x中Vector容器以及例項介紹

Cocos2d-x中Vector容器以及例項介紹

Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容納的是Ref及子類所建立的物件指標,其中的T是模板,表示能夠放入到容器中的型別,在Cocos2d-x 3.x中T表示Ref。Vector<T>是模仿C++std::vector<T>模板類而設計的。在記憶體管理方面不使用__Array的引用計數,它的記憶體管理是由編譯器自動處理的,可以不用考慮記憶體釋放問題。Vector<T>的效能優於__Array類,Coco2d-x官方將Vector<T>設計為__Array的替代品,推薦使用Vector<T>
類。

1、建立Vector物件

建立Vector物件有很多函式,下面是總結常用的函式:

 Vector()。預設的建構函式。

 Vector(ssize_t capacity)建立Vector物件,並設定容量。

 Vector(const Vector<T> &other) 。用一個已存在的Vector物件建立另一個Vector物件,其中&other是左值引用引數傳遞。

 Vector(Vector<T> &&other) 用一個已存在的Vector物件建立另一個Vector物件,其中&&other是右值引用引數傳遞。

提示  左值與右值?C++

中所有的表示式和變數要麼是左值,要麼是右值。左值的定義就是非臨時變數,可以在多條語句中使用的變數。右值是指臨時的變數,它們只在當前的語句中有效。例如在語句int i = 0;中i為左值,0右值。左值與右值還可以出現在函式引數列表中,左值引用(&)和右值引用(&&),如下程式碼所示。

void process_value(int& i) {  //& i表示左值引用

  std::cout << "左值引用: " << i << std::endl; 

void process_value(int&& i) {   //&& i表示右值引用

  std::cout << "右值引用: " << i << std::endl; 

int main() { 

  int a = 0; 

  process_value(a);  //呼叫void process_value(int& i)函式

  process_value(1);  //呼叫void process_value(int&& i)函式

}

2、新增元素

向Vector物件中新增元素都必須是Ref物件指標型別,下面是總結常用的函式:

void pushBack(T object) 。新增一個元素,T表示Ref物件指標型別。

 void pushBack(const Vector<T> &other)把一個Vector物件中所有元素新增到當前Vector物件中。 

 void insert(ssize_t index, T object) 。在指定位置插入元素,ssize_tint類型別名

3、移除元素

下面是總結常用的移除Vector<T>容器中元素的函式:

void popBack()。移除最後一個元素。

 void eraseObject(T object, bool removeAll=false)。移除某個元素。 

iterator erase(iterator position)。指定位置移除物件,引數是迭代器,而返回值是下一個迭代器。

iterator erase(iterator first, iterator last)。指定移除物件範圍(first~last),引數是迭代器,而返回值是下一個迭代器。

 iterator erase(ssize_t index)。移除一個指定索引的元素,引數是ssize_t,而返回值是下一個迭代器。

 void clear ()。移除所有元素。

4、替換和交換元素

我們還可以通過下面函式對Vector容器中元素替換和交換:

 void swap(T object1, T object2)。交換2個元素。 

 void swap(ssize_t index1, ssize_t index2)。交換2個指定位置元素。 

void replace(ssize_t index, T object)。用一個物件替代指定位置元素。

5、查詢操作

我們有的時候還需要操作Vector中的元素,下面是總結常用的查詢函式:

 iterator find (T object)。查詢Vector容器中的物件,返回值迭代器。 

T at(ssize_t index)。根據索引位置返回Vector容器中的元素。

T front()。返回第一個元素。

T back ()。返回最後一個元素。

T getRandomObject()。返回隨機元素。

bool contains(T object)。返回某個元素是否存在容器中。

ssize_t getIndex (T object)。返回指定物件的位置。

6、其它操作函式

此外還有很多操作Vector物件函式,下面是總結常用的函式:

ssize_t size ()。返回元素個數。 

ssize_t capacity()。返回Vector的容量。 

例項:Vector容器

為了熟悉Vector類的主要函式,下面我們將13.2.2一節的例項通過Vector列表容器實現一下。如圖13-3所示場景,點選右下角的Go按鈕,在場景中新增100個精靈。

下面我們看看程式碼部分,HelloWorldScene.h程式碼如下: 

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

上述程式碼與13.2.2一節例項比較,我們將list成員變數型別換成了cocos2d::Vector<cocos2d::Sprite*>,見第①行程式碼所示。注意我們不再需要解構函式聲明瞭,使用Vector比較方便的是記憶體管理由編譯器自動處理的系統。

HelloWorldScene.cpp中的主要程式碼如下:

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 = Vector<Sprite*>(MAX_COUNT);	①
 
for(int i = 0;i < MAX_COUNT; ++i){	②
Sprite* sprite = Sprite::create("Ball.png");
this->list.pushBack(sprite);	③
}
 
return true;
}
 
 
void HelloWorld::menuCloseCallback(Ref* pSender)
{
Ref* obj = nullptr;
log("List count = %d",this->list.size());
Size visibleSize = Director::getInstance()->getVisibleSize();
 
for(const auto& sprite : this->list)	④
{
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);
}
 
}

上述程式碼第①行this->list = Vector<Sprite*>(MAX_COUNT)是建立Vector 型別的list成員變數,並指定Vector容器記憶體放的是Sprite指標型別,Vector建構函式引數是容器的初始化容量。第②行程式碼進行for迴圈建立100個精靈物件。第③行程式碼this->list.pushBack(sprite)是將精靈物件新增到list容器物件中,pushBackVector通過的新增元素函式,由於在第①行設定list容器的模板為Sprite指標,所以pushBack函式只能放過Sprite和其子類指標型別

第④行程式碼for(const auto& sprite : this->list){…}是迴圈遍歷list容器物件,這裡使用的迴圈是C++11規範的新功能range-based for loops,range-based for loops被翻譯為“序列for迴圈語句”,序列for迴圈語句允許重複遍歷一組序列,而這組序列可以是任何可以重複遍歷的序列,所有C++標準容器資料容器都可用作這種序列。for中宣告引用型別(auto&)可以便於在迴圈體中修改元素,宣告為const auto&可以提高執行的效率。

提示  在遍歷Vector容器時候還可以使用C++中迭代器進行遍歷,參看程式碼如下。Vector中定義了相關的begin()end()函式

for (Vector<Sprite*>::const_iterator it = this->list.begin(); it != this->list.end(); ++it)
{
int x = CCRANDOM_0_1() * visibleSize.width;
int y = CCRANDOM_0_1() * visibleSize.height;
Sprite* sprite = *it;	//解引用操作符(*操作符)來訪問迭代器所指向元素
 
sprite->setPosition( Vec2(x, y) );
this->removeChild(sprite);
this->addChild(sprite);
}

相關推薦

Cocos2d-xVector容器以及例項介紹

Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容納的是Ref及子類所建立的物件指標,其中的T是模板,表示能夠放入到容器中的型別,在Cocos2d-x 3.x中T表

Cocos2d-xVector&lt;T&gt;容器以及實例介紹

top 宋體 hello 操作符 模板類 log ins bsp main Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容納的是Ref及子類所創建的對象指針,其中的T是模板,表示能夠放入到容器中的類型,在Cocos2d-x 3.x

例項介紹Cocos2d-xBox2D物理引擎:碰撞檢測

在Box2D中碰撞事件通過實現b2ContactListener類函式實現,b2ContactListener是Box2D提供的抽象類,它的抽象函式:virtual void BeginContact(b2Contact* contact)。兩個物體開始接觸時會響應,但只調用

實例介紹Cocos2d-xBox2D物理引擎:碰撞檢測

函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC

實例介紹Cocos2d-xBox2D物理引擎:HelloBox2D

pre all align 討論 響應 算法 站點 virtual origin 我們通過一個實例介紹一下。在Cocos2d-x 3.x中使用Box2D物理引擎的開發過程,熟悉這些API的使用。這個實例執行後的場景如圖所看到的,當場景啟動後,玩家能夠觸摸點擊屏幕,每次觸

Cocos2d-x 3.9教程:9. Cocos2d-x基於佈局的容器控制元件

Cocos2d-x 3.9教程 9. Cocos2d-x中基於佈局的容器控制元件 1.1. ScrollView滾動檢視 滾動檢視是一種常見的容器型控制元件,它裡面可以放置其他元件。Cocos2d-x中的ScrollView本身也是一種Layout,所以也可以在其中使用

cocos2d-x XML解析與數據存儲

lba false 網上 unsigned failed popu new ccm cfile 一不小心就玩了一周的遊戲了。哎。玩的時候時間過得總是這麽快。。。 於是今天決定看一下之前不怎麽非常熟悉的XML;(之前做遊戲時數據的儲存用到過XML,但這塊是還有一個同事在做

linux下開發,解決cocos2d-x編譯出現的一個小問題, undefined reference to symbol &#39;pthread_create@@GLIBC_2.2.5&#39;

water span x86 code bject data- ace 技術分享 inux 解決cocos2d-x中編譯出現的一個小問題 對於cocos2d-x 2.×中編譯中,若頭文件裏引入了#include "cocos-ext.h",在進行C++編譯的時候會遇到例

Cocos2d-XMenu的綜合運用

cond edi ros log 程序 cal coo 項目 綜合 今天將曾經寫的代碼和項目集成到了一個菜單中,能夠通過菜單切換到曾經做的項目 程序的project文件夾 主要代碼分析: LessonMenu.h中實現創建菜單,遍歷菜單通過菜單切換

Cocos2d-X的聲音和音效

循環 volume tid ng- cocos2d pop sin 返回值 source 在玩遊戲時都會有各種遊戲音,如啟動遊戲時會有背景音,勝利或者失敗會有一些音效。在Cocos2d-X中能夠使用CocosDenshion實現各種聲音 在使用CocosDensh

cocos2d-x 選單類

選單相關類包含:選單類和選單項類,選單類圖,從類圖可見Menu類繼承於Layer。   選單項類圖,從圖中可見所有的選單項都是從BaseMenuItem繼承而來的,BaseMenuItem是抽象類,具體使用時是使用它的6個子類。 說明如下:   MenuItem       最基本的選單

C++STLvector容器 begin()與end()函式、front()與back()

begin函式: 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 end函式: 函式原型: iterator end(); const_iterat

Cocos2d-x的4種佈局

Cocos2d-x中一共有4種佈局:ABSOLUTE(絕對佈局)、HORIZONTAL(水平佈局)、VERTICAL(垂直佈局)和RELATIVE(相對佈局)。 注意,只有在絕對佈局內部,元件使用setPosition()方法來指定其位置。另外三種佈局中的元件,setP

富文字編輯器TinyMCE在vue2.x的使用以及動態繫結(解決雙向繫結後游標跳到最左側問題)

寫在前面 專案重構老管理後臺,使用vue作為前端框架,對於一直使用jsp+jquery開發管理後臺的我還是挺頭疼的… 之後在vue官網學習了一下基礎知識外加向前端同事討教,粗略瞭解了vue的使用,如果文中有錯誤地方請多多包涵。 由於不是專業的前端開發,所以並沒有

[C++]STLvector容器 begin()與end()函式、front()與back()的用法

    本部落格轉自http://blog.csdn.net/duan19920101/article/details/51679517 一、begin函式 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當

C++STLvector容器 begin()與end()函式、front()與back()的用法

一、begin函式 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 二、end函式 函式原型: iterator end(); const_iterator end(

卡通渲染Cocos2d-x的實現(描邊與對物體表面顏色的色階化)

卡通渲染Cocos2d-x中的實現 在一些型別的遊戲中,使用卡通渲染能夠將原有模型的一些細節剝離,使原本比較寫實的模型變得卡通化。在這裡,我向大家介紹簡單介紹一下如何在Cocos2d-x中實現卡通渲染。 事實上,卡通渲染具體來說,可以分為兩個部分:描邊與對物體表面顏色的

Windows平臺cocos2d-x 3.2下載以及建立新專案過程

首先,有關於cocos2d-x在windows下Android環境的搭建, 這裡簡單列一下所需工具的下載地址: 1、JDK 下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2

cocos2d-x解決點選事件上層響應,下層不響應

解決方案是重寫一個Layer,加在上下層中間,即可只響應上層事件,阻斷了下層的事件,設定優先順序,程式碼如下 #ifndef _TouchBlockLayer_H_ #define _TouchBlockLayer_H_ class TouchBlockLayer:

Cocos2d-x 的Sleep 和USleep

                Cocos2d-x跨平臺,但是這個Sleep延時需要區分平臺 (不知道是不是我自己沒有找到),還是