Add weapon knockback, improve recovery

main
copygirl 4 years ago
parent bcdfe45cc3
commit e835057241
  1. 14
      scene/Player.tscn
  2. 16
      src/Items/Weapon.cs

@ -67,18 +67,17 @@ visible = false
texture = ExtResource( 7 ) texture = ExtResource( 7 )
offset = Vector2( 8, 0 ) offset = Vector2( 8, 0 )
script = ExtResource( 8 ) script = ExtResource( 8 )
Knockback = 50.0
Spread = 3.0 Spread = 3.0
SpreadIncrease = 1.0 SpreadIncrease = 1.0
RecoilMin = 3.0 RecoilMin = 3.0
RecoilMax = 5.0 RecoilMax = 5.0
RecoilRegen = 16.0
[node name="Tip" type="Node2D" parent="Items/Revolver"] [node name="Tip" type="Node2D" parent="Items/Revolver"]
position = Vector2( 15, -2.5 ) position = Vector2( 15, -2.5 )
[node name="Fire" type="AudioStreamPlayer2D" parent="Items/Revolver"] [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Revolver"]
stream = ExtResource( 14 ) stream = ExtResource( 14 )
attenuation = 1.0
[node name="Shotgun" type="Sprite" parent="Items"] [node name="Shotgun" type="Sprite" parent="Items"]
visible = false visible = false
@ -87,19 +86,17 @@ offset = Vector2( 8, 0 )
script = ExtResource( 8 ) script = ExtResource( 8 )
EffectiveRange = 240 EffectiveRange = 240
MaximumRange = 360 MaximumRange = 360
Knockback = 135.0
Spread = 14.0 Spread = 14.0
SpreadIncrease = 20.0 SpreadIncrease = 20.0
SpreadRegen = 16.0
RecoilMin = 6.0 RecoilMin = 6.0
RecoilMax = 12.0 RecoilMax = 12.0
RecoilRegen = 8.0
[node name="Tip" type="Node2D" parent="Items/Shotgun"] [node name="Tip" type="Node2D" parent="Items/Shotgun"]
position = Vector2( 22, -1.5 ) position = Vector2( 22, -1.5 )
[node name="Fire" type="AudioStreamPlayer2D" parent="Items/Shotgun"] [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Shotgun"]
stream = ExtResource( 13 ) stream = ExtResource( 13 )
attenuation = 1.0
[node name="Rifle" type="Sprite" parent="Items"] [node name="Rifle" type="Sprite" parent="Items"]
visible = false visible = false
@ -108,27 +105,25 @@ offset = Vector2( 8, 0 )
script = ExtResource( 8 ) script = ExtResource( 8 )
EffectiveRange = 480 EffectiveRange = 480
MaximumRange = 920 MaximumRange = 920
Knockback = 100.0
SpreadIncrease = 2.0 SpreadIncrease = 2.0
SpreadRegen = 2.0
RecoilMin = 8.0 RecoilMin = 8.0
RecoilMax = 8.0 RecoilMax = 8.0
RecoilRegen = 8.0
[node name="Tip" type="Node2D" parent="Items/Rifle"] [node name="Tip" type="Node2D" parent="Items/Rifle"]
position = Vector2( 24, -1.5 ) position = Vector2( 24, -1.5 )
[node name="Fire" type="AudioStreamPlayer2D" parent="Items/Rifle"] [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Rifle"]
stream = ExtResource( 15 ) stream = ExtResource( 15 )
attenuation = 1.0
[node name="Assault Rifle" type="Sprite" parent="Items"] [node name="Assault Rifle" type="Sprite" parent="Items"]
visible = false visible = false
texture = ExtResource( 12 ) texture = ExtResource( 12 )
offset = Vector2( 8, 0 ) offset = Vector2( 8, 0 )
script = ExtResource( 8 ) script = ExtResource( 8 )
Knockback = 30.0
Spread = 1.0 Spread = 1.0
SpreadIncrease = 1.2 SpreadIncrease = 1.2
SpreadRegen = 5.0
RecoilMin = 1.0 RecoilMin = 1.0
RecoilMax = 2.5 RecoilMax = 2.5
@ -137,7 +132,6 @@ position = Vector2( 22, -1.5 )
[node name="Fire" type="AudioStreamPlayer2D" parent="Items/Assault Rifle"] [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Assault Rifle"]
stream = ExtResource( 16 ) stream = ExtResource( 16 )
attenuation = 1.0
[node name="Super Soaker" type="Sprite" parent="Items"] [node name="Super Soaker" type="Sprite" parent="Items"]
visible = false visible = false

@ -1,19 +1,17 @@
using System;
using Godot; using Godot;
public class Weapon : Sprite public class Weapon : Sprite
{ {
[Export] public int EffectiveRange { get; set; } = 320; [Export] public int EffectiveRange { get; set; } = 320;
[Export] public int MaximumRange { get; set; } = 640; [Export] public int MaximumRange { get; set; } = 640;
[Export] public float Knockback { get; set; } = 0.0F;
[Export] public float Spread { get; set; } = 0.0F; [Export] public float Spread { get; set; } = 0.0F;
[Export] public float SpreadIncrease { get; set; } = 0.0F; [Export] public float SpreadIncrease { get; set; } = 0.0F;
[Export] public float SpreadRegen { get; set; } = 10.0F;
[Export] public float RecoilMin { get; set; } = 0.0F; [Export] public float RecoilMin { get; set; } = 0.0F;
[Export] public float RecoilMax { get; set; } = 0.0F; [Export] public float RecoilMax { get; set; } = 0.0F;
[Export] public float RecoilRegen { get; set; } = 10.0F;
// TODO: Make the Regen multiplicative instead of substractive?
public Cursor Cursor { get; private set; } public Cursor Cursor { get; private set; }
@ -33,7 +31,7 @@ public class Weapon : Sprite
public override void _UnhandledInput(InputEvent ev) public override void _UnhandledInput(InputEvent ev)
{ {
if (!(Player is LocalPlayer)) return; if (!(Player is LocalPlayer localPlayer)) return;
if (ev.IsActionPressed("interact_primary")) { if (ev.IsActionPressed("interact_primary")) {
GetNodeOrNull<AudioStreamPlayer2D>("Fire")?.Play(); GetNodeOrNull<AudioStreamPlayer2D>("Fire")?.Play();
@ -41,13 +39,17 @@ public class Weapon : Sprite
// TODO: Tell server (and other clients) we shot. // TODO: Tell server (and other clients) we shot.
_currentSpreadInc += Mathf.Deg2Rad(SpreadIncrease); _currentSpreadInc += Mathf.Deg2Rad(SpreadIncrease);
_currentRecoil += Mathf.Deg2Rad((float)GD.RandRange(RecoilMin, RecoilMax)); _currentRecoil += Mathf.Deg2Rad((float)GD.RandRange(RecoilMin, RecoilMax));
localPlayer.Velocity -= Mathf.Polar2Cartesian(Knockback, Rotation);
} }
} }
public override void _Process(float delta) public override void _Process(float delta)
{ {
_currentSpreadInc = Mathf.Max(0, _currentSpreadInc - Mathf.Deg2Rad(SpreadRegen) * delta); var spreadDecrease = Mathf.Max(Mathf.Tau / 300, _currentSpreadInc * 2);
_currentRecoil = Mathf.Max(0, _currentRecoil - Mathf.Deg2Rad(RecoilRegen) * delta); var recoilDecrease = Mathf.Max(Mathf.Tau / 800, _currentRecoil * 2);
_currentSpreadInc = Mathf.Max(0, _currentSpreadInc - spreadDecrease * delta);
_currentRecoil = Mathf.Max(0, _currentRecoil - recoilDecrease * delta);
if (Visible && (Player is LocalPlayer)) { if (Visible && (Player is LocalPlayer)) {
AimDirection = Cursor.Position.AngleToPoint(Player.Position); AimDirection = Cursor.Position.AngleToPoint(Player.Position);

Loading…
Cancel
Save