fuzzyworld

godot-shooter / commit

Changed how bullets now know the shooter and won't collide with that body.

636e5224ec8442e6d9e043101c813bea95f4f4bc · Pavel Safronov · 2023-12-01 13:11:41 -0800 · parents 8a97e8453b49

Changed how bullets now know the shooter and won't collide with that body.
Fixed some issues with the game being playable after it is finished.
 actors/Player.gd    |  5 +++++
 actors/Player.tscn  |  1 +
 scenes/HUD.gd       |  3 +++
 scenes/World.gd     |  7 ++++++-
 weapons/Bullet.gd   | 15 ++++-----------
 weapons/Bullet.tscn |  3 ---
 weapons/Rocket.gd   | 10 ++++++----
 weapons/Weapon.gd   |  1 +
 8 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/actors/Player.gd b/actors/Player.gd
index beea228..86f4213 100644
--- a/actors/Player.gd
+++ b/actors/Player.gd
@@ -288,3 +288,8 @@ func clear_destination() -> void:
 func _on_StartNewGameButton_pressed() -> void:
 	get_tree().paused = false
 	restart()
+
+
+func _on_Button_pressed() -> void:
+	var _err = get_tree().reload_current_scene()
+	get_tree().paused = false	
diff --git a/actors/Player.tscn b/actors/Player.tscn
index e84a2e9..0b5c15d 100644
--- a/actors/Player.tscn
+++ b/actors/Player.tscn
@@ -385,3 +385,4 @@ radius = 35.0
 [connection signal="pressed" from="UI/PauseMenu/CenterContainer/PanelContainer/VBoxContainer/TabContainer/Pref/ShowItemsInRadarCheckBox" to="." method="_on_ShowItemsInRadarCheckBox_pressed"]
 [connection signal="pressed" from="UI/PauseMenu/CenterContainer/PanelContainer/VBoxContainer/TabContainer/About/LinkButton" to="." method="_on_LinkButton_pressed"]
 [connection signal="pressed" from="UI/PauseMenu/CenterContainer/PanelContainer/VBoxContainer/ResumeButton" to="." method="_on_ResumeButton_pressed"]
+[connection signal="pressed" from="UI/GameFinishedMenu/CenterContainer/PanelContainer/VBoxContainer/Button" to="." method="_on_Button_pressed"]
diff --git a/scenes/HUD.gd b/scenes/HUD.gd
index 108cc55..1bf775e 100644
--- a/scenes/HUD.gd
+++ b/scenes/HUD.gd
@@ -3,6 +3,7 @@ extends Control
 const Utils = preload("res://utils/Utils.gd")
 export var score = 0
 export var objective = "0/5"
+export var is_game_over = false
 var is_dragging = false
 signal paused
 signal debug_signal
@@ -16,6 +17,8 @@ onready var weapon_label = $MarginContainer2/HBoxContainer/Weapon
 onready var ammo_label = $MarginContainer2/HBoxContainer/Ammo
 
 func _input(event: InputEvent) -> void:
+	if is_game_over:
+		return
 	var nodes = get_tree().get_nodes_in_group("pause_menu")
 	var is_pause_menu_open = false
 	for n in nodes:
diff --git a/scenes/World.gd b/scenes/World.gd
index 9a7513a..bc7debe 100644
--- a/scenes/World.gd
+++ b/scenes/World.gd
@@ -23,6 +23,7 @@ var completed_objectives = 0
 var max_objectives = 5
 var item_replacement_distance = 2000
 var is_dragging = false
+var is_game_over = false
 
 func enemy_killed(_position: Vector2):
 	player.score += 5
@@ -147,6 +148,9 @@ func _input(_event: InputEvent) -> void:
 		return
 
 func _process(_delta: float) -> void:
+	if is_game_over:
+		return
+	
 	# move navigation polygon around the player, navigation won't work outside of this polygon
 	var nav_size = Vector2(item_replacement_distance * 2 * 5, item_replacement_distance * 2 * 5)
 	var nav_pos = player.global_position - (nav_size * 0.5)
@@ -168,12 +172,13 @@ func _process(_delta: float) -> void:
 	# if all objectives are complete, show the game finished menu
 	var all_done = completed_objectives == max_objectives
 	if all_done:
