public override void TickLogical() { //if (i == 0) //{ // //Log.Trace("ShipEnemyAiComponent 开始AI逻辑"); // container.AddThrust(AIForce); // i = 1; //} //Log.Trace("ShipEnemyAiComponent 正在运行AI逻辑"); if (DateTime.Now.Ticks - lastlogicalframe > delyframe) { //Tick 敌人是否在附近 var list = container.GetPhysicalinternalBase().GetBody() .CircleDetection(level.GetEnvirinfointernalBase().GetShipActorsByCamp(container.GetCamp()).ToBodyList(), AIdis); //Log.Trace("ShipEnemyAiComponent 附近敌人数量" + list.Count); if (list.Count <= 0) { return; } //这个list 里面有敌人 //Log.Trace("ShipEnemyAiComponent 发现敌人" + list.Count); //朝向跟随敌人 //container.GetPhysicalinternalBase().GetBody().SomeAreaFowardToTarget(list[0].GetPosition(), AITorque); //追击敌人 container.GetPhysicalinternalBase().GetBody().FollowTarget(list[0].GetPosition(), AIForce, AITorque); lastlogicalframe = DateTime.Now.Ticks; } }
protected void RegisterDestroy(ulong obj) { var actor = level.GetEnvirinfointernalBase().GetActor(obj); if (actor == null) { //Log.Trace("计数对象为 null" + obj); return; } //Log.Trace("有计数对象" + actor.GetActorID() + "类型" + actor.GetActorType()); if (actor.IsShip() && actor.GetCamp() != LevelActorBase.PlayerCamp && actor.GetActorType() != ActorTypeBaseDefine.DroneShipActor) { Currentvalue[key]++; m_event.TryGetValue(key, out int i); //Log.Trace("计数加一" + actor.GetActorID() + " 当前数量:"+Currentvalue[key] + " 需要击杀数量:"+i); } }
protected ActorBase GetActor(ulong id) { var allactor = levelContainer.GetEnvirinfointernalBase().GetAllActors(); foreach (var actorBase in allactor) { if (actorBase.GetActorID() == id) { return(actorBase); } } return(null); }
/// <summary> /// 创建不同的物理对象 /// </summary> protected PhysicalBase CreatePhysicalBase() { return(new PhysicalBase(level.GetEnvirinfointernalBase())); }
//int i = 0; public override void TickLogical() { //if(i == 0) //{ // Log.Trace("ShipEnemyAiComponent 开始AI逻辑"); // i = 1; //} //Log.Trace("ShipEnemyAiComponent 正在运行AI逻辑"); if (DateTime.Now.Ticks - lastlogicalframe > delyframe) { //Tick 敌人是否在附近 var list = container.GetPhysicalinternalBase().GetBody() .CircleDetection(level.GetEnvirinfointernalBase().GetShipActorsByCamp(container.GetCamp()).ToBodyList(), 1000); //Log.Trace("ShipEnemyAiComponent 附近敌人数量" + list.Count); if (list.Count <= 0) { return; } //这个list 里面有敌人 //Log.Trace("ShipEnemyAiComponent 发现敌人" + list.Count); //追击敌人 //container.GetPhysicalinternalBase().GetBody().FollowTarget(list[0].Position); //判断进入射程 //距离小于最远射程是为了保证在移动中有更多打到敌人的机会 bool distanceinrange = container.GetPhysicalinternalBase().GetBody() .DistanceDetection(list[0].GetPosition(), 90); Vector2 p = new Vector2(); if (distanceinrange) { //Log.Trace("ShipEnemyAiComponent 敌人小于90" + list.Count); var body = container.GetPhysicalinternalBase().GetBody(); //自动转向接口 if (body.FowardToTarget(list[0].GetPosition(), 2) > 0.98f) { if (DateTime.Now.Ticks - lastfireframe > delyfireframe * 2) { //攻击 container.GetFireControlinternalBase().FireAI(0); lastfireframe = DateTime.Now.Ticks; } //Log.Trace("ShipEnemyAiComponent 攻击敌人" + list.Count); } } else { //Log.Trace("ShipEnemyAiComponent 敌人大于90" + list.Count); var body = container.GetPhysicalinternalBase().GetBody(); //环绕 Double deltaX = list[0].GetPosition().X - body.GetPosition().X; Double deltaY = list[0].GetPosition().Y - body.GetPosition().Y; //当前方位在第一象限,确定环绕的目标地点 if (deltaX >= 0 && deltaY >= 0) { //α=90 if (deltaX == 0) { EncirclePosition_3(); } //α=0 if (deltaY == 0) { EncirclePosition_1(); } //α=(0,45) if (deltaY / deltaX > 0 && deltaY / deltaX < 1) { EncirclePosition_1(); } //α=[45,90) else { EncirclePosition_2(); } } //当前方位在第二象限,确定环绕的目标地点 else if (deltaX <= 0 && deltaY >= 0) { //α=90 if (deltaX == 0) { EncirclePosition_3(); } //α=180 if (deltaY == 0) { EncirclePosition_5(); } //α=(90,135) if ((-deltaX) / deltaY > 0 && (-deltaX) / deltaY < 1) { EncirclePosition_3(); } //α=[135,180) else { EncirclePosition_4(); } } //当前方位在第三象限,确定环绕的目标地点 else if (deltaX <= 0 && deltaY <= 0) { //α=270 if (deltaX == 0) { EncirclePosition_7(); } //α=180 if (deltaY == 0) { EncirclePosition_5(); } //α=(180,225) if (deltaY / deltaX > 0 && deltaY / deltaX < 1) { EncirclePosition_5(); } //α=[225,270) else { EncirclePosition_6(); } } //当前方位在第四象限,确定环绕的目标地点 else if (deltaX >= 0 && deltaY <= 0) { //α=270 if (deltaX == 0) { EncirclePosition_7(); } //α=0 if (deltaY == 0) { EncirclePosition_1(); } //α=(270,315) if (deltaX / (-deltaY) > 0 && deltaX / (-deltaY) < 1) { EncirclePosition_7(); } //α=[315-360) else { EncirclePosition_8(); } } } //Log.Trace("完成一次AI逻辑 赋值"); lastlogicalframe = DateTime.Now.Ticks; void EncirclePosition_1() { p.X = list[0].GetPosition().X + 90 * 0.7071f; p.Y = list[0].GetPosition().Y + 90 * 0.7071f; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_2() { p.X = list[0].GetPosition().X; p.Y = list[0].GetPosition().Y + 90; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_3() { p.X = list[0].GetPosition().X - 90 * 0.7071f; p.Y = list[0].GetPosition().Y + 90 * 0.7071f; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_4() { p.X = list[0].GetPosition().X - 90; p.Y = list[0].GetPosition().Y; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_5() { p.X = list[0].GetPosition().X - 90 * 0.7071f; p.Y = list[0].GetPosition().Y - 90 * 0.7071f; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_6() { p.X = list[0].GetPosition().X; p.Y = list[0].GetPosition().Y - 90; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_7() { p.X = list[0].GetPosition().X + 90 * 0.7071f; p.Y = list[0].GetPosition().Y - 90 * 0.7071f; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } void EncirclePosition_8() { p.X = list[0].GetPosition().X + 90; p.Y = list[0].GetPosition().Y; container.GetPhysicalinternalBase().GetBody().FollowTarget(p, AIForce, AITorque); } } }
protected void InitializeActor(GameShipConfig[] ships, GameSkillConfig skill, GameBarrierConfig barrier) { var factory = level.GetEnvirinfointernalBase().GetFactory(); #region 任务配置 foreach (var barrierTaskConfig in barrier.TaskConfigs) { int id = barrierTaskConfig.Id; int condition = barrierTaskConfig.StartCondition; int result = barrierTaskConfig.Result; var dict = new Dictionary <int, int>(); string des = barrierTaskConfig.Description; //Log.Trace("加载配置 任务id:" + id + " 条件" + condition + " 结果" + result); foreach (var itme in barrierTaskConfig.TaskConditionItemConfig) { dict.Add(itme.ConditionTarget, itme.ConditionValue); //Log.Trace(" key" + itme.ConditionTarget + " value" + itme.ConditionValue); } var task1 = level.GetCreateInternalComponentBase().CreateTaskEvent( condition, result, id, dict, des); level.AddTaskEvent(task1); } #endregion WeaponActorBase weaponactor = null; #region 武器 #region 往前冲武器 //高射炮 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.AntiAircraftGunActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f,isSensor:true)); weaponactor.CreateInitData(new InitData { }); weaponactor.CreateAiComponent(new GogogoAiComponent(weaponactor, 20000)); ConfigActors.Add(ActorTypeBaseDefine.AntiAircraftGunActor, weaponactor); //鱼雷 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.TorpedoActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(new GogogoAiComponent(weaponactor, 15000)); ConfigActors.Add(ActorTypeBaseDefine.TorpedoActor, weaponactor); //机关枪 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.MachineGunActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(new GogogoAiComponent(weaponactor, 20000)); ConfigActors.Add(ActorTypeBaseDefine.MachineGunActor, weaponactor); #endregion //持续激光 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.ContinuousLaserActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(null); ConfigActors.Add(ActorTypeBaseDefine.ContinuousLaserActor, weaponactor); #region 自爆炸武器 //定时炸弹 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.TimeBombActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(new DeadAiComponent(50000000, weaponactor)); ConfigActors.Add(ActorTypeBaseDefine.TimeBombActor, weaponactor); //触发炸弹 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.TriggerBombActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(null); ConfigActors.Add(ActorTypeBaseDefine.TriggerBombActor, weaponactor); #endregion //跟踪导弹 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.TrackingMissileActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(new FollowAiComponent(level, weaponactor, 200, 2, 1000)); ConfigActors.Add(ActorTypeBaseDefine.TrackingMissileActor, weaponactor); //蓄力激光 weaponactor = new WeaponActorBase(0, ActorTypeBaseDefine.PowerLaserActor, level); //weaponactor.CreateBody(factory.CreateRectangleBody(0, 0, 0.3f, 2.725f, isSensor: true)); weaponactor.CreateInitData(new InitData()); weaponactor.CreateAiComponent(new GogogoAiComponent(weaponactor, 15000)); ConfigActors.Add(ActorTypeBaseDefine.PowerLaserActor, weaponactor); #endregion #region 技能属性配置 foreach (var skillconfig in Skill.DamageSkillConfig) { if (ConfigActors.TryGetValue(skillconfig.SkillType, out var actor)) { if (!(actor is IWeaponBaseComponentContainer skillitem)) { return; } var cd = skillconfig.CD; var damage = skillconfig.DamageValue; var count = skillconfig.MaxCount; skillitem.SetSkillCd(cd); skillitem.SetWeaponDamage(damage); skillitem.SetSkillCapacity(count); //Log.Trace("InitializeActor: CD" + cd + " damage" + damage + " count" + count); } } #endregion ShipActorBase shipactor = null; #region 船 //歼灭船 shipactor = new ShipActorBase(0, ActorTypeBaseDefine.AnnihilationShipActor, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.InitializeFireControl(new List <int> // 跟踪导弹 机关枪 { ActorTypeBaseDefine.TrackingMissileActor, ActorTypeBaseDefine.MachineGunActor }); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); ConfigActors.Add(ActorTypeBaseDefine.AnnihilationShipActor, shipactor); //精英船A shipactor = new ShipActorBase(0, ActorTypeBaseDefine.EliteShipActorA, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new EliteShipAAiComponent(shipactor, 30000, 5)); shipactor.InitializeFireControl(new List <int> // 鱼雷 高射炮 { ActorTypeBaseDefine.TorpedoActor, ActorTypeBaseDefine.AntiAircraftGunActor }); ConfigActors.Add(ActorTypeBaseDefine.EliteShipActorA, shipactor); //精英船B shipactor = new ShipActorBase(0, ActorTypeBaseDefine.EliteShipActorB, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); shipactor.InitializeFireControl(new List <int> // 蓄力激光 时间炸弹 { ActorTypeBaseDefine.ContinuousLaserActor, ActorTypeBaseDefine.TimeBombActor }); ConfigActors.Add(ActorTypeBaseDefine.EliteShipActorB, shipactor); //战斗机A shipactor = new ShipActorBase(0, ActorTypeBaseDefine.FighterShipActorA, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); shipactor.InitializeFireControl(new List <int> // 机关枪 持续激光 { ActorTypeBaseDefine.MachineGunActor, ActorTypeBaseDefine.ContinuousLaserActor }); ConfigActors.Add(ActorTypeBaseDefine.FighterShipActorA, shipactor); //战斗机B shipactor = new ShipActorBase(0, ActorTypeBaseDefine.FighterShipActorB, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); shipactor.InitializeFireControl(new List <int> // 高射炮 蓄力激光s { ActorTypeBaseDefine.AntiAircraftGunActor, ActorTypeBaseDefine.PowerLaserActor }); ConfigActors.Add(ActorTypeBaseDefine.FighterShipActorB, shipactor); //无人机 shipactor = new ShipActorBase(0, ActorTypeBaseDefine.DroneShipActor, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); shipactor.InitializeFireControl(new List <int> // 机关枪 { ActorTypeBaseDefine.MachineGunActor }); ConfigActors.Add(ActorTypeBaseDefine.DroneShipActor, shipactor); //黄蜂飞船 shipactor = new ShipActorBase(0, ActorTypeBaseDefine.WaspShipActorA, level); //shipactor.CreateBody(factory.CreateTrapezoidBody(0, 0, 6, 14, 3)); shipactor.CreateInitData(new InitData()); shipactor.CreateAiComponent(new ShipEnemyAiComponent(level, shipactor)); shipactor.InitializeFireControl(new List <int> // 机关枪 高射炮 { ActorTypeBaseDefine.MachineGunActor, ActorTypeBaseDefine.AntiAircraftGunActor }); ConfigActors.Add(ActorTypeBaseDefine.WaspShipActorA, shipactor); #endregion #region 船配置属性 foreach (var shipconfig in ships) { if (ConfigActors.TryGetValue(shipconfig.ShipType, out var actor)) { if (!(actor is IShipComponentBaseContainer shipitem)) { return; } var hp = shipconfig.MaxHp; var shield = shipconfig.MaxShield; shipitem.SetHP(hp); shipitem.SetShieldNum(shield); } } #endregion EnvirActor envirActor = null; #region 环境 //陨石 envirActor = new EnvirActor(0, ActorTypeBaseDefine.Meteorite_L, level); envirActor.CreateInitData(new InitData()); ConfigActors.Add(ActorTypeBaseDefine.Meteorite_L, envirActor); envirActor = new EnvirActor(0, ActorTypeBaseDefine.Meteorite_S, level); envirActor.CreateInitData(new InitData()); ConfigActors.Add(ActorTypeBaseDefine.Meteorite_S, envirActor); envirActor = new EnvirActor(0, ActorTypeBaseDefine.Meteorite_M, level); envirActor.CreateInitData(new InitData()); ConfigActors.Add(ActorTypeBaseDefine.Meteorite_M, envirActor); envirActor = new EnvirActor(0, ActorTypeBaseDefine.BlackHole, level); envirActor.CreateInitData(new InitData()); envirActor.CreateAiComponent(new BlackHoleAiComponent(envirActor, 100, 0.5f)); ConfigActors.Add(ActorTypeBaseDefine.BlackHole, envirActor); #endregion }