using Godot; /// <summary> /// 普通的枪 /// </summary> [RegisterWeapon(ActivityIdPrefix.Weapon + "0001", typeof(RifleAttribute))] [RegisterWeapon(ActivityIdPrefix.Weapon + "0003", typeof(PistolAttribute))] [RegisterWeapon(ActivityIdPrefix.Weapon + "0005", typeof(SniperRifleAttribute))] public partial class Gun : Weapon { //步枪属性数据 private class RifleAttribute : WeaponAttribute { public RifleAttribute() { Name = "步枪"; Icon = ResourcePath.resource_sprite_gun_gun4_png; SpriteFrames = ResourcePath.resource_spriteFrames_Weapon0001_tres; Weight = 40; ThrowSpritePosition = new Vector2(0.4f, -2.6f); StartFiringSpeed = 480; StartScatteringRange = 30; FinalScatteringRange = 90; ScatteringRangeAddValue = 2f; ScatteringRangeBackSpeed = 40; //连发 ContinuousShoot = true; AmmoCapacity = 30; StandbyAmmoCapacity = 30 * 3; MaxAmmoCapacity = 30 * 3; //扳机检测间隔 TriggerInterval = 0f; //开火前延时 DelayedTime = 0f; //攻击距离 MinDistance = 300; MaxDistance = 400; //发射子弹数量 MinFireBulletCount = 1; MaxFireBulletCount = 1; //抬起角度 UpliftAngle = 10; //开火位置 FirePosition = new Vector2(21, -3f); //精灵位置 SpritePosition = new Vector2(6, -1); ShellPosition = new Vector2(7.5f, -4.5f); AiUseAttribute = Clone(); AiUseAttribute.AiTargetLockingTime = 0.5f; AiUseAttribute.TriggerInterval = 3f; AiUseAttribute.ContinuousShoot = false; AiUseAttribute.MinContinuousCount = 3; AiUseAttribute.MaxContinuousCount = 3; } } //手枪属性数据 private class PistolAttribute : WeaponAttribute { public PistolAttribute() { Name = "手枪"; Icon = ResourcePath.resource_sprite_gun_gun3_png; SpriteFrames = ResourcePath.resource_spriteFrames_Weapon0003_tres; Weight = 20; ThrowSpritePosition = new Vector2(0.4f, -2.6f); WeightType = WeaponWeightType.DeputyWeapon; StartFiringSpeed = 300; FinalFiringSpeed = 300; StartScatteringRange = 5; FinalScatteringRange = 60; ScatteringRangeAddValue = 8f; ScatteringRangeBackSpeed = 40; ScatteringRangeBackTime = 0.5f; //连发 ContinuousShoot = false; AmmoCapacity = 12; StandbyAmmoCapacity = 72; MaxAmmoCapacity = 72; //扳机检测间隔 TriggerInterval = 0.1f; //连发数量 MinContinuousCount = 1; MaxContinuousCount = 1; //开火前延时 DelayedTime = 0f; //攻击距离 MinDistance = 250; MaxDistance = 300; //发射子弹数量 MinFireBulletCount = 1; MaxFireBulletCount = 1; //抬起角度 UpliftAngle = 20; //开火位置 FirePosition = new Vector2(13, -2); //精灵位置 SpritePosition = new Vector2(5, 0); ShellPosition = new Vector2(5, -3); AiUseAttribute = Clone(); AiUseAttribute.AiTargetLockingTime = 1f; AiUseAttribute.TriggerInterval = 2f; } } //狙击步枪 private class SniperRifleAttribute : WeaponAttribute { public SniperRifleAttribute() { Name = "狙击步枪"; Icon = ResourcePath.resource_sprite_gun_gun3_png; SpriteFrames = ResourcePath.resource_spriteFrames_Weapon0005_tres; Weight = 20; ThrowSpritePosition = new Vector2(0.4f, -2.6f); WeightType = WeaponWeightType.DeputyWeapon; StartFiringSpeed = 60; FinalFiringSpeed = 60; StartScatteringRange = 0; FinalScatteringRange = 20; ScatteringRangeAddValue = 10; ScatteringRangeBackSpeed = 10; //连发 ContinuousShoot = false; AmmoCapacity = 10; StandbyAmmoCapacity = 50; MaxAmmoCapacity = 50; //扳机检测间隔 TriggerInterval = 0.1f; //连发数量 MinContinuousCount = 1; MaxContinuousCount = 1; //开火前延时 DelayedTime = 0f; //攻击距离 MinDistance = 600; MaxDistance = 800; //发射子弹数量 MinFireBulletCount = 1; MaxFireBulletCount = 1; //抬起角度 UpliftAngle = 15; UpliftAngleRestore = 3.5f; //开火位置 FirePosition = new Vector2(28, -3.5f); //精灵位置 SpritePosition = new Vector2(9, 0); ShellPosition = new Vector2(7, -3.5f); MinBacklash = 6; MinBacklash = 8; BacklashRegressionSpeed = 20; ReloadTime = 3.5f; AiUseAttribute = Clone(); AiUseAttribute.AiTargetLockingTime = 1f; AiUseAttribute.TriggerInterval = 2f; } } protected override void OnFire() { //创建一个弹壳 ThrowShell("0001"); if (Master == Player.Current) { //创建抖动 GameCamera.Main.DirectionalShake(Vector2.Right.Rotated(GlobalRotation) * 2f); } //创建开火特效 var packedScene = ResourceManager.Load<PackedScene>(ResourcePath.prefab_effect_ShotFire_tscn); var sprite = packedScene.Instantiate<Sprite2D>(); sprite.GlobalPosition = FirePoint.GlobalPosition; sprite.GlobalRotation = FirePoint.GlobalRotation; sprite.AddToActivityRoot(RoomLayerEnum.YSortLayer); //播放射击音效 SoundManager.PlaySoundEffectPosition(ResourcePath.resource_sound_sfx_ordinaryBullet2_mp3, GameApplication.Instance.ViewToGlobalPosition(GlobalPosition), -8); } protected override void OnShoot(float fireRotation) { //创建子弹 var bullet = ActivityObject.Create<Bullet>(Attribute.BulletId); bullet.Init( this, 350, Utils.RandomRangeFloat(Attribute.MinDistance, Attribute.MaxDistance), FirePoint.GlobalPosition, fireRotation, GetAttackLayer() ); bullet.PutDown(RoomLayerEnum.YSortLayer); } }