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;