首页 > 代码库 > 数组与字符串三(Cocos2d-x 3.x _Array容器)

数组与字符串三(Cocos2d-x 3.x _Array容器)

  "程序=数据结构+算法"

在面向对象的语言中,诸如数组、堆栈、队列等的结构都被封装成了特定的类,按照特定数据结构的算法设计起来,这就是容器类。

Cocos2d-x中,能使用的容器类:C++标准容器类、Cocos2d-x中定义的容器类。其中,列表容器类包括:_Array、Vector<T>和ValueVector;字典容器包括:_Dictionary、Map<K,V>、ValueMap和ValueMapIntKey。

_Array 继承于Ref类,(2.x版本中是CCArray),通过引用计数管理内存。容纳的是Ref及子类所创建的对象指针。

实现: 点击按钮,响应事件为创建100个精灵。

主要实现代码:

1、在Helloworld.h文件中声明

#define MAX_COUNT 100  

即,所用到的_Array容器创建的成员变量的起始容量的值

2、在Helloworld.cpp文件中,

//增加菜单项 点击之后出现精灵
 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);

 //创建 _Array* 类型的变量list,参数为它的初始容量
 this->list  = __Array::createWithCapacity(MAX_COUNT);
 //list的创建是通过静态方法创建,如果不调用retain函数,当init函数结束时,会自动释放,当别的函数中再使用list时,就会报错
 this->list->retain();

 //所要创建精灵的个数
 for(int i = 0;i < MAX_COUNT; ++i){
  Sprite* sprite = Sprite::create("Ball.png");
  this->list->addObject(sprite);

//触摸菜单图标后触发的函数
void HelloWorld::menuCloseCallback(Ref* pSender)
{
 Ref* obj = nullptr;
 log("list->count() = %d",this->list->count());
 Size visibleSize = Director::getInstance()->getVisibleSize();
 //循环遍历 容器中的数据
 CCARRAY_FOREACH(this->list, obj) {
 //获得精灵对象 
  Sprite* sprite = (Sprite*)obj;
  //随机生成精灵的x、y坐标
  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);
 }

}

HelloWorld::~HelloWorld()
{
 //前面说过手动设置保持list的内存,现在要手动释放
 //释放list里面的所有对象
 this->list->removeAllObjects();
 //释放list容器对象
 CC_SAFE_RELEASE_NULL(this->list);
}

结果:

技术分享

 

数组与字符串三(Cocos2d-x 3.x _Array容器)