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;