diff --git a/graphics/enemy/eel_body.png b/graphics/enemy/eel_body.png index 087b229..58588ac 100644 Binary files a/graphics/enemy/eel_body.png and b/graphics/enemy/eel_body.png differ diff --git a/graphics/enemy/eel_head.png b/graphics/enemy/eel_head.png index 7bfef97..107b7d8 100644 Binary files a/graphics/enemy/eel_head.png and b/graphics/enemy/eel_head.png differ diff --git a/graphics/enemy/eel_tail.png b/graphics/enemy/eel_tail.png index 949f03f..dd08a76 100644 Binary files a/graphics/enemy/eel_tail.png and b/graphics/enemy/eel_tail.png differ diff --git a/maps/test_room.tscn b/maps/test_room.tscn index 3b7e6d6..0cca83b 100644 --- a/maps/test_room.tscn +++ b/maps/test_room.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=32 format=2] +[gd_scene load_steps=33 format=2] [ext_resource path="res://objects/enemy/squig.tscn" type="PackedScene" id=1] [ext_resource path="res://tilesets/t_cave.tres" type="TileSet" id=2] @@ -49,6 +49,11 @@ animations = [ { "speed": 20.0 } ] +[sub_resource type="Curve2D" id=8] +_data = { +"points": PoolVector2Array( -8.02293, 7.78696, 8.02293, -7.78696, 152, 32, -3.00339, -17.0192, 3.00339, 17.0192, 184, 24, -7.90495, -7.66898, 7.90495, 7.66898, 200, 32, 7.81354, -7.68111, -7.81354, 7.68111, 200, 72, 7.68111, 7.81354, -7.68111, -7.81354, 152, 72, -7.66898, 8.02293, 7.66898, -8.02293, 152, 32 ) +} + [node name="Map2" type="Node2D" groups=["map"]] script = ExtResource( 11 ) @@ -141,7 +146,6 @@ material = SubResource( 4 ) position = Vector2( 4, 4 ) z_index = -3 frames = SubResource( 5 ) -frame = 1 playing = true [node name="Steam" parent="." instance=ExtResource( 23 )] @@ -213,7 +217,8 @@ right_down_boundary = 4.0 speed = 10 [node name="Eel" parent="." instance=ExtResource( 24 )] -position = Vector2( 120, 56 ) +position = Vector2( -64, 104 ) +curve = SubResource( 8 ) +segments = 8 [editable path="RollingFiend"] -[editable path="Eel"] diff --git a/objects/enemy/eel.gd b/objects/enemy/eel.gd index 54756a7..30f00e8 100644 --- a/objects/enemy/eel.gd +++ b/objects/enemy/eel.gd @@ -2,7 +2,7 @@ extends "res://objects/enemy/enemy.gd" const SEGMENT_LENGTH: float = 4.0 -const BASE_LENGTH: float = 20.0 # combined length of head and tail +const SEGMENT_OFFSET: float = 8.0 export var segments: int = 8 @@ -11,46 +11,48 @@ export var wave_length: float = 8.0 export var wave_amplitude: float = 4.0 -onready var sector: Vector2 = Game.get_sector(global_position) +var _segments: Array -onready var hitbox: Area2D = $Path2D/PathFollow2D/Hitbox -onready var first_segment: CollisionShape2D = $"%Segment" -onready var segment_start: Position2D = $"%SegmentStart" -onready var path_follow = $Path2D/PathFollow2D +onready var head: PathFollow2D = $Head +onready var tail: PathFollow2D = $Tail func _ready() -> void: - hitbox.remove_child(first_segment) + var first_segment: PathFollow2D = $Segment + var first_segment_shape: CollisionShape2D = $"%SegmentShape" + + _segments = [] + _segments.resize(segments) for i in segments: var new_segment = first_segment.duplicate() - new_segment.position.x = segment_start.position.x + SEGMENT_LENGTH * float(i) - hitbox.add_child(new_segment) - $Path2D/PathFollow2D/Hitbox/TailShape.position.x = segment_start.position.x + SEGMENT_LENGTH * segments - _wave_segments() + add_child(new_segment) + _segments[i] = new_segment + var new_segment_shape = first_segment_shape.duplicate() + $Hitbox.add_child(new_segment_shape) + var new_shape_transform = new_segment.get_node("ShapeTransform") + new_shape_transform.remote_path = new_shape_transform.get_path_to(new_segment_shape) + + first_segment.queue_free() + first_segment_shape.queue_free() func _physics_process(delta: float) -> void: - # move -# global_position.x += speed * delta * sign(scale.x) - path_follow.set_offset(path_follow.get_offset() + speed * delta) - # make segments wibble - _wave_segments() - # check for wrapping - var sector_rect = Rect2(sector * Game.resolution - Vector2(8.0, 0.0), Game.resolution + Vector2(16.0, 0.0)) - var total_length = BASE_LENGTH + (SEGMENT_LENGTH * float(segments)) - var eel_rect = Rect2(global_position + Vector2(-2.0, 4.0), Vector2(total_length, 0.0)) - if sign(scale.x) == 1.0: - eel_rect.position.x -= total_length - if not sector_rect.intersects(eel_rect): - global_position.x -= (sector_rect.size.x + total_length) * sign(scale.x) + head.offset += speed * delta + _offset_segments() +# _wave_segments() + +func _offset_segments() -> void: + tail.offset = head.offset - SEGMENT_LENGTH * float(segments + 1) + for i in _segments.size(): + _segments[i].offset = head.offset - SEGMENT_LENGTH * float(i + 1) func _wave_segments() -> void: - for segment in hitbox.get_children(): - if segment is Node2D: - segment.position.y = sin(segment.global_position.x / wave_length) * wave_amplitude + for segment in get_children(): + if segment is PathFollow2D: + segment.v_offset = sin(segment.offset / wave_length) * wave_amplitude func die() -> void: - for segment in hitbox.get_children(): + for segment in _segments: if segment is Node2D: var death_particles = DeathParticles.instance() death_particles.global_position = segment.global_position diff --git a/objects/enemy/eel.tscn b/objects/enemy/eel.tscn index b3b89be..5363ec9 100644 --- a/objects/enemy/eel.tscn +++ b/objects/enemy/eel.tscn @@ -1,90 +1,95 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://objects/enemy/eel.gd" type="Script" id=1] [ext_resource path="res://graphics/enemy/eel_head.png" type="Texture" id=2] [ext_resource path="res://graphics/enemy/eel_body.png" type="Texture" id=3] [ext_resource path="res://graphics/enemy/eel_tail.png" type="Texture" id=4] -[ext_resource path="res://graphics/enemy/eel_inner_border.png" type="Texture" id=5] +[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=6] -[sub_resource type="Curve2D" id=4] -_data = { -"points": PoolVector2Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, -24, 0, 0, 0, 0, -8, -48, 0, 0, 0, 0, 24, -72, 0, 0, 0, 0, -8, -96, 0, 0, 0, 0, -8, -96, 0, 0, 0, 0, 24, -72, 0, 0, 0, 0, -8, -48, 0, 0, 0, 0, 24, -24, 0, 0, 0, 0, 0, 0 ) -} - -[sub_resource type="RectangleShape2D" id=3] +[sub_resource type="RectangleShape2D" id=8] extents = Vector2( 2, 2 ) -[sub_resource type="RectangleShape2D" id=2] +[sub_resource type="RectangleShape2D" id=7] +extents = Vector2( 4.5, 2 ) + +[sub_resource type="RectangleShape2D" id=9] extents = Vector2( 2, 2 ) -[node name="Eel" type="Node2D" groups=["enemy"]] +[sub_resource type="ShaderMaterial" id=6] +shader = ExtResource( 6 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = false + +[node name="Eel" type="Path2D" groups=["enemy"]] +curve = null script = ExtResource( 1 ) segments = 2 -wave_amplitude = 6.0 -[node name="Path2D" type="Path2D" parent="."] -curve = SubResource( 4 ) +[node name="Hitbox" type="Area2D" parent="." groups=["enemy_hitbox"]] +position = Vector2( 4, 0 ) +z_index = 1 -[node name="PathFollow2D" type="PathFollow2D" parent="Path2D"] -position = Vector2( 8, 0 ) - -[node name="Hitbox" type="Area2D" parent="Path2D/PathFollow2D" groups=["enemy_hitbox"]] -position = Vector2( 7.99424, 0.405511 ) -rotation = 3.14159 -scale = Vector2( 1, -1 ) - -[node name="SegmentStart" type="Position2D" parent="Path2D/PathFollow2D/Hitbox"] -unique_name_in_owner = true -position = Vector2( 12, 0 ) -__meta__ = { -"_gizmo_extents_": 5.0 -} - -[node name="HeadShape" type="CollisionPolygon2D" parent="Path2D/PathFollow2D/Hitbox"] -position = Vector2( 8, 0 ) -polygon = PoolVector2Array( -7, -2, 2, -2, 2, 2, -7, 2 ) - -[node name="HeadSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/HeadShape"] -show_behind_parent = true +[node name="TailShape" type="CollisionShape2D" parent="Hitbox"] position = Vector2( -4, 0 ) +shape = SubResource( 8 ) + +[node name="HeadShape" type="CollisionShape2D" parent="Hitbox"] +position = Vector2( -1.5, 0 ) +shape = SubResource( 7 ) + +[node name="SegmentShape" type="CollisionShape2D" parent="Hitbox"] +unique_name_in_owner = true +position = Vector2( -4, 0 ) +shape = SubResource( 9 ) + +[node name="Head" type="PathFollow2D" parent="." groups=["eel_segment"]] +offset = 8.0 +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Head"] +position = Vector2( 4, 0 ) texture = ExtResource( 2 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/HeadShape"] -position = Vector2( 3, 0 ) +[node name="Border" type="Sprite" parent="Head/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 2 ) -[node name="TailShape" type="CollisionShape2D" parent="Path2D/PathFollow2D/Hitbox"] -position = Vector2( 16, 0 ) -shape = SubResource( 3 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Head"] +position = Vector2( 2.5, 0 ) +remote_path = NodePath("../../Hitbox/HeadShape") -[node name="TailSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/TailShape"] -show_behind_parent = true -position = Vector2( 2, 0 ) +[node name="Tail" type="PathFollow2D" parent="."] +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Tail"] +position = Vector2( -2, 0 ) texture = ExtResource( 4 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/TailShape"] -position = Vector2( -2, 0 ) +[node name="Border" type="Sprite" parent="Tail/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 4 ) -[node name="Segment" type="CollisionShape2D" parent="Path2D/PathFollow2D/Hitbox"] -unique_name_in_owner = true -position = Vector2( 12, 0 ) -shape = SubResource( 2 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Tail"] +remote_path = NodePath("../../Hitbox/TailShape") -[node name="SegmentSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -show_behind_parent = true +[node name="Segment" type="PathFollow2D" parent="."] +offset = 4.0 +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Segment"] texture = ExtResource( 3 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -position = Vector2( -2, 0 ) +[node name="Border" type="Sprite" parent="Segment/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 3 ) -[node name="InnerBorder2" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -position = Vector2( 3, 0 ) -z_index = -1 -texture = ExtResource( 5 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Segment"] +remote_path = NodePath("../../Hitbox/SegmentShape") -[connection signal="area_entered" from="Path2D/PathFollow2D/Hitbox" to="." method="_on_Hitbox_area_entered"] +[connection signal="area_entered" from="Hitbox" to="." method="_on_Hitbox_area_entered"]