a game about throwing hammers made for the github game off
anticrash implemented
| -rw-r--r-- | hammers/hammer.gd | 63 | ||||
| -rw-r--r-- | hammers/hammer_01.tscn | 4 | ||||
| -rw-r--r-- | hammers/hammer_02.tscn | 4 | ||||
| -rw-r--r-- | hammers/hammer_03.tscn | 12 | ||||
| -rw-r--r-- | hammers/hammer_base.tscn | 11 |
5 files changed, 56 insertions, 38 deletions
diff --git a/hammers/hammer.gd b/hammers/hammer.gd index 86db072..53110e3 100644 --- a/hammers/hammer.gd +++ b/hammers/hammer.gd @@ -4,6 +4,14 @@ class_name Hammer @icon("res://assets/hammers/hammer01.png") +@onready var left_cast := $LeftCast as RayCast2D +@onready var right_cast := $RightCast as RayCast2D +@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 +@onready var hitbox := $Hitbox as Hitbox + ## The current velocity var velocity := Vector2.ZERO @@ -22,19 +30,23 @@ var direction := Vector2.ZERO ## The hit enum. enum HITS {_a, _b, _c, PLAYER, ENEMY, NONE} +## These nodes want to have their collision mask set. +@onready var hitmasks = [target_finder, hitbox, left_cast, right_cast, self] + ## 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) + for node in hitmasks: + node.set_collision_mask_value(hits, false) hits = value hitbox.monitoring = hits != HITS.NONE + left_cast.enabled = hits != HITS.NONE + right_cast.enabled = hits != HITS.NONE if value == HITS.NONE: return - set_collision_mask_value(hits, true) - target_finder.set_collision_mask_value(hits, true) + for node in hitmasks: + node.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 @@ -45,38 +57,34 @@ enum HITS {_a, _b, _c, PLAYER, ENEMY, NONE} ## 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 -@onready var hitbox := $Hitbox as Hitbox - - func _ready() -> void: hits = hits +## Lerps direction towards [param to]. +func dirlerp(to: Vector2) -> void: + direction = lerp(direction, to, steer_force * clampf(lifetime, 0, 1)) ## Moves the direction towards the target. func seek() -> void: if is_instance_valid(target): - direction = lerp( - direction, head.global_position.direction_to(target.global_position), steer_force * clampf(lifetime, 0, 1) - ) + dirlerp(head.global_position.direction_to(target.global_position)) 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) -# ) +## Tries not to crash. +func anticrash() -> void: + var is_wall := func is_wall(ray: RayCast2D) -> bool: + if not ray.is_colliding(): return false + if target and ray.get_collider().get_class() == target.get_class(): return false + return true + + var results: Array[bool] = [is_wall.call(left_cast), is_wall.call(right_cast)] + if results.count(true) == 2: return # resign to our fate + + for i in range(2): + if results[i]: + dirlerp(direction.rotated(steer_force if i == 0 else -steer_force)) ## Highlights this hammer. See also [method unhighlight]. func highlight() -> void: @@ -94,7 +102,7 @@ func _physics_process(delta: float) -> void: velocity.y += grav * delta else: seek() -# anticrash() + anticrash() velocity += (direction * acceleration * delta) if velocity.y < 0: velocity.y = lerpf(velocity.y, 0, .1) # hard to move up @@ -111,6 +119,7 @@ func _on_body_entered(_body: Node2D) -> void: set_collision_layer_value(7, true) global_position += velocity.limit_length(1) # go into the wall a little velocity = Vector2.ZERO + hits = HITS.NONE target = null steer_force = 0.05 lifetime = 3 diff --git a/hammers/hammer_01.tscn b/hammers/hammer_01.tscn index 36b03d8..a39d5df 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_mr4f6"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_u0220"] 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_mr4f6") +material = SubResource("ShaderMaterial_u0220") texture = ExtResource("2_sdlv5") [editable path="Hitbox"] diff --git a/hammers/hammer_02.tscn b/hammers/hammer_02.tscn index 743a6f5..7d4816b 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_8htv8"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6ejuw"] 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_8htv8") +material = SubResource("ShaderMaterial_6ejuw") texture = ExtResource("2_dmvhv") [node name="Hitbox" parent="." index="3"] diff --git a/hammers/hammer_03.tscn b/hammers/hammer_03.tscn index d8b0098..0225f48 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_wxyih"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_wq5re"] 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_3xqdd"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_2xwsd"] size = Vector2(8, 12) -[sub_resource type="RectangleShape2D" id="RectangleShape2D_ta2m2"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_lidys"] size = Vector2(8, 12) [node name="Hammer03" instance=ExtResource("1_wc0io")] [node name="Sprite" parent="." index="1"] -material = SubResource("ShaderMaterial_wxyih") +material = SubResource("ShaderMaterial_wq5re") texture = ExtResource("2_0uj7a") [node name="Collision" parent="." index="2"] -shape = SubResource("RectangleShape2D_3xqdd") +shape = SubResource("RectangleShape2D_2xwsd") [node name="Hitbox" parent="." index="3"] damage = 3 [node name="Collision" parent="Hitbox" index="0"] -shape = SubResource("RectangleShape2D_ta2m2") +shape = SubResource("RectangleShape2D_lidys") [editable path="Hitbox"] diff --git a/hammers/hammer_base.tscn b/hammers/hammer_base.tscn index c6de599..43b00c2 100644 --- a/hammers/hammer_base.tscn +++ b/hammers/hammer_base.tscn @@ -16,7 +16,7 @@ shader_parameter/line_width = 0.0 shader_parameter/sin_frequency = 0.25 [sub_resource type="CircleShape2D" id="CircleShape2D_jubww"] -radius = 70.0 +radius = 125.0 [node name="Hammer" type="Area2D"] texture_filter = 1 @@ -60,8 +60,17 @@ monitorable = false shape = SubResource("CircleShape2D_jubww") [node name="Head" type="Marker2D" parent="."] +position = Vector2(0, -6) + +[node name="LeftCast" type="RayCast2D" parent="."] +visible = false +position = Vector2(0, -6) +target_position = Vector2(-4, -15) + +[node name="RightCast" type="RayCast2D" parent="."] visible = false position = Vector2(0, -6) +target_position = Vector2(4, -15) [connection signal="body_entered" from="." to="." method="_on_body_entered"] [connection signal="area_entered" from="TargetFinder" to="." method="_on_target_finder_node_entered"] |