zoukankan      html  css  js  c++  java
  • 数组与字符串三(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);
    }

    结果:

  • 相关阅读:
    linux poll 和 select
    linux测试 scullpipe 驱动
    linux进程唤醒的细节
    linux进程互斥等待
    linux 手动睡眠
    linux一个进程如何睡眠
    [POJ 2431]Expedition
    【MongoDB数据库】MongoDB 命令入门初探
    高速排序为什么快?
    [050] 微信公众平台开发入门视频教程已公布
  • 原文地址:https://www.cnblogs.com/revenge/p/6089302.html
Copyright © 2011-2022 走看看