cocos2d-x开发之动作游戏实战--4
这一篇讲npc的运动算法,讲一下思路,npc有很多的时候,实现很自然且离散的远动,还是有点难度的。
利用离散函数生成随机数他t,作为落地点的运动时间,使不同的npc的运动错开。
利用两函数实现:
voidGlobal::monsterMove(ccTimedt){//移除部分后id对应出现换乱,待解决--------//获得移除的id号,取过来进行校正for(inti=0;i<enemyArray->count();i++){Enemy*monster=enemyArray->getObjectAtIndex(i);floatmX=monster->getMonsterSprite()->getPosition().x;floatmY=monster->getMonsterSprite()->getPosition().y;floatbX=boy->getHeroSprite()->getPosition().x;floatbY=boy->getHeroSprite()->getPosition().y;//CoasterRiderMonsterActionAI;//userand();if(mX>bX){mXvel=-0.25;//printf("monsterisright!shouldtoleft!\n");monster->getMonsterSprite()->setFlipX(false);}elseif(bX>mX){mXvel=0.25;//printf("monsterisleft!shouldtoright!\n");monster->getMonsterSprite()->setFlipX(true);}if(monster->getDirection()==MOVERLOOK){monstersMoving(monster,i);}elseif(monster->getDirection()==MATTACK&&monster->getMonsterSprite()->getPosition().y>5){monstersMoving(monster,i);}//monstersMoving(monster,i);CCPointpos=monster->getMonsterSprite()->getPosition();monster->getMonsterSprite()->setPosition(ccp(pos.x+mXvel,pos.y));//当***时monster停止跳动over}for(inti=0;i<enemypDingArray->count();i++){Enemy*monster=enemypDingArray->getObjectAtIndex(i);floatmX=monster->getMonsterSprite()->getPosition().x;floatmY=monster->getMonsterSprite()->getPosition().y;floatbX=boy->getHeroSprite()->getPosition().x;floatbY=boy->getHeroSprite()->getPosition().y;//CoasterRiderMonsterActionAI;//userand();if(mX>bX){mXvel=-0.25;//printf("monsterisright!shouldtoleft!\n");monster->getMonsterSprite()->setFlipX(false);}elseif(bX>mX){mXvel=0.25;//printf("monsterisleft!shouldtoright!\n");monster->getMonsterSprite()->setFlipX(true);}if(monster->getDirection()==MOVERLOOK){monstersMoving(monster,50+i);}elseif(monster->getDirection()==MATTACK&&monster->getMonsterSprite()->getPosition().y>5){monstersMoving(monster,50+i);}//monstersMoving(monster,i);CCPointpos=monster->getMonsterSprite()->getPosition();monster->getMonsterSprite()->setPosition(ccp(pos.x+mXvel,pos.y));//当***时monster停止跳动over}}voidGlobal::monstersMoving(Enemy*monster,intid){//利用时间错开的方式,实现enemy差异化运动//运动还需优化-------------------------------2013.3.2if(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));}floatvec2Y=monPos[id].y;floatvec2X=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);}intN=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));}floatpy=monster->getMonsterSprite()->getPosition().y;//正常的写法velY[id]=2.5;monsterData->setActionTime(monsterData->getActionTime(id)+0.75,id);//CCLOG("Time:%fy:%f",monsterData->getActionTime(1),py);}
下一篇将讲碰撞的处理,应为要用到解析plist文件,大家先看一下下面的博文,
Cocos2d-x游戏开发之TecturePacker的plist解析
http://lonag.blog.51cto.com/3340984/1002265
long原创
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。