cocos2d-x 游戏创作过程 后台的控制界面创作
- 制作一个可以操控的界面
- 然后给界面 加载需要的值
- 从瓦片地图中获取需要的属性。
- 打开界面关闭界面。
制作一个可操控的界面,然后给界面加载需要的值。
如果用CocosStudio的话,可以轻松制作一个,美观的界面。 然后用这张界面加载数据。
加载界面的时候用逻辑符号,所对应的ui。加载就可以了,很简单。
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解析器而已。 所以很容易取出来。 首先从瓦片组中,取出每一条对象,然后每一条对象逐一解析。 就可以得到不同的值了。瓦片对象块,可以在地图层修改 敌人与物品的数据。 可以方便开发。 开发的目的大部分要做好的后期的简化编辑状态。 只要做好对应的状态那么开发很容易上手,甚至不需要代码的参了。
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));可操控的计时器。 就可以了。
//如果用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;