尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17149543
上节回顾
【cocos2d-x IOS游戏开发-捕鱼达人11】鱼的产生和移动:完善
1、 鱼群效果设计
鱼群效果描述
一群鱼,保持队形(相对位置不变)从一个点移向另一个点
鱼群数据
锚点
速度
对应的鱼
初始位置
目标位置
处于鱼群中的鱼的数据
对应的鱼的模板ID
相对于鱼群锚点的偏移
2、 鱼群效果实现
需要处理的问题
鱼群出来时,其它鱼如何散场
鱼群走后,其它鱼如何回到场景
何时出现鱼群
先看下update的状态变换:
void CGameLogic::update( float dt ) { if(m_eGameState != EGS_GAME_PLAY) return; m_fTime += dt; switch(m_iSubState) { case EGPS_NORMAL: { static float total = 0; total+=dt; if(total > 3){ if(m_vecObjectsList.size()< config::CGameConfig::getMaxFishNum()){ createGameObject(); } total = 0; } const std::vector<fishingjoy::config::SFishGroupData>& rGroupData = fishingjoy::config::CFishGroup::getGroupData(); CCLOG("m_fTime = %f,rGroupData[0].BeginTime = %f",m_fTime, rGroupData[0].BeginTime); for(size_t i = 0; i < rGroupData.size(); ++i){ if(abs(m_fTime - rGroupData[i].BeginTime)<1){ m_iSubState = EGPS_GROUP_COME; int extend = config::CGameConfig::getExtendSize(); float xs[] = {-extend,480+extend, 480+extend,-extend}; float ys[] = {-extend,-extend, 320+extend,320+extend}; std::vector<CGameObject*>::iterator it = m_vecObjectsList.begin(); std::vector<CGameObject*>::iterator end = m_vecObjectsList.end(); for(;it!=end;++it){ int randx = CCRANDOM_0_1()*4; int randy = CCRANDOM_0_1()*4; (*it)->setTarget(xs[randx],ys[randy]); } m_pGroupData = &rGroupData[i]; m_fGroupTime = m_fTime; break; } } } break; case EGPS_GROUP_COME: { if(m_fTime > m_fGroupTime + GROUP_COME_TIME){ m_iSubState = EGPS_GROUP; for(int i = 0; i < m_pGroupData->Fishs.size(); ++i){ const config::SFishInGroup& rInGroup = m_pGroupData->Fishs[i]; createGameObject(rInGroup.FID,rInGroup.OffsetX + m_pGroupData->X + m_pGroupData->AnchorX, rInGroup.OffsetY + m_pGroupData->Y + m_pGroupData->AnchorY,m_pGroupData->Speed ,rInGroup.OffsetX + m_pGroupData->TargetX + m_pGroupData->AnchorX, rInGroup.OffsetY + m_pGroupData->TargetY + m_pGroupData->AnchorY); } m_fGroupTime = m_fTime; break; } } break; case EGPS_GROUP: { if(m_fTime > m_fGroupTime + m_pGroupData->LastTime){ m_iSubState = EGPS_GROUP_GO; m_fGroupTime = m_fTime; } } break; case EGPS_GROUP_GO: { if(m_fTime > m_fGroupTime+ GROUP_GO_TIME){ std::vector<CGameObject*>::iterator it = m_vecObjectsList.begin(); std::vector<CGameObject*>::iterator end = m_vecObjectsList.end(); for(;it!=end;++it){ (*it)->randomTarget(); } m_iSubState = EGPS_NORMAL; } } break; } if(m_pGameScene) m_pGameScene->update(dt); std::vector<CGameObject*>::iterator it = m_vecObjectsList.begin(); std::vector<CGameObject*>::iterator end = m_vecObjectsList.end(); for(;it!=end;++it){ (*it)->update(dt); } }
本节源代码与工程文件:【资源引用页】