之前用的版本是2.0.1的版本,后来又用2.1.1重新写了一部分,现在全新开始,就用最新的版本,cocos2d-x-3.0beta,这个版本和之前的相比变化挺大的。
首先,肯定就是加载地图了,这里我用的是地图编辑器tIDE Tile Map Editor,具体用法请点击下面的链接
http://blog.csdn.net/nat_myron/article/details/8763570
这是用的背景的素材
程序实现方法:
//===========加载背景地图============= auto bg = TMXTiledMap::create("bg.tmx"); bg->setPosition(Point(0,0)); this->addChild(bg,0);
这样就可以把我们编辑好的地图加载到场景中了,再修改一下bg.tmx文件,记录一下我们的路线。
<objectgroup name="path" width="60"height="60"> <objectx="0" y="5"/> <objectx="2" y="5"/> <objectx="2" y="2"/> <objectx="4" y="2"/> <objectx="4" y="4"/> <objectx="7" y="4"/> <objectx="7" y="6"/> <objectx="11" y="6"/> <objectx="11" y="0"/> </objectgroup>
程序中初始化路线的方法:
auto map = TMXTiledMap::create("bg.tmx"); auto group = map->getObjectGroup("path"); auto& objects = group->getObjects(); for (auto& obj : objects) { ValueMap& dict = obj.asValueMap(); int x = dict["x"].asInt(); int y = 480 - dict["y"].asInt(); wayPoint.push_back(Point(x,y)); wayCount++; }
容器wayPoint记录tmx文件中的点。
好了,现在背景有了,路线也有了,接下来就是怪物了。
怪物的素材图
读取方法:
void Enemy::uploadEnemy() { //RightMove() Vector<SpriteFrame*>tempRightMove; for (int i = 8; i < 12; i++) { tempRightMove.pushBack(Myframes[i]); } Animation* aniRightMove = Animation::createWithSpriteFrames(tempRightMove,0.2f); actionRightMove = Animate::create(aniRightMove); actionRightMove->retain(); //LeftMove() Vector<SpriteFrame*>tempLeftMove; for (int i = 4; i < 8; i++) { tempLeftMove.pushBack(Myframes[i]); } Animation* aniLeftMove = Animation::createWithSpriteFrames(tempLeftMove,0.2f); actionLeftMove = Animate::create(aniLeftMove); actionLeftMove->retain(); //UpMove() Vector<SpriteFrame*>tempUpMove; for (int i = 12; i < 16; i++) { tempUpMove.pushBack(Myframes[i]); } Animation* aniUpMove = Animation::createWithSpriteFrames(tempUpMove,0.2f); actionUpMove = Animate::create(aniUpMove); actionUpMove->retain(); //DownMove() Vector<SpriteFrame*>tempDownMove; for (int i = 0; i < 4; i++) { tempDownMove.pushBack(Myframes[i]); } Animation* aniDownMove = Animation::createWithSpriteFrames(tempDownMove,0.2f); actionDownMove = Animate::create(aniDownMove); actionDownMove->retain(); }
创建怪物:
void GameScene::addEnemy() { //============增加一个怪物============== auto enemy = Enemy::create(); enemy->setPosition(Tools::ConvertViewPoint(DataManage::getInstance()->wayPoint[0])); this->addChild(enemy,1); DataManage::getInstance()->v_enemy.push_back(enemy); }
怪物的移动:
void Enemy::run() { if (this->iTurn< RoadCount - 1 && this->hp > 0) { Point point1 = DataManage::getInstance()->wayPoint[iTurn]; Point point2 = DataManage::getInstance()->wayPoint[iTurn+1]; Point p0 = Tools::ConvertViewPoint(point2); Point p = this->getPosition(); //帧动画 if(point2.x - point1.x == 0)//垂直 { if(point2.y - point1.y >= 0 ) { if (iChangeDire!=1) { this->stopAllActions(); this->runAction(RepeatForever::create(actionDownMove));//1 iChangeDire = 1; } p.y -= this->speed*1; if (p.y-p0.y<=0) { iTurn++; p = p0; } } else if(point2.y - point1.y < 0 ) { if (iChangeDire!=2) { this->stopAllActions(); this->runAction(RepeatForever::create(actionUpMove));//2 iChangeDire = 2; } p.y += this->speed*1; if (p.y-p0.y>=0) { iTurn++; p = p0; } } } else if(point2.y - point1.y == 0)//水平 { if(point2.x - point1.x > 0 ) { if (iChangeDire!=3) { this->stopAllActions(); this->runAction(RepeatForever::create(actionRightMove));//3 iChangeDire = 3; } p.x += this->speed*1; if (p.x-p0.x>=0) { iTurn++; p = p0; } } else if(point2.x - point1.x <= 0 ) { if (iChangeDire!=4) { this->stopAllActions(); this->runAction(RepeatForever::create(actionLeftMove));//4 iChangeDire = 4; } p.x -= this->speed*1; if (p.x-p0.x<=0) { iTurn++; p = p0; } } } this->setPosition(p); } //else if(this->iTurn >= RoadCount-1) //{ // this->removeFromParentAndCleanup(true); // DataManage::getInstance()->v_enemy.erase(pos); //} }
怪物出现的时间写在一个plist里
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>level1</key> <dict> <key>1</key> <dict> <key>time</key> <string>0</string> </dict> <key>2</key> <dict> <key>time</key> <string>1</string> </dict> <key>3</key> <dict> <key>time</key> <string>2</string> </dict> <key>4</key> <dict> <key>time</key> <string>3</string> </dict> <key>5</key> <dict> <key>time</key> <string>4</string> </dict> <key>6</key> <dict> <key>time</key> <string>5</string> </dict> <key>7</key> <dict> <key>time</key> <string>6</string> </dict> </dict> </dict> <dict> </dict> </plist>
读取方法:
__Dictionary* plistDic = __Dictionary::createWithContentsOfFile("level1.plist"); __Dictionary* levelDic = dynamic_cast<__Dictionary*>(plistDic->objectForKey("level1")); char str[10]; for (int i=1;i<=levelDic->count();i++) { sprintf_s(str,"%d",i); __Dictionary* farScene = dynamic_cast<__Dictionary*>(levelDic->objectForKey(str)); __String* spriteName = dynamic_cast<__String*>(farScene->objectForKey("time")); float time = spriteName->floatValue(); v_time.push_back(time); }
主场景开启一个定时器,遍历所有的怪物,让怪物出现并跑起来
void GameScene::update( float dt ) { //==========enemy run================ vector<Enemy*>::iterator it=DataManage::getInstance()->v_enemy.begin(); while(it!=DataManage::getInstance()->v_enemy.end()) { if((*it)->iTurn >= (*it)->RoadCount-1) { (*it)->removeFromParentAndCleanup(true); it = DataManage::getInstance()->v_enemy.erase(it); }else { (*it)->run(); it++; } } //========enemy show time=================== vector<float>::iterator it_time=DataManage::getInstance()->v_time.begin(); while(it_time!=DataManage::getInstance()->v_time.end()) { float tmp = fabs(time-*it_time); if(( tmp>-0.0001) && (tmp < 0.0001)) { addEnemy(); it_time = DataManage::getInstance()->v_time.erase(it_time); }else { it_time++; } } time += 1.0/60; }坐标转换函数
Point Tools::ConvertViewPoint( Point p ) { return Director::getInstance()->convertToGL(CCPoint(p.x * 60 + 30, p.y * 60)); }
看一下运行图
这一篇就到此为止了。