在cocos2d-x 中 使用 Vector

在遊戲中,vector的使用程度遠高於array,主要因為其長度可以不必初始化宣告,之後可以動態增加, list 或 deque 也可以使用在 cocos2d-x 中,完全視需求而定,這邊以 GameLogoScene 為例, 加入 vector,
首先在 GameLogoScene.h 加入 vector 的宣告

GameLogoScene.h
   1:      std::vector<CCSprite*> *v1;
   2:      void v1Load();
   3:      void v1Add();
   4:      int v1AddTime;

第 1 行宣告 vector指標名稱為 v1 , 其中存放的物件為 CCSprite 指標
第 2 行為定義 v1 方法
第 3 行為 v1 加入物件方法
第 4 行為 v1 加入物件計時用

GameLogoScene.cpp
   1:  void GameLogoScene::v1Load()
   2:  {
   3:      v1 = new std::vector<CCSprite*>;
   4:   
   5:      v1AddTime =0;
   6:  }
   7:   
   8:  void GameLogoScene::v1Add()
   9:  {
  10:      v1AddTime++;
  11:      if(v1AddTime>=1)
  12:      {
  13:          v1AddTime =0;
  14:   
  15:          CCSprite* tempspr = CCSprite::spriteWithFile("CloseNormal.png");
  16:          
  17:          tempspr->setPosition(ccp(rand()%400,rand()%200));
  18:          
  19:          this->addChild(tempspr);
  20:   
  21:          v1->push_back(tempspr);
  22:      }
  23:   
  24:  }
第 1 ~ 6 行為定義 v1 的方法, 第3行定義 v1 存放物件為 CCSprite 指標,第5行初始化 v1addTime
第 8 ~ 24 行將 CCSprite指標加入 v1 方法, 第 10 ~ 11 行限制 v1 加入物件的速度,第 15 行設定加入的 CCSprite , 第 17 行設定座標,第 19 行將 CCSprtite 加入 layer ,第 21 行將 CCSprite 加入 v1,接著在建構子放入 v1Load()

   1:  GameLogoScene::GameLogoScene(void)
   2:  {
   3:      v1Load();
   4:   
   5:      //初始化各項數值
   6:      this->initWithColor(ccc4(255,255,255,255));
   7:      sleep = false;
   8:      gameFlow = 1;
   9:      GF1Time = 0;
  10:      logoSprActTime =0;
  11:   
  12:      logoSprLoad();
  13:   
  14:      //加入schedule
  15:      this->schedule( schedule_selector(GameLogoScene::Run),1); //加入schedule
  16:      
  17:      
  18:  }
在 Run 迴圈中放入 v1Add() 

   1:  void GameLogoScene::Run(float dt)
   2:  {
   3:   
   4:      if(gameFlow==GAMEFLOW1)
   5:      {
   6:          GF1Time++;
   7:          logoSprAct();
   8:          v1Add();
   9:      }
  10:      }
修改 visit()

   1:  void GameLogoScene::visit()
   2:  {
   3:      if(gameFlow==GAMEFLOW1)
   4:      {    
   5:          this->draw();
   6:   
   7:          logoSpr->visit();
   8:          
   9:          
  10:          std::vector<CCSprite*>::iterator iter;
  11:          for(iter = v1->begin() ; iter != v1->end() ; ++iter)
  12:          {
  13:   
  14:              CCSprite* temp = *iter;
  15:   
  16:              temp->visit();
  17:   
  18:          }
  19:   
  20:      }
  21:      
  22:  }
其中 visit() 在第 10 行使用迭代器搜尋所有在 v1 中的物件(第 11 行), 在第 16 行繪出 CCSprite,最後記得不要接續下一個流程(HelloWorld),執行吧,你應該會看到不少開關在螢幕上出現




到目前為止我們將物件加入 vector, 當然也可以刪除 vector 中的物件,在 ccTouchesEnded 中修改
   1:  void GameLogoScene::ccTouchesEnded(CCSet* touches, CCEvent* event)
   2:  {
   3:   
   4:      CCTouch* touch = (CCTouch*)( touches->anyObject() );
   5:   
   6:      CCPoint location = touch->locationInView();
   7:   
   8:      location = CCDirector::sharedDirector()->convertToGL(location);
   9:   
  10:      CCLog("convertToGLXY  x:%f, y:%f", location.x, location.y);
  11:      
  12:      std::vector<CCSprite*>::iterator iter;
  13:   
  14:      for(iter = v1->begin() ; iter != v1->end() ;)
  15:      {
  16:   
  17:          CCSprite *temp = *iter;
  18:              
  19:          if(location.x>temp->getPositionX() && location.x<temp->getPositionX()+temp->getContentSize().width
  20:              && location.y>temp->getPositionY() && location.y<temp->getPositionY()+temp->getContentSize().height)
  21:          {
  22:                  
  23:              iter = v1->erase(iter);
  24:                  
  25:          }
  26:          else
  27:          {
  28:              iter++;
  29:          }
  30:      }
  31:  }
第 12 行使用迭代器來搜尋 v1 所有的物件
第 19 ~ 20 行判斷觸碰的點(座標)是否在 CCSprite物件上,是的話就刪除(23行),否的話就搜尋下1個CCSprite,這篇介紹如何在 cocos2d-x 中使用 vector ,並加入和刪除物件