diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json index 1685213..131108d 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/Preinstall.json @@ -1 +1 @@ -[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":8,"Y":19},"Size":{"X":83,"Y":73},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":11,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":19,"Y":2},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":10,"Y":22},"Size":{"X":0,"Y":0},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":11,"Y":38},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"prop0003","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-15,"Y":31},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.5,"MarkList":[{"Id":"prop5000","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":36,"Y":36},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"prop5001","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":35,"Y":2},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1.5,"MarkList":[{"Id":"prop0002","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-12,"Y":3},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json index 03f3578..22e1c00 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start1/TileInfo.json @@ -1 +1 @@ -{"NavigationList":[{"Type":0,"Points":[-56,-40,72,-40,72,80,-56,80]}],"Floor":[1,4,0,0,8,1,3,0,0,8,1,2,0,0,8,1,1,0,0,8,1,0,0,0,8,1,-1,0,0,8,1,-2,0,0,8,1,-3,0,0,8,2,4,0,0,8,2,3,0,0,8,2,2,0,0,8,2,1,0,0,8,2,0,0,0,8,2,-1,0,0,8,2,-2,0,0,8,2,-3,0,0,8,3,4,0,0,8,3,3,0,0,8,3,2,0,0,8,3,1,0,0,8,3,0,0,0,8,3,-1,0,0,8,3,-2,0,0,8,3,-3,0,0,8,4,4,0,0,8,4,3,0,0,8,4,2,0,0,8,4,1,0,0,8,4,0,0,0,8,4,-1,0,0,8,4,-2,0,0,8,4,-3,0,0,8,0,4,0,0,8,0,3,0,0,8,0,2,0,0,8,0,1,0,0,8,0,0,0,0,8,0,-1,0,0,8,0,-2,0,0,8,0,-3,0,0,8,-1,4,0,0,8,-1,3,0,0,8,-1,2,0,0,8,-1,1,0,0,8,-1,0,0,0,8,-1,-1,0,0,8,-1,-2,0,0,8,-1,-3,0,0,8,-2,4,0,0,8,-2,3,0,0,8,-2,2,0,0,8,-2,1,0,0,8,-2,0,0,0,8,-2,-1,0,0,8,-2,-2,0,0,8,-2,-3,0,0,8,-3,4,0,0,8,-3,3,0,0,8,-3,2,0,0,8,-3,1,0,0,8,-3,0,0,0,8,-3,-1,0,0,8,-3,-2,0,0,8,-3,-3,0,0,8,-4,4,0,0,8,-4,3,0,0,8,-4,2,0,0,8,-4,1,0,0,8,-4,0,0,0,8,-4,-1,0,0,8,-4,-2,0,0,8,-4,-3,0,0,8],"Middle":[-4,-4,0,2,7,-3,-4,0,2,7,-2,-4,0,2,7,-1,-4,0,2,7,0,-4,0,2,7,1,-4,0,2,7,2,-4,0,2,7,3,-4,0,2,7,4,-4,0,2,7],"Top":[-5,-4,0,3,4,-5,-3,0,3,3,-5,-2,0,3,3,-5,-1,0,3,3,-5,0,0,3,3,-5,1,0,3,3,-5,2,0,3,3,-5,3,0,3,3,-5,4,0,3,3,-5,5,0,11,2,-4,5,0,2,2,-3,5,0,2,2,-2,5,0,2,2,-1,5,0,2,2,0,5,0,2,2,1,5,0,2,2,2,5,0,2,2,3,5,0,2,2,4,5,0,2,2,5,-4,0,1,4,5,-3,0,1,3,5,-2,0,1,3,5,-1,0,1,3,5,0,0,1,3,5,1,0,1,3,5,2,0,1,3,5,3,0,1,3,5,4,0,1,3,5,5,0,13,2]} \ No newline at end of file +{"NavigationList":[{"Type":0,"Points":[-56,-40,72,-40,72,80,-56,80]}],"Floor":[-4,-3,0,0,8,-4,-2,0,0,8,-4,-1,0,0,8,-4,0,0,0,8,-4,1,0,0,8,-4,2,0,0,8,-4,3,0,0,8,-4,4,0,0,8,-3,-3,0,0,8,-3,-2,0,0,8,-3,-1,0,0,8,-3,0,0,0,8,-3,1,0,0,8,-3,2,0,0,8,-3,3,0,0,8,-3,4,0,0,8,-2,-3,0,0,8,-2,-2,0,0,8,-2,-1,0,0,8,-2,0,0,0,8,-2,1,0,0,8,-2,2,0,0,8,-2,3,0,0,8,-2,4,0,0,8,-1,-3,0,0,8,-1,-2,0,0,8,-1,-1,0,0,8,-1,0,0,0,8,-1,1,0,0,8,-1,2,0,0,8,-1,3,0,0,8,-1,4,0,0,8,0,-3,0,0,8,0,-2,0,0,8,0,-1,0,0,8,0,0,0,0,8,0,1,0,0,8,0,2,0,0,8,0,3,0,0,8,0,4,0,0,8,4,-3,0,0,8,4,-2,0,0,8,4,-1,0,0,8,4,0,0,0,8,4,1,0,0,8,4,2,0,0,8,4,3,0,0,8,4,4,0,0,8,3,-3,0,0,8,3,-2,0,0,8,3,-1,0,0,8,3,0,0,0,8,3,1,0,0,8,3,2,0,0,8,3,3,0,0,8,3,4,0,0,8,2,-3,0,0,8,2,-2,0,0,8,2,-1,0,0,8,2,0,0,0,8,2,1,0,0,8,2,2,0,0,8,2,3,0,0,8,2,4,0,0,8,1,-3,0,0,8,1,-2,0,0,8,1,-1,0,0,8,1,0,0,0,8,1,1,0,0,8,1,2,0,0,8,1,3,0,0,8,1,4,0,0,8],"Middle":[-4,-4,0,2,7,-3,-4,0,2,7,-2,-4,0,2,7,-1,-4,0,2,7,0,-4,0,2,7,1,-4,0,2,7,2,-4,0,2,7,3,-4,0,2,7,4,-4,0,2,7],"Top":[-5,-4,0,3,4,-5,-3,0,3,3,-5,-2,0,3,3,-5,-1,0,3,3,-5,0,0,3,3,-5,1,0,3,3,-5,2,0,3,3,-5,3,0,3,3,-5,4,0,3,3,-5,5,0,11,2,-4,5,0,2,2,-3,5,0,2,2,-2,5,0,2,2,-1,5,0,2,2,0,5,0,2,2,1,5,0,2,2,2,5,0,2,2,3,5,0,2,2,4,5,0,2,2,5,-4,0,1,4,5,-3,0,1,3,5,-2,0,1,3,5,-1,0,1,3,5,0,0,1,3,5,1,0,1,3,5,2,0,1,3,5,3,0,1,3,5,4,0,1,3,5,5,0,13,2]} \ 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 28d9bfa..bfba9fb 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/Bullet.cs @@ -41,7 +41,17 @@ //当前子弹已经飞行的距离 private float CurrFlyDistance = 0; - public void Init(Weapon weapon, float speed, float maxDistance, Vector2 position, float rotation, uint targetLayer) + /// + /// 初始化子弹属性 + /// + /// 触发开火的角色 + /// 射出该子弹的武器 + /// 速度 + /// 最大飞行距离 + /// 位置 + /// 角度 + /// 攻击目标层级 + public void Init(Role trigger,Weapon weapon, float speed, float maxDistance, Vector2 position, float rotation, uint targetLayer) { Weapon = weapon; Role = weapon.Master; @@ -49,13 +59,13 @@ CollisionArea.AreaEntered += OnArea2dEntered; //只有玩家使用该武器才能获得正常速度的子弹 - if (weapon.Master is Player) + if (trigger != null && !trigger.IsAi) { FlySpeed = speed; } else { - FlySpeed = speed * weapon.Attribute.AiBulletSpeedScale; + FlySpeed = speed * weapon.AiUseAttribute.AiBulletSpeedScale; } MaxDistance = maxDistance; Position = position; diff --git a/DungeonShooting_Godot/src/game/activity/role/Player.cs b/DungeonShooting_Godot/src/game/activity/role/Player.cs index ad22cfb..a4f3640 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Player.cs @@ -105,6 +105,11 @@ if (InputManager.Fire) //开火 { Attack(); + // var weaponArray = AffiliationArea.FindEnterItems(o => o is Weapon); + // foreach (Weapon activityObject in weaponArray) + // { + // activityObject.Trigger(this); + // } } if (InputManager.UseActiveProp) //使用道具 diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index 23604aa..1221d33 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -844,7 +844,7 @@ { if (WeaponPack.ActiveItem != null) { - WeaponPack.ActiveItem.Trigger(); + WeaponPack.ActiveItem.Trigger(this); } } diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index 484d734..f8d877d 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -9,9 +9,15 @@ public abstract partial class Weapon : ActivityObject, IPackageItem { /// - /// 武器属性数据 + /// 武器使用的属性数据, 该属性会根据是否是玩家使用武器, 如果是Ai使用武器, 则会返回 AiUseAttribute 的属性对象 /// public ExcelConfig.Weapon Attribute => _weaponAttribute; + + /// + /// Ai使用该武器的属性 + /// + public ExcelConfig.Weapon AiUseAttribute => _aiWeaponAttribute; + private ExcelConfig.Weapon _weaponAttribute; private ExcelConfig.Weapon _playerWeaponAttribute; private ExcelConfig.Weapon _aiWeaponAttribute; @@ -131,6 +137,9 @@ //-------------------------------------------------------------------------------------------- + //触发按下扳机的角色 + private Role _attackTrigger; + //是否按下 private bool _triggerFlag = false; @@ -287,7 +296,7 @@ /// 发射子弹时调用的函数, 每发射一枚子弹调用一次, /// 如果做霰弹武器效果, 一次开火发射5枚子弹, 则该函数调用5次 /// - /// 开火时枪口旋转角度 + /// 开火时枪口旋转角度, 弧度制 protected abstract void OnShoot(float fireRotation); /// @@ -606,7 +615,7 @@ if (!_looseShootFlag && _continuousCount > 0 && _delayedTime <= 0 && _attackTimer <= 0) { //连发开火 - TriggerFire(); + TriggerFire(_attackTrigger); //连发最后一发打完了 if (Attribute.ManualBeLoaded && _continuousCount <= 0) { @@ -647,21 +656,25 @@ { return Master == null && GetParent() == GameApplication.Instance.World.NormalLayer; } - + /// /// 扳机函数, 调用即视为按下扳机 /// - public void Trigger() + /// 按下扳机的角色, 如果传 null, 则视为走火 + public void Trigger(Role trigger) { //这一帧已经按过了, 不需要再按下 if (_triggerFlag) return; + _triggerFlag = true; + _attackTrigger = trigger; + //是否第一帧按下 var justDown = _downTimer == 0; if (_beLoadedState == 0 || _beLoadedState == -1) //需要执行上膛操作 { - if (justDown && !Reloading) + if (justDown && !Reloading && Master != null) { if (CurrAmmo <= 0) { @@ -731,7 +744,7 @@ else if (CurrAmmo <= 0) //子弹不够 { fireFlag = false; - if (justDown) + if (justDown && Master != null) { //第一帧按下, 触发换弹 Reload(); @@ -767,7 +780,7 @@ else { //开火 - TriggerFire(); + TriggerFire(_attackTrigger); //非连射模式 if (!Attribute.ContinuousShoot && Attribute.ManualBeLoaded && _continuousCount <= 0) @@ -783,8 +796,6 @@ } } - - _triggerFlag = true; } /// @@ -845,7 +856,7 @@ _looseShootFlag = false; if (_chargeTime >= Attribute.MinChargeTime) //判断蓄力是否够了 { - TriggerFire(); + TriggerFire(_attackTrigger); //非连射模式 if (!Attribute.ContinuousShoot && Attribute.ManualBeLoaded && _continuousCount <= 0) { @@ -866,7 +877,7 @@ /// /// 触发开火 /// - private void TriggerFire() + private void TriggerFire(Role trigger) { _noAttackTime = 0; @@ -931,11 +942,15 @@ if (Master != null) { bulletCount = Master.RoleState.CallCalcBulletCountEvent(this, bulletCount); - fireRotation += Mathf.DegToRad(Master.MountPoint.RealRotationDegrees); + fireRotation += Master.MountPoint.RealRotation; + } + else + { + fireRotation += GlobalRotation; } //创建子弹 - for (int i = 0; i < bulletCount; i++) + for (var i = 0; i < bulletCount; i++) { //发射子弹 OnShoot(fireRotation); @@ -946,16 +961,23 @@ //武器的旋转角度 tempAngle -= Attribute.UpliftAngle; - RotationDegrees = tempAngle; _fireAngle = tempAngle; - //武器身位置 - var max = Mathf.Abs(Mathf.Max(Attribute.MaxBacklash, Attribute.MinBacklash)); - _currBacklashLength = Mathf.Clamp( - _currBacklashLength - Utils.Random.RandomRangeFloat(Attribute.MinBacklash, Attribute.MaxBacklash), - -max, max - ); - Position = new Vector2(_currBacklashLength, 0).Rotated(Rotation); + if (Master != null) //是否被拾起 + { + //武器身位置 + var max = Mathf.Abs(Mathf.Max(Attribute.MaxBacklash, Attribute.MinBacklash)); + _currBacklashLength = Mathf.Clamp( + _currBacklashLength - Utils.Random.RandomRangeFloat(Attribute.MinBacklash, Attribute.MaxBacklash), + -max, max + ); + Position = new Vector2(_currBacklashLength, 0).Rotated(Rotation); + RotationDegrees = tempAngle; + } + else + { + + } } /// @@ -1721,10 +1743,19 @@ /// protected ActivityObject ThrowShell(string shellId, float speedScale = 1) { - var shellPosition = (Master != null ? Master.MountPoint.Position : Position) + ShellPoint.Position; var startPos = ShellPoint.GlobalPosition; - var startHeight = -shellPosition.Y; - startPos.Y += startHeight; + float startHeight; + if (Master != null) + { + var shellPosition = (Master != null ? Master.MountPoint.Position : Position) + ShellPoint.Position; + startHeight = -shellPosition.Y; + startPos.Y += startHeight; + } + else + { + startHeight = Altitude; + } + var direction = GlobalRotationDegrees + Utils.Random.RandomRangeInt(-30, 30) + 180; var verticalSpeed = Utils.Random.RandomRangeInt((int)(60 * speedScale), (int)(120 * speedScale)); var velocity = new Vector2(Utils.Random.RandomRangeInt((int)(20 * speedScale), (int)(60 * speedScale)), 0).Rotated(direction * Mathf.Pi / 180); @@ -1760,15 +1791,18 @@ distance = Master.RoleState.CallCalcBulletDistanceEvent(this, distance); deviationAngle = Master.RoleState.CallCalcBulletDeviationAngleEvent(this, deviationAngle); } + + var attackLayer = _attackTrigger != null ? _attackTrigger.AttackLayer : GetAttackLayer(); //创建子弹 var bullet = Create(bulletId); bullet.Init( + _attackTrigger, this, speed, distance, FirePoint.GlobalPosition, fireRotation + Mathf.DegToRad(deviationAngle), - GetAttackLayer() + attackLayer ); bullet.MinHarm = Attribute.BulletMinHarm; bullet.MaxHarm = Attribute.BulletMaxHarm;