/// <summary> /// Server服务实例向Client服务实例Notify当前周期的Mission对象 /// </summary> /// <returns></returns> public IEnumerator <ITask> MissionParaNotification() { // Notify all subscribers. MissionPara announce = new MissionPara(); // 将当前仿真使命的通用Mission对象拷贝一份用于策略调用的参数传递 Mission mission = (Mission)MyMission.Instance().MissionRef.Clone(); for (int i = 0; i < mission.CommonPara.TeamCount; i++) {// 循环对每条仿真机器鱼施加图像处理干扰 LiYoubing 20110617 for (int j = 0; j < mission.CommonPara.FishCntPerTeam; j++) { RoboFish f = mission.TeamsRef[i].Fishes[j]; Interference.ImageProcessInterference(ref f.PositionMm, ref f.BodyDirectionRad, f.VelocityMmPs, f.AngularVelocityRadPs); } } for (int i = 0; i < mission.EnvRef.Balls.Count; i++) {// 循环对所有仿真水球施加图像处理干扰 LiYoubing 20110617 Ball b = mission.EnvRef.Balls[i]; float tmp = 0; Interference.ImageProcessInterference(ref b.PositionMm, ref tmp, b.VelocityMmPs, b.AngularVelocityRadPs); } announce.Body = new MissionParaRequest(mission); //announce.Body = new MissionParaRequest(MyMission.Instance().MissionRef);//modified 20101203 base.SendNotification(_submgrPort, announce); announce.ResponsePort.Post(DefaultUpdateResponseType.Instance); yield break; }
/// <summary> /// 指示是否已经发生过策略调用异常true是false否 /// 20110820废弃 策略代码中存在条件性除零/数组越界等异常时 不必要直接结束掉策略运行 /// </summary> //bool _strategyExceptionFlag = false; /// <summary> /// 进行策略调用 获取指定id对应队伍的决策数据 /// </summary> /// <param name="teamId">待获取决策数据的队伍id(从0开始)</param> void GetLocalDecision(int teamId) { MyMission myMission = MyMission.Instance(); Decision[] decisions = null; if (_serverControlBoard.TeamStrategyControls[teamId].StrategyInterface != null /*&& _strategyExceptionFlag == false*/) {// 进行null检查确保不出异常 LiYoubing 20110511 // 将当前仿真使命的通用Mission对象拷贝一份用于策略调用的参数传递 Mission mission = (Mission)MyMission.Instance().MissionRef.Clone(); for (int i = 0; i < mission.CommonPara.TeamCount; i++) {// 循环对每条仿真机器鱼施加图像处理干扰 LiYoubing 20110617 for (int j = 0; j < mission.CommonPara.FishCntPerTeam; j++) { RoboFish f = mission.TeamsRef[i].Fishes[j]; Interference.ImageProcessInterference(ref f.PositionMm, ref f.BodyDirectionRad, f.VelocityMmPs, f.AngularVelocityRadPs); } } for (int i = 0; i < mission.EnvRef.Balls.Count; i++) {// 循环对所有仿真水球施加图像处理干扰 LiYoubing 20110617 Ball b = mission.EnvRef.Balls[i]; float tmp = 0; Interference.ImageProcessInterference(ref b.PositionMm, ref tmp, b.VelocityMmPs, b.AngularVelocityRadPs); } // 交换半场后交换策略处理 LiYoubing 20110711 // 交换半场后TeamsRef[0]/[1]代表交换前右/左半场的队伍因此应该分别调用第1/0号控件所加载的策略 int strategyId = myMission.ParasRef.IsExchangedHalfCourt ? (teamId + 1) % 2 : teamId; try { decisions = _serverControlBoard.TeamStrategyControls[strategyId].StrategyInterface.GetDecision( mission, teamId); } catch { //_strategyExceptionFlag = true; MessageBox.Show("Remoting object timeout.\nThe instance of class Strategy has been released." + "\nYour simulated robofish will not be controlled.", "Confirming", MessageBoxButtons.OK, MessageBoxIcon.Warning); } //decision = _serverControlBoard.TeamStrategyControls[teamId].StrategyInterface.GetDecision( // mission, teamId); //decision = _serverControlBoard.TeamStrategyControls[teamId].StrategyInterface.GetDecision( // myMission.MissionRef, teamId); } if (decisions == null) { return; } for (int j = 0; j < myMission.TeamsRef[teamId].Fishes.Count; j++) { myMission.DecisionRef[teamId, j] = decisions[j]; } }