fuzzyworld

godot-shooter / commit

Adding rockets and:

bd0825dd9c46206b3984eb6a3d5f09df367d5e03 · Pavel Safronov · 2023-11-09 14:39:48 -0800 · parents 61fbb9f6f8e7

Adding rockets and:
- update Enemy.hurt to match the Player version
- added rocket that trails smoke behind it
- shorted the shooting range, so we're no longer shooting things that are off-screen
- the radar min is now the shooting range value, so things are now either shown with radar, or shot at, but not both
- Player gun creation moved to _ready: for now, treating _ready like init, so initializing stuff there, since this method has access to nodes, unlike the other initializers
- the weapon power-up now changes the laser to the rocket weapon
 Enemy.gd      |   4 +-
 Player.gd     |  11 +++---
 Rocket.gd     |  33 +++++++++++++++++
 Rocket.tscn   | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Weapons.gd    |   5 +++
 World.gd      |   3 +-
 project.godot |   6 +++
 7 files changed, 169 insertions(+), 8 deletions(-)

diff --git a/Enemy.gd b/Enemy.gd
index 84b1d9c..a55f423 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -61,10 +61,10 @@ func turn_towards(pos: Vector2):
 	var change = dir_diff * turn_rate * move_speed
 	velocity = (velocity + change).normalized() * move_speed
 
-func hurt():
+func hurt(damage: int = 1):
 	if dead || is_invincible:
 		return
-	health -= 1
+	health -= damage
 	var smoke = Smoke.instance()
 	var smoke_pos = get_damage_point_on_body()
 	smoke.position = smoke_pos
diff --git a/Player.gd b/Player.gd
index 7f7308c..cec9de3 100644
--- a/Player.gd
+++ b/Player.gd
@@ -8,25 +8,26 @@ export var health = 10
 export var max_health = 10
 export var is_invincible = false
 export var turn_rate = 0.03
-export var shooting_range = 500
+export var shooting_range = 350
 export var shield_active = true
-export var radar_min_radius = 300
+export var radar_min_radius = 350
 export var radar_max_radius = 2000
-#export var shield_restart_period_seconds = 5
 
 onready var radar_sprite = $Graphics/Alive/StaticControls/RadarSprite
 onready var radar_container = $Graphics/Alive/StaticControls/Radar
 const Utils = preload("res://Utils.gd")
 const PopupControl = preload("res://Popup.tscn")
 
-var weapon: Weapon = Weapons.create_basic_gun(1)
+var weapon: Weapon
 var dead = false
-var velocity = Vector2.UP * move_speed
+var velocity: Vector2
 var can_fire = true
 var destination: Vector2
 var is_destination_set = false
 
 func _ready() -> void:
+	velocity= Vector2.UP * move_speed
+	weapon = Weapons.create_basic_gun()
 	if shield_active:
 		enable_shield()
 	else:
