diff --git a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json index f5cded9..d9e69c2 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/GroupConfig.json @@ -1,40 +1,40 @@ { "TestGroup1": { - "GroupName": "TestGroup1", - "BattleList": [ - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle1" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle2" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/battle/Battle3" - } - ], - "InletList": [ - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start1" - }, - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/inlet/Start2" - } - ], - "OutletList": [ - { - "ErrorType": 0, - "Path": "resource/map/tileMaps/TestGroup1/outlet/End1" - } - ], - "BossList": [], - "RewardList": [], - "ShopList": [], - "EventList": [], - "Remark": "\u6D4B\u8BD5\u7EC4" + "GroupName": "TestGroup1", + "BattleList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/battle/Battle1" + }, + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/battle/Battle2" + }, + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/battle/Battle3" + } + ], + "InletList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/inlet/Start1" + }, + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/inlet/Start2" + } + ], + "OutletList": [ + { + "ErrorType": 0, + "Path": "resource/map/tileMaps/TestGroup1/outlet/End1" + } + ], + "BossList": [], + "RewardList": [], + "ShopList": [], + "EventList": [], + "Remark": "\u6D4B\u8BD5\u7EC4" } -} +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs index e14b273..022a983 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs @@ -43,9 +43,9 @@ public int MaxHarm { get; set; } = 4; /// - /// 发射该子弹的角色 + /// 发射该子弹的角色是否是Ai /// - public Role Trigger { get; private set; } + public bool TriggerRoleIsAi { get; set; } // 最大飞行距离 private float MaxDistance; @@ -59,22 +59,22 @@ /// /// 初始化子弹属性 /// - /// 触发开火的角色 + /// 触发开火的角色 /// 射出该子弹的武器 /// 速度 /// 最大飞行距离 /// 位置 /// 角度 /// 攻击目标层级 - public void Init(Role trigger, Weapon weapon, float speed, float maxDistance, Vector2 position, float rotation, uint targetLayer) + public void Init(bool triggerIsAi, Weapon weapon, float speed, float maxDistance, Vector2 position, float rotation, uint targetLayer) { - Trigger = trigger; + TriggerRoleIsAi = triggerIsAi; Weapon = weapon; Role = weapon.Master; AttackLayer = targetLayer; CollisionArea.AreaEntered += OnArea2dEntered; - if (trigger != null && !trigger.IsAi) //只有玩家使用该武器才能获得正常速度的子弹 + if (!triggerIsAi) //只有玩家使用该武器才能获得正常速度的子弹 { FlySpeed = speed; } @@ -163,7 +163,7 @@ //击退 if (role is not Player) //目标不是玩家才会触发击退 { - var attr = Trigger != null && !Trigger.IsAi ? Weapon.PlayerUseAttribute : Weapon.AiUseAttribute; + var attr = TriggerRoleIsAi ? Weapon.AiUseAttribute : Weapon.PlayerUseAttribute; var repel = Utils.Random.RandomConfigRange(attr.RepelRnage); role.MoveController.AddForce(Vector2.FromAngle(BasisVelocity.Angle()) * repel, repel * 2); } diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index d3ed357..dcaf930 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -43,6 +43,11 @@ /// 攻击目标的碰撞器所属层级, 数据源自于: /// public uint AttackLayer { get; set; } = PhysicsLayer.Wall; + + /// + /// 该角色敌对目标的碰撞器所属层级, 数据源自于: + /// + public uint EnemyLayer { get; set; } = PhysicsLayer.Enemy; /// /// 携带的被动道具包裹 @@ -1181,4 +1186,20 @@ { _rollCoolingTimer = RoleState.RollTime; } + + /// + /// 返回当前角色是否是玩家 + /// + public bool IsPlayer() + { + return this == Player.Current; + } + + /// + /// 是否是玩家的敌人 + /// + public bool IsEnemyWithPlayer() + { + return CollisionWithMask(Player.Current.EnemyLayer); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs index c333c8c..0ff19a3 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs @@ -66,6 +66,7 @@ StateController = AddComponent>(); AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Prop | PhysicsLayer.Player; + EnemyLayer = PhysicsLayer.Player; Camp = CampEnum.Camp2; RoleState.MoveSpeed = 20; diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index 48bec61..906fae8 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -40,6 +40,7 @@ IsAi = false; StateController = AddComponent>(); AttackLayer = PhysicsLayer.Wall | PhysicsLayer.Prop | PhysicsLayer.Enemy; + EnemyLayer = EnemyLayer = PhysicsLayer.Enemy; Camp = CampEnum.Camp1; MaxHp = 6; @@ -142,6 +143,7 @@ if (StateController.CurrState != PlayerStateEnum.Roll) //不能是翻滚状态 { Attack(); + // //测试用,触发房间内地上的武器开火 // var weaponArray = AffiliationArea.FindEnterItems(o => o is Weapon); // foreach (Weapon activityObject in weaponArray) // { diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index 03ab172..24bacb0 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -145,10 +145,19 @@ /// public bool NoMasterCanTrigger { get; set; } = true; - //-------------------------------------------------------------------------------------------- + /// + /// 上一次触发改武器开火的角色是否是Ai + /// + public bool TriggerRoleIsAi { get; private set; } - //触发按下扳机的角色 - private Role _attackTrigger; + /// + /// 上一次触发改武器开火的触发开火攻击的层级, 数据源自于: + /// + public long TriggerRoleAttackLayer { get; private set; } + //-------------------------------------------------------------------------------------------- + + //用于记录当前角色是否按下过扳机 + private bool _triggerRoleFlag = false; //是否按下 private bool _triggerFlag = false; @@ -429,12 +438,13 @@ protected override void Process(float delta) { + //未开火时间 _noAttackTime += delta; //这把武器被扔在地上, 或者当前武器没有被使用 //if (Master == null || Master.WeaponPack.ActiveItem != this) - if (Master != null && Master.WeaponPack.ActiveItem != this) //在背上 + if ((Master != null && Master.WeaponPack.ActiveItem != this) || !_triggerRoleFlag) //在背上, 或者被扔出去了 { //_triggerTimer _triggerTimer = _triggerTimer > 0 ? _triggerTimer - delta : 0; @@ -684,9 +694,22 @@ //这一帧已经按过了, 不需要再按下 if (_triggerFlag) return; - + + //更新武器属性信息 _triggerFlag = true; - _attackTrigger = trigger; + _triggerRoleFlag = true; + if (trigger != null) + { + TriggerRoleIsAi = trigger.IsAi; + TriggerRoleAttackLayer = trigger.AttackLayer; + _weaponAttribute = TriggerRoleIsAi ? _aiWeaponAttribute : _playerWeaponAttribute; + } + else if (Master != null) + { + TriggerRoleIsAi = Master.IsAi; + TriggerRoleAttackLayer = Master.AttackLayer; + _weaponAttribute = TriggerRoleIsAi ? _aiWeaponAttribute : _playerWeaponAttribute; + } //是否第一帧按下 var justDown = _downTimer == 0; @@ -1027,6 +1050,10 @@ /// public uint GetAttackLayer() { + if (TriggerRoleAttackLayer > 0) + { + return (uint)TriggerRoleAttackLayer; + } return Master != null ? Master.AttackLayer : Role.DefaultAttackLayer; } @@ -1703,8 +1730,9 @@ _triggerTimer = 0; } GetParent().RemoveChild(this); - CollisionLayer = _tempLayer; + _triggerRoleFlag = false; _weaponAttribute = _playerWeaponAttribute; + CollisionLayer = _tempLayer; AnimatedSprite.Position = _tempAnimatedSpritePosition; //清除 Ai 拾起标记 RemoveSign(SignNames.AiFindWeaponSign); @@ -1714,14 +1742,8 @@ public void OnPickUpItem() { Pickup(); - if (Master.IsAi) - { - _weaponAttribute = _aiWeaponAttribute; - } - else - { - _weaponAttribute = _playerWeaponAttribute; - } + _triggerRoleFlag = false; + _weaponAttribute = Master.IsAi ? _aiWeaponAttribute : _playerWeaponAttribute; //停止动画 AnimationPlayer.Stop(); //清除泛白效果 @@ -1850,11 +1872,11 @@ deviationAngle = Master.RoleState.CallCalcBulletDeviationAngleEvent(this, deviationAngle); } - var attackLayer = _attackTrigger != null ? _attackTrigger.AttackLayer : GetAttackLayer(); + var attackLayer = GetAttackLayer(); //创建子弹 var bullet = Create(bulletId); bullet.Init( - _attackTrigger, + TriggerRoleIsAi, this, speed, distance, diff --git a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs index b8e288f..0d8ba1c 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/gun/Gun.cs @@ -28,4 +28,17 @@ { ShootBullet(fireRotation, Attribute.BulletId); } + + protected override void OnRemove(Role master) + { + base.OnRemove(master); + + if (master.IsDie && master.IsEnemyWithPlayer()) + { + this.CallDelay(0, () => + { + Trigger(master); + }); + } + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 822e63e..a8ab6dc 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -202,7 +202,7 @@ World = GameApplication.Instance.CreateNewWorld(); yield return 0; //生成地牢房间 - var random = new SeedRandom(); + var random = new SeedRandom(1); _dungeonGenerator = new DungeonGenerator(CurrConfig, random); _dungeonGenerator.Generate(); yield return 0;