godot-shooter / commit
Changed how bullets now know the shooter and won't collide with that body.
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