diff --git a/Rocket.gd b/Rocket.gd
new file mode 100644
index 0000000..9e4bfd0
--- /dev/null
+++ b/Rocket.gd
@@ -0,0 +1,33 @@
+extends Area2D
+class_name Rocket
+
+const Utils = preload("res://Utils.gd")
+const SmallExplosion = preload("res://SmallExplosion.tscn")
+export var lifetime_seconds = 5
+export var speed = 100
+export var arm_secs = 1
+
+func _ready() -> void:
+#	$AnimationPlayer.play("arming")
+	pass
+
+func _physics_process(delta: float) -> void:
+	position += transform.y * speed * delta
+
+func on_bullet_body_entered(body):
+	var tree = get_tree()
+	var players = tree.get_nodes_in_group("player")
+	var player = players[0]
+	if body != player && body.has_method("hurt"):
+		body.hurt(3)
+		var se = SmallExplosion.instance()
+		get_parent().add_child(se)
+		se.transform = transform
+		queue_free()
+
+
+func _on_LifeTimer_timeout() -> void:
+	var se = SmallExplosion.instance()
+	get_parent().add_child(se)
+	se.transform = transform
+	queue_free()
diff --git a/Rocket.tscn b/Rocket.tscn
new file mode 100644
index 0000000..afb3089
--- /dev/null
+++ b/Rocket.tscn
@@ -0,0 +1,115 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://Rocket.gd" type="Script" id=1]
+[ext_resource path="res://assets/kenney_simple-space/PNG/Default/meteor_squareSmall.png" type="Texture" id=2]
+[ext_resource path="res://assets/kenney_simple-space/PNG/Retina/ship_B.png" type="Texture" id=3]
+
+[sub_resource type="Animation" id=1]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("CollisionPolygon2D:disabled")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ true ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:modulate")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 0, 1, 0.0627451, 1 ) ]
+}
+
+[sub_resource type="Animation" id=2]
+resource_name = "arming"
+tracks/0/type = "value"
+tracks/0/path = NodePath("CollisionPolygon2D:disabled")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 1,
+"values": [ true, false ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:modulate")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 0,
+"values": [ Color( 0, 1, 0.0627451, 1 ), Color( 1, 1, 1, 1 ) ]
+}
+
+[sub_resource type="Curve" id=3]
+_data = [ Vector2( 0, 0.0945946 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]
+
+[sub_resource type="Gradient" id=4]
+interpolation_mode = 2
+offsets = PoolRealArray( 0, 0.995842, 1 )
+colors = PoolColorArray( 0.775391, 0.775391, 0.775391, 1, 0.364706, 0.364706, 0.364706, 0, 1, 1, 1, 0 )
+
+[node name="Rocket" type="Area2D"]
+position = Vector2( 0, -1 )
+script = ExtResource( 1 )
+speed = 200
+
+[node name="Sprite" type="Sprite" parent="."]
+modulate = Color( 0, 1, 0.0627451, 1 )
+rotation = 3.14159
+scale = Vector2( 0.2, 0.2 )
+texture = ExtResource( 3 )
+
+[node name="LifeTimer" type="Timer" parent="."]
+wait_time = 5.0
+one_shot = true
+autostart = true
+
+[node name="ArmedTimer" type="Timer" parent="."]
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
+rotation = 3.14159
+scale = Vector2( 0.2, 0.2 )
+polygon = PoolVector2Array( 0, -30, -16, 16, 0, 32, 16, 16 )
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+anims/RESET = SubResource( 1 )
+anims/arming = SubResource( 2 )
+
+[node name="Particles2D" type="CPUParticles2D" parent="."]
+position = Vector2( 0, -6 )
+amount = 50
+lifetime_randomness = 0.5
+local_coords = false
+texture = ExtResource( 2 )
+emission_shape = 1
+emission_sphere_radius = 0.01
+direction = Vector2( 0, 0 )
+spread = 0.0
+gravity = Vector2( 0, 0 )
+angular_velocity = 212.08
+damping = 5.91
+damping_random = 0.25
+scale_amount = 0.5
+scale_amount_curve = SubResource( 3 )
+color_ramp = SubResource( 4 )
+
+[connection signal="body_entered" from="." to="." method="on_bullet_body_entered"]
+[connection signal="timeout" from="LifeTimer" to="." method="_on_LifeTimer_timeout"]
diff --git a/Weapons.gd b/Weapons.gd
index 8e6a977..a22ea22 100644
--- a/Weapons.gd
+++ b/Weapons.gd
@@ -5,3 +5,8 @@ static func create_basic_gun(period_secs: float = 0.5) -> Weapon:
 	var bullet = preload("res://Bullet.tscn")
 	var weapon = Weapon.new(period_secs, bullet)
 	return weapon
+
+static func create_rocket_gun(period_secs: float = 1) -> Weapon:
+	var rocket = preload("res://Rocket.tscn")
+	var weapon = Weapon.new(period_secs, rocket)
+	return weapon
diff --git a/World.gd b/World.gd
index f953c79..ca0bb31 100644
--- a/World.gd
+++ b/World.gd
@@ -1,6 +1,7 @@
 extends Node2D
 
 const Utils = preload("res://Utils.gd")
+const Weapons = preload("res://Weapons.gd")
 const Enemy = preload("res://Enemy.tscn")
 const PowerUp = preload("res://PowerUp.tscn")
 var width = ProjectSettings.get("display/window/size/width")
@@ -30,7 +31,7 @@ func shield_consumed():
 func gold_consumed():
 	$UI/HUD.score += 5
 func weapon_consumed():
-	$Player.weapon.shot_period_seconds *= 0.8
+	$Player.weapon = Weapons.create_rocket_gun()
 	
 func create_enemy() -> Enemy:
 	var enemy = Enemy.instance()
diff --git a/project.godot b/project.godot
index ef0e9dd..a402a8e 100644
--- a/project.godot
+++ b/project.godot
@@ -39,6 +39,11 @@ _global_script_classes=[ {
 "language": "GDScript",
 "path": "res://PowerUp.gd"
 }, {
+"base": "Area2D",
+"class": "Rocket",
+"language": "GDScript",
+"path": "res://Rocket.gd"
+}, {
 "base": "Node2D",
 "class": "Trails",
 "language": "GDScript",
@@ -56,6 +61,7 @@ _global_script_class_icons={
 "LevelItemGenerator": "",
 "Player": "",
 "PowerUp": "",
+"Rocket": "",
 "Trails": "",
 "Weapon": ""
 }