cocos2d-x 游戏创做过程(四)

cocos2d-x 游戏创做过程 后台的控制界面创做

  1. 制做一个能够操控的界面
  2. 而后给界面 加载须要的值
  3. 从瓦片地图中获取须要的属性。
  4. 打开界面关闭界面。

制做一个可操控的界面,而后给界面加载须要的值。

若是用CocosStudio的话,能够轻松制做一个,美观的界面。 而后用这张界面加载数据。web

加载界面的时候用逻辑符号,所对应的ui。加载就能够了,很简单。svg

void DialogLayer::initDialogLayer(const char* filename,std::vector<PropertyData *> propertyVector){
    //输入要加载的界面,这里是Studio制做的简易介面
    if(filename == "MainScene.csb"){
        auto rootNode = CSLoader::createNode(filename);
   //找到逻辑符号
        btn = (Button *)rootNode->getChildByTag(3);
        btn1 = (Button *)rootNode->getChildByTag(4);
        btn->setTitleText("");
        btn1->setTitleText("");
        // setTexture
        //这里是要加载的数据,用Vector封装了一下,而后再把图片取出来。
        btn->loadTextures(propertyVector[0]->getImage(),propertyVector[0]->getImage());
        btn1->loadTextures(propertyVector[1]->getImage(),propertyVector[1]->getImage());
        //这里是一些控制,没什么用
        btn->addTouchEventListener(CC_CALLBACK_2(DialogLayer::touchCallBack,this));
        addChild(rootNode);
    }

从瓦片中获取数据。

瓦片中添加对象层,就能够在对象层中随意添加数字。 并且能够把瓦片在地图中的位置精确取出来,因此很是方便, 而TMXObjectGroup 也就是一些XML解析器而已。 因此很容易取出来。 首先从瓦片组中,取出每一条对象,而后每一条对象逐一解析。 就能够获得不一样的值了。瓦片对象块,能够在地图层修改 敌人与物品的数据。 能够方便开发。 开发的目的大部分要作好的后期的简化编辑状态。 只要作好对应的状态那么开发很容易上手,甚至不须要代码的参了。ui

TMXObjectGroup *group = tileMap->getObjectGroup("thing");
    //这个组的全部Object都封装在Vector中
    std::vector<Value> group1 =group->getObjects();
    for(int i=0;i<group1.size();i++){
    //从Value中取出的时候其实是个键值对。

        ValueMap spawnPoint = group1[i].asValueMap();
        //获取位置数据
        float  pro = spawnPoint["x"].asFloat();
        float  pro_y=spawnPoint["y"].asFloat();
        //还能够取出不少数据。。。。。。。
        CCLOG("具体位置。%f",pro);
        //建立实体
        PropertyData *property=PropertyData::create();
        property->setImage("gun1.png");
        property->setID(39);
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(pro/PTM_RATIO, (pro_y/PTM_RATIO));
        b2Body *body=world->CreateBody(&bodyDef);
        property->setID(38);
        //这里设计的是一个多功能精灵。
        EnemyRole *enemyRole = EnemyRole::createWithProperty(property,body,"str");
        gameLayer->addChild(enemyRole,10);
    }

打开界面关闭界面。

很简单的一个Layer,在控制类里建立,而后销毁。就能够了。不知道对不对。可是注意的是若是打开设置界面的话,那么游戏应该暂停才对,若是onpause暂停的话。控制界面里的键位监听也跟着暂停了。 因此一个很简单的方法就是,把更新的计时器 变为
this->schedule(schedule_selector(GameLayer::update));可操控的计时器。 就能够了。this

//若是用Esc打开设置界面的话,那么是6.
        case 6:
        //设置标记
                if(!dialog){
                    //这里设置的是在控制界面里赋值。被封装的PropertyData里赋值。
                    PropertyData *pro =PropertyData::create();
                    pro->setImage("gun1.png");
                    PropertyData *pro1 =PropertyData::create();
                    pro1->setImage("BoxA2.png");
                    propertyVector.push_back(pro);
                    propertyVector.push_back(pro1);
                    dia=DialogLayer::createDialogLayer("MainScene.csb",propertyVector);
                    dia->setCameraMask((unsigned short)CameraFlag::USER2);
                    this->unschedule(schedule_selector(GameLayer::update));
                    this->addChild(dia,60);
                    dialog=true;
                }else{
                //别忘了清空集合
                    this->schedule(schedule_selector(GameLayer::update));
                    this->removeChild(dia,true);
                    propertyVector.clear();
                    propertyVector.clear();
                    vector<PropertyData *> f;
                    vector<PropertyData *> s;
                    propertyVector.swap(f);
                    propertyVector.swap(s);
                    dialog=false;
                }
            break;