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;
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #6
0
        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
        }