+		is_game_over = true
 		var score = player.score
 		player.add_high_score(score)
 		var final_message = "You won with %s points!" % score
-		var _err = ($Player/UI/GameFinishedMenu.find_node("Button") as Button).connect("pressed", self, "restart")
 		$Player/UI/GameFinishedMenu.find_node("Label").text = final_message
 		$Player/UI/GameFinishedMenu.show()
+		$Player/UI/HUD.is_game_over = true
 		get_tree().paused = true
 		return
 
diff --git a/weapons/Bullet.gd b/weapons/Bullet.gd
index 1038ed9..b94a95f 100644
--- a/weapons/Bullet.gd
+++ b/weapons/Bullet.gd
@@ -8,15 +8,11 @@ const Constants = preload("res://utils/Constants.gd")
 export var lifetime_seconds = 1.5
 export var speed = Constants.SPEED * 5
 export var damage_amount = 1
-export var arm_period_seconds = .05
-
-var is_armed = false
+export var shooter_rid = 0
 
 func _ready() -> void:
 	$Timer.wait_time = lifetime_seconds
 	$Timer.start()
-	$ArmTimer.wait_time = arm_period_seconds
-	$ArmTimer.start()
 
 func _physics_process(delta: float) -> void:
 	position += transform.y * speed * delta
@@ -25,7 +21,9 @@ func on_expiration():
 	queue_free()
 
 func on_bullet_body_entered(body):
-	if not is_armed:
+	var body_id = (body as Node2D).get_instance_id()
+	var body_is_shooter = shooter_rid != 0 and shooter_rid == body_id
+	if body_is_shooter:
 		return
 	if body.has_method("hurt"):
 		body.hurt(damage_amount)
@@ -33,8 +31,3 @@ func on_bullet_body_entered(body):
 		get_parent().add_child(se)
 		se.transform = transform
 		queue_free()
-
-
-func _on_ArmTimer_timeout() -> void:
-	is_armed = true
-	pass # Replace with function body.
diff --git a/weapons/Bullet.tscn b/weapons/Bullet.tscn
index bd15d68..d91788d 100644
--- a/weapons/Bullet.tscn
+++ b/weapons/Bullet.tscn
@@ -28,8 +28,5 @@ shape = SubResource( 1 )
 one_shot = true
 autostart = true
 
-[node name="ArmTimer" type="Timer" parent="."]
-
 [connection signal="body_entered" from="." to="." method="on_bullet_body_entered"]
 [connection signal="timeout" from="Timer" to="." method="on_expiration"]
-[connection signal="timeout" from="ArmTimer" to="." method="_on_ArmTimer_timeout"]
diff --git a/weapons/Rocket.gd b/weapons/Rocket.gd
index e564ce4..cc8ec8c 100644
--- a/weapons/Rocket.gd
+++ b/weapons/Rocket.gd
@@ -9,6 +9,7 @@ export var lifetime_seconds = 5
 export var speed = Constants.SPEED * 3
 export var arm_secs = 1
 export var damage_amount = 2
+export var shooter_rid = 0
 var is_dead = false
 
 func _ready() -> void:
@@ -19,10 +20,11 @@ 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"):
+	var body_id = (body as Node2D).get_instance_id()
+	var body_is_shooter = shooter_rid != 0 and shooter_rid == body_id
+	if body_is_shooter:
+		return
+	if body.has_method("hurt"):
 		body.hurt(damage_amount)
 		var se = SmallExplosion.instance()
 		get_parent().add_child(se)
diff --git a/weapons/Weapon.gd b/weapons/Weapon.gd
index f94ad0c..2d4e5f1 100644
--- a/weapons/Weapon.gd
+++ b/weapons/Weapon.gd
@@ -37,4 +37,5 @@ func try_shoot(shooter: Node2D, target: Vector2) -> void:
 	particle_instance.transform = shooter.global_transform
 	particle_instance.damage_amount = self.damage_amount
 	particle_instance.global_rotation = shooter.global_position.angle_to_point(target) + PI / 2.0
+	particle_instance.shooter_rid = shooter.get_instance_id()
 	last_shoot_time = now