a game about throwing hammers made for the github game off
better hammer hitting
anticrash not included because godot thought it would like to crash if i included it
bendn 2022-12-01
parent b8af37b · commit bd940d0
-rw-r--r--hammers/hammer.gd50
-rw-r--r--hammers/hammer_01.tscn4
-rw-r--r--hammers/hammer_02.tscn4
-rw-r--r--hammers/hammer_03.tscn12
-rw-r--r--hammers/hammer_base.tscn5
-rw-r--r--player/player.gd5
6 files changed, 48 insertions, 32 deletions
diff --git a/hammers/hammer.gd b/hammers/hammer.gd
index c25a706..86db072 100644
--- a/hammers/hammer.gd
+++ b/hammers/hammer.gd
@@ -19,11 +19,22 @@ var direction := Vector2.ZERO
## The amount it can turn towards its target
@export var steer_force = 0.05
-## To hit the player
-@export var hit_player := true
-
-## To hit the enemys
-@export var hit_enemys := false
+## The hit enum.
+enum HITS {_a, _b, _c, PLAYER, ENEMY, NONE}
+
+## Pick which layers to hit.
+@export var hits: HITS = HITS.PLAYER:
+ set(value):
+ set_collision_mask_value(hits, false)
+ target_finder.set_collision_mask_value(hits, false)
+ hits = value
+ hitbox.monitoring = hits != HITS.NONE
+ if value == HITS.NONE:
+ return
+ set_collision_mask_value(hits, true)
+ target_finder.set_collision_mask_value(hits, true)
+ target_finder.monitoring = not is_instance_valid(target)
+ hitbox.collision_mask = target_finder.collision_mask
## The amount of time before gravity kicks in.
@export var lifetime := 3.0
@@ -34,6 +45,7 @@ var direction := Vector2.ZERO
## The target
var target: Node2D = null
+@onready var head := $Head as Marker2D
@onready var trail := $Trail as Trail2D
@onready var outline_shader := ($Sprite as Sprite2D).material as ShaderMaterial
@onready var target_finder := $TargetFinder as Area2D
@@ -41,30 +53,30 @@ var target: Node2D = null
func _ready() -> void:
- set_masks()
-
-
-## Sets the collision masks.
-func set_masks() -> void:
- set_collision_mask_value(3, hit_player)
- set_collision_mask_value(4, hit_enemys)
- target_finder.set_collision_mask_value(3, hit_player)
- target_finder.set_collision_mask_value(4, hit_enemys)
- hitbox.collision_mask = target_finder.collision_mask
- target_finder.monitoring = not is_instance_valid(target)
- hitbox.monitoring = hit_player || hit_enemys
+ hits = hits
## Moves the direction towards the target.
func seek() -> void:
if is_instance_valid(target):
direction = lerp(
- direction, global_position.direction_to(target.global_position), steer_force * clampf(lifetime, 0, 1)
+ direction, head.global_position.direction_to(target.global_position), steer_force * clampf(lifetime, 0, 1)
)
elif target_finder.monitoring == false:
target = null
target_finder.monitoring = true
+# func anticrash() -> void:
+# var space := get_world_2d().direct_space_state
+# var param := PhysicsRayQueryParameters2D.create(head.global_position, head.global_position + (direction * 10), pow(2, 1-1) + pow(2, hits - 1))
+# var result := space.intersect_ray(param)
+# if result.is_empty() or result.collider is Player or result.collider is Enemy:
+# return
+# direction = lerp(
+# direction,
+# direction.bounce(head.global_position.direction_to(result.position)),
+# steer_force * clampf(lifetime, 0, 1)
+# )
## Highlights this hammer. See also [method unhighlight].
func highlight() -> void:
@@ -82,6 +94,7 @@ func _physics_process(delta: float) -> void:
velocity.y += grav * delta
else:
seek()
+# anticrash()
velocity += (direction * acceleration * delta)
if velocity.y < 0:
velocity.y = lerpf(velocity.y, 0, .1) # hard to move up
@@ -111,7 +124,6 @@ func throw(p_direction: Vector2) -> void:
direction = p_direction
trail.emitting = true
set_physics_process(true)
- set_masks()
func _on_target_finder_node_entered(n: Node2D) -> void:
diff --git a/hammers/hammer_01.tscn b/hammers/hammer_01.tscn
index 8c08813..36b03d8 100644
--- a/hammers/hammer_01.tscn
+++ b/hammers/hammer_01.tscn
@@ -4,7 +4,7 @@
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_le3ds"]
[ext_resource type="Texture2D" uid="uid://dcf5es758pw1n" path="res://assets/hammers/hammer01.png" id="2_sdlv5"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_7jbfp"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_mr4f6"]
resource_local_to_scene = true
shader = ExtResource("2_le3ds")
shader_parameter/light_offset = 1.0
@@ -14,7 +14,7 @@ shader_parameter/sin_frequency = 0.25
[node name="Hammer01" instance=ExtResource("1_350hj")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_7jbfp")
+material = SubResource("ShaderMaterial_mr4f6")
texture = ExtResource("2_sdlv5")
[editable path="Hitbox"]
diff --git a/hammers/hammer_02.tscn b/hammers/hammer_02.tscn
index 3f282a7..743a6f5 100644
--- a/hammers/hammer_02.tscn
+++ b/hammers/hammer_02.tscn
@@ -4,7 +4,7 @@
[ext_resource type="Texture2D" uid="uid://bcpy0wbrlmqsq" path="res://assets/hammers/hammer02.png" id="2_dmvhv"]
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_rf70p"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_htydc"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_8htv8"]
resource_local_to_scene = true
shader = ExtResource("2_rf70p")
shader_parameter/light_offset = 1.0
@@ -14,7 +14,7 @@ shader_parameter/sin_frequency = 0.25
[node name="Hammer02" instance=ExtResource("1_vy2k1")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_htydc")
+material = SubResource("ShaderMaterial_8htv8")
texture = ExtResource("2_dmvhv")
[node name="Hitbox" parent="." index="3"]
diff --git a/hammers/hammer_03.tscn b/hammers/hammer_03.tscn
index f268837..d8b0098 100644
--- a/hammers/hammer_03.tscn
+++ b/hammers/hammer_03.tscn
@@ -4,32 +4,32 @@
[ext_resource type="Texture2D" uid="uid://blx67dnlqysnc" path="res://assets/hammers/hammer03.png" id="2_0uj7a"]
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_huryw"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_gbw2g"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_wxyih"]
resource_local_to_scene = true
shader = ExtResource("2_huryw")
shader_parameter/light_offset = 1.0
shader_parameter/line_width = 0.0
shader_parameter/sin_frequency = 0.25
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_uabdv"]
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_3xqdd"]
size = Vector2(8, 12)
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_kegwy"]
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_ta2m2"]
size = Vector2(8, 12)
[node name="Hammer03" instance=ExtResource("1_wc0io")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_gbw2g")
+material = SubResource("ShaderMaterial_wxyih")
texture = ExtResource("2_0uj7a")
[node name="Collision" parent="." index="2"]
-shape = SubResource("RectangleShape2D_uabdv")
+shape = SubResource("RectangleShape2D_3xqdd")
[node name="Hitbox" parent="." index="3"]
damage = 3
[node name="Collision" parent="Hitbox" index="0"]
-shape = SubResource("RectangleShape2D_kegwy")
+shape = SubResource("RectangleShape2D_ta2m2")
[editable path="Hitbox"]
diff --git a/hammers/hammer_base.tscn b/hammers/hammer_base.tscn
index f7f8cf1..c6de599 100644
--- a/hammers/hammer_base.tscn
+++ b/hammers/hammer_base.tscn
@@ -51,6 +51,7 @@ visible = false
shape = ExtResource("2_tgkvf")
[node name="TargetFinder" type="Area2D" parent="."]
+visible = false
collision_layer = 0
collision_mask = 0
monitorable = false
@@ -58,6 +59,10 @@ monitorable = false
[node name="Collision" type="CollisionShape2D" parent="TargetFinder"]
shape = SubResource("CircleShape2D_jubww")
+[node name="Head" type="Marker2D" parent="."]
+visible = false
+position = Vector2(0, -6)
+
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="area_entered" from="TargetFinder" to="." method="_on_target_finder_node_entered"]
[connection signal="body_entered" from="TargetFinder" to="." method="_on_target_finder_node_entered"]
diff --git a/player/player.gd b/player/player.gd
index 720ecc0..27126c6 100644
--- a/player/player.gd
+++ b/player/player.gd
@@ -312,11 +312,10 @@ func disable_aim_gizmo() -> void:
func throw(rot: float) -> void:
rot += randf_range(-0.01, 0.01)
remove_child(current_hammer)
- current_hammer.position.x = 0 # center
+ current_hammer.position = Vector2(0, -8) # center
current_hammer.global_position = to_global(current_hammer.position)
Globals.levelmanager.current_level.add_child(current_hammer)
- current_hammer.hit_player = false
- current_hammer.hit_enemys = true
+ current_hammer.hits = Hammer.HITS.ENEMY
current_hammer.throw(Vector2.from_angle(rot))
SoundManager.play("throw", -15)
current_hammer = null