float GetNearestMonster( SpriteSeer* pRole ) { float fret = 0.0f; SpriteMonster* pRet = NULL; float minDis = 100000.0f; minDis *= minDis; const map<int, SpriteMonster*>& allMonster = SpriteMonsterMgr::Get()->GetAllMonster(); for(map<int, SpriteMonster*>::const_iterator iter = allMonster.begin(); iter != allMonster.end(); iter++) { float dis = ccpDistanceSQ(iter->second->getPosition(), pRole->getPosition()); if( dis <= minDis) { pRet = iter->second; minDis = dis; } } if(pRet) { fret = ccpDistance(pRet->getPosition(), pRole->getPosition()); } return fret; }
//---------------------------------------------------------------------------------------- // others function means other players' //---------------------------------------------------------------------------------------- void BaseLevelBuilder::addMonster(MonsterInitInfo info) { std::map<uint32_t, SpriteMonster*>::iterator itor = m_level->m_MonsterInfo.find(info.uid); if (itor == m_level->m_MonsterInfo.end()) { //add monster ASSERT(m_level->m_levelDataReference->mapFilePointer != NULL, "map file is empty"); SpriteMonster* monster = LevelObjectCreator::sCreateSpriteMonster(info); monster->SetID(info.uid); monster->setTag(MAP_TAG_MONSTER); monster->setPosition(info.pos); //printf("addMonster %f, %f\n", info.pos.x, info.pos.y); //添加阴影 /*ASprite* pAsprite = AspriteManager::getInstance()->getAsprite("spriteBin/shadow.bin"); if(pAsprite != NULL) { CCPoint cp; CCSprite* pCSprite = pAsprite->getSpriteFromFrame(0, 0, cp); if(pCSprite != NULL) { pCSprite->setPosition(ccp(0, 0)); pCSprite->setTag(SHADOW_TAG); monster->addChildToRoot(pCSprite); } }*/ CATLObjectLayer* pObjLayer = dynamic_cast<CATLObjectLayer*>(m_level->m_pObjectsLayer); if(pObjLayer) { pObjLayer->AddRoleShadow(monster); } //为精英怪添加特效 if(info.isElite) { EffectSprite * eliteEffect = ParticleManager::Get()->createEffectSprite(206,""); eliteEffect->SetAnim(kType_Play, 1, true); eliteEffect->setTag(ELITE_TAG); monster->addChildToRoot(eliteEffect); } if (m_level->m_pObjectsLayer) { m_level->m_pObjectsLayer->addChild(monster, LevelLayer::sCalcZorder(monster->getPosition())); } m_level->m_MonsterInfo.insert(std::pair<uint32_t, SpriteMonster*>(info.uid, monster)); } else { CCLog("error, the player has add before"); } }
SpriteMonster * SpriteMonsterMgr::getNearestMonster() { SpriteMonster * nearestMonster = NULL; float distance = 10000.0f; SpriteSeer * hero = GameManager::Get()->getHero(); if (!hero || m_tabMonsters.size() == 0) { return NULL; } map<int, SpriteMonster*>::iterator it = m_tabMonsters.begin(); SpriteMonster * firstMonster = it->second; //能被锁定的怪物才记入数据,隐身不计入 if (firstMonster->getCanBeFocus() && !firstMonster->getIsAlliance()) { distance = ccpDistance(firstMonster->getPosition(), hero->getPosition()); nearestMonster = firstMonster; } for(; it != m_tabMonsters.end(); it++ ) { SpriteMonster* monster = it->second; if (!monster->getCanBeFocus() || monster->getIsAlliance()) { continue; } float dis = ccpDistance(monster->getPosition(), hero->getPosition()); if (dis < distance && monster->fsm_rule.IsRunning()) { distance = dis; nearestMonster = monster; } } return nearestMonster; }
cocos2d::CCPoint ElfAimDirectionHandler::GetAimDirection() { CCPoint ret = m_pElf->getDirectionVector(); CCPoint rolePos = m_pElf->getPosition(); if(LevelManager::sShareInstance()->isCurrentPVPLevel()) { if(LevelManager::sShareInstance()->getCurrentLevelLayer()) { float minDis = m_pSkill->longDistanceAttackRange; if(minDis <= 0.0f) minDis = 320.0f; minDis *= minDis; SpriteSeer* pNearestHero = NULL; std::map<unsigned int, OthersPlayerInfo>& otherPlayer = LevelManager::sShareInstance()->getCurrentLevelLayer()->m_othersPlayerInfo; for(std::map<unsigned int, OthersPlayerInfo>::const_iterator iter = otherPlayer.begin(); iter != otherPlayer.end(); iter++) { SpriteSeer* pOhterHero = iter->second.seer; if(m_pRole == pOhterHero || pOhterHero == NULL) continue; float dis = ccpDistanceSQ(pOhterHero->getPosition(), m_pElf->getPosition()); if( dis <= minDis) { pNearestHero = pOhterHero; minDis = dis; } } if(pNearestHero) { m_bAimMonster = true; m_nearestMonsterPos = pNearestHero->getPosition(); ret = ccpSub(m_nearestMonsterPos, rolePos); } } } else { SpriteMonster* pNearestMonster = GetNearestMonster(); if(pNearestMonster) { m_bAimMonster = true; m_nearestMonsterPos = pNearestMonster->getPosition(); ret = ccpSub(m_nearestMonsterPos, rolePos); } } ret = ccpNormalize(ret); return ret; }