cocos2d-x开发之动作游戏实战--4-创新互联
这一篇讲npc的运动算法,讲一下思路,npc有很多的时候,实现很自然且离散的远动,还是有点难度的。
创新互联于2013年成立,公司以成都网站设计、做网站、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户超过千家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。利用离散函数生成随机数他t,作为落地点的运动时间,使不同的npc的运动错开。
利用两函数实现:
void Global::monsterMove(ccTime dt) { //移除部分后id对应出现换乱,待解决-------- //获得移除的id号,取过来进行校正 for (int i=0;icount();i++) { Enemy* monster=enemyArray->getObjectAtIndex(i); float mX=monster->getMonsterSprite()->getPosition().x; float mY=monster->getMonsterSprite()->getPosition().y; float bX=boy->getHeroSprite()->getPosition().x; float bY=boy->getHeroSprite()->getPosition().y; //Coaster Rider Monster Action AI; //use rand(); if(mX>bX) { mXvel=-0.25; //printf("monster is right!should to left!\n"); monster->getMonsterSprite()->setFlipX(false); } else if(bX>mX) { mXvel=0.25; //printf("monster is left!should to right!\n"); monster->getMonsterSprite()->setFlipX(true); } if(monster->getDirection()==MOVERLOOK) { monstersMoving(monster,i); } else if(monster->getDirection()==MATTACK&&monster- >getMonsterSprite()->getPosition().y>5) { monstersMoving(monster,i); } //monstersMoving(monster,i); CCPoint pos=monster->getMonsterSprite()->getPosition(); monster->getMonsterSprite()->setPosition(ccp(pos.x+mXvel,pos.y)); //当***时monster停止跳动over } for (int i=0;i count();i++) { Enemy* monster=enemypDingArray->getObjectAtIndex(i); float mX=monster->getMonsterSprite()->getPosition().x; float mY=monster->getMonsterSprite()->getPosition().y; float bX=boy->getHeroSprite()->getPosition().x; float bY=boy->getHeroSprite()->getPosition().y; //Coaster Rider Monster Action AI; //use rand(); if(mX>bX) { mXvel=-0.25; //printf("monster is right!should to left!\n"); monster->getMonsterSprite()->setFlipX(false); } else if(bX>mX) { mXvel=0.25; //printf("monster is left!should to right!\n"); monster->getMonsterSprite()->setFlipX(true); } if(monster->getDirection()==MOVERLOOK) { monstersMoving(monster,50+i); } else if(monster->getDirection()==MATTACK&&monster->getMonsterSprite()->getPosition().y>5) { monstersMoving(monster,50+i); } //monstersMoving(monster,i); CCPoint pos=monster->getMonsterSprite()->getPosition(); monster->getMonsterSprite()->setPosition(ccp(pos.x+mXvel,pos.y)); //当***时monster停止跳动over } } void Global::monstersMoving(Enemy* monster,int id) { //利用时间错开的方式,实现enemy差异化运动 //运动还需优化-------------------------------2013.3.2 if(monsterData->getActionTime(id)<=51&&monsterData->getActionTime(id)>=0) { monPos[id].y=(velY[id])*(monsterData->getActionTime(id))-0.5*(GRAVITY*(monsterData->getActionTime(id)))*(monsterData->getActionTime(id)); monPos[id].x=(velX[id])*(monsterData->getActionTime(id)); } float vec2Y=monPos[id].y; float vec2X=monPos[id].x; if(monster->getMonsterSprite()->getPosition().y<5) { monsterPosition[id].y=monster->getMonsterSprite()->getPosition().y; if(velY[id]==0) { monsterPosition[id].y+=0.5*GRAVITY*monsterData->getActionTime(id)*monsterData->getActionTime(id); } if(velY[id]>0) { //monsterData->setActionTime(0.0,id); } int N = 80 + rand() % 120; if(velY[id]>0&&monsterData->getActionTime(id)>=N) { monsterData->setActionTime(0.0,id); } velY[id]=0.0; isMonsterJ[id]=false; isPlayMonsAnim=true; } //有bug,运动不正常,动作要合理的切换 if(monsterData->getActionTime(id)<=51&&monsterData->getActionTime(id)>=0) { monster->getMonsterSprite()->setPosition(ccp(monster->getMonsterSprite()->getPosition().x,monsterPosition[id].y+monPos[id].y)); } float py=monster->getMonsterSprite()->getPosition().y; //正常的写法 velY[id]=2.5; monsterData->setActionTime(monsterData->getActionTime(id)+0.75,id); //CCLOG("Time:%f y:%f",monsterData->getActionTime(1),py); }
下一篇将讲碰撞的处理,应为要用到解析plist文件,大家先看一下下面的博文,
Cocos2d-x游戏开发之TecturePacker的plist解析
http://lonag.blog.51cto.com/3340984/1002265
long原创
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:cocos2d-x开发之动作游戏实战--4-创新互联
网址分享:http://cdiso.cn/article/gcpec.html