virtual void traffic_run() { // activities that may occur in the traffic flow // std::cout << *this; pursuit(); steps(); }
cocos2d::Vec2 SteeringBehaviors::calculate() { m_vSteeringForce.setPoint(0, 0); /** * 要知道每一种驱动力的优先级其实是不同的,比如需要首要保证人物之间不能重叠和 * 撞墙,然后才是arrive和seek */ if (On(WALL_AVOIDANCE) && !accumulateForce(m_vSteeringForce, wallAvoidance())) { return m_vSteeringForce; } if (On(SEPARATION) && !accumulateForce(m_vSteeringForce, separation())) { return m_vSteeringForce; } // @_@ 后来加入的外部牵引力,一般是不开放的 if (On(TRACTION) && !accumulateForce(m_vSteeringForce, m_traction)) { return m_vSteeringForce; } if (On(SEEK) && !accumulateForce(m_vSteeringForce, seek(m_vTarget))) { return m_vSteeringForce; } if (On(ARRIVE) && !accumulateForce(m_vSteeringForce, arrive(m_vTarget))) { return m_vSteeringForce; } if (On(PURSUIT) && !accumulateForce(m_vSteeringForce, pursuit(m_targetId))) { return m_vSteeringForce; } auto tmpFormation = m_pOwner->getTeam()->getTeamFormation(); auto tmpFormationPosId = m_pOwner->getMovingEntity().getFormationPosId(); if (On(KEEP_FORMATION) && !accumulateForce(m_vSteeringForce, keepFormation(tmpFormation, tmpFormationPosId))) { return m_vSteeringForce; } return m_vSteeringForce; }