position-based turtle spiking (closes #135)

This commit is contained in:
Haze Weathers 2023-07-08 00:50:21 -04:00
parent 311528e6ed
commit ae83195868
5 changed files with 86 additions and 51 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=31 format=2]
[gd_scene load_steps=28 format=2]
[ext_resource path="res://maps/map.gd" type="Script" id=1]
[ext_resource path="res://objects/hud/hud.tscn" type="PackedScene" id=2]
@ -40,21 +40,6 @@ extents = Vector2( 4, 320 )
[sub_resource type="RectangleShape2D" id=8]
extents = Vector2( 128, 4 )
[sub_resource type="Curve2D" id=13]
_data = {
"points": PoolVector2Array( 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 16, 24, 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, -8, 24, 0, 0, 0, 0, -16, 16, 0, 0, 0, 0, -16, 8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 8, 0 )
}
[sub_resource type="Curve2D" id=14]
_data = {
"points": PoolVector2Array( 0, 0, 0, 0, 8, -24, 0, 0, 0, 0, 8, -32, 0, 0, 0, 0, 8, -40, 0, 0, 0, 0, 16, -40, 0, 0, 0, 0, 64, -40, 0, 0, 0, 0, 72, -40, 0, 0, 0, 0, 72, -16, 0, 0, 0, 0, 72, -8, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 8, -24 )
}
[sub_resource type="Curve2D" id=15]
_data = {
"points": PoolVector2Array( 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 72, 56, 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 0 )
}
[node name="Map" type="Node2D" groups=["map"]]
pause_mode = 1
script = ExtResource( 1 )
@ -196,42 +181,24 @@ position = Vector2( 88, 528 )
position = Vector2( 56, 40 )
right_down_boundary = 9.0
speed = 50
spike_delay = 3.0
[node name="Turtle2" parent="Enemies" instance=ExtResource( 16 )]
position = Vector2( 88, 264 )
left_up_boundary = 10.0
speed = 30
spike_delay = 0.5
[node name="Eel" parent="Enemies" instance=ExtResource( 18 )]
position = Vector2( 152, 96 )
speed = 50.0
[node name="Path2D" parent="Enemies/Eel" index="0"]
curve = SubResource( 13 )
[node name="Eel2" parent="Enemies" instance=ExtResource( 18 )]
position = Vector2( 144, 256 )
speed = 50.0
[node name="Path2D" parent="Enemies/Eel2" index="0"]
curve = SubResource( 14 )
[node name="PathFollow2D" parent="Enemies/Eel2/Path2D" index="0"]
position = Vector2( 8, -24 )
rotation = -1.5708
[node name="Eel3" parent="Enemies" instance=ExtResource( 18 )]
position = Vector2( 40, 112 )
speed = 50.0
[node name="Path2D" parent="Enemies/Eel3" index="0"]
curve = SubResource( 15 )
[node name="PathFollow2D" parent="Enemies/Eel3/Path2D" index="0"]
rotation = 2.35619
[node name="Collectibles" type="Node2D" parent="."]
[node name="Star" parent="Collectibles" instance=ExtResource( 17 )]

View file

@ -379,20 +379,17 @@ speed = 60
position = Vector2( 56, 32 )
right_down_boundary = 13.0
speed = 50
spike_delay = 3.0
[node name="Turtle2" parent="Enemies/Turtle" instance=ExtResource( 16 )]
position = Vector2( 48, 280 )
left_up_boundary = 6.0
speed = 30
spike_delay = 2.5
[node name="Turtle3" parent="Enemies/Turtle" instance=ExtResource( 16 )]
position = Vector2( 192, 472 )
left_up_boundary = 3.0
right_down_boundary = 3.0
speed = 30
spike_delay = 1.0
[node name="Collectibles" type="Node2D" parent="."]

View file

@ -134,6 +134,7 @@ material = SubResource( 4 )
position = Vector2( 4, 4 )
z_index = -3
frames = SubResource( 5 )
frame = 1
playing = true
[node name="Steam" parent="." instance=ExtResource( 23 )]
@ -167,10 +168,10 @@ right_down_boundary = 5.0
position = Vector2( 152, 152 )
left_up_boundary = 4.0
right_down_boundary = 4.0
move_direction = 1
spike_positions = [ -2.0, 2.0 ]
[node name="MovingPlatform" parent="." instance=ExtResource( 6 )]
position = Vector2( 128, 152 )
position = Vector2( 96, 144 )
scale = Vector2( 2, 1 )
left_up_boundary = 4.0
right_down_boundary = 4.0

View file

@ -1,37 +1,107 @@
tool
extends "res://objects/enemy/enemy_move_sidesideupdown.gd"
export var spike_delay: float = 2.0
## positions along the path where spikes will trigger
export (Array, float) var spike_positions: Array = []
## time spikes stay active
export var spike_time: float = 0.25
# animates the spikes
var can_spike: bool = true
var spike_tween: SceneTreeTween
# index of the current spike position to check for
onready var current_spike_position: int = 0
onready var sprite: Sprite = $"%Sprite"
onready var spike_shape: CollisionShape2D = $"%SpikeShape"
func _ready() -> void:
# don't act in the editor
if Engine.editor_hint:
return
spike_tween = create_tween().set_loops()
# positions must be in order
spike_positions.sort()
for i in spike_positions.size():
# scale to be in tiles
spike_positions[i] = spike_positions[i] * 8.0
# should start with the first positive spike position
if spike_positions[i] < 0.0:
current_spike_position = i + 1
func _process(delta: float) -> void:
# update debug graphics in editor
if Engine.editor_hint and Engine.get_frames_drawn() % 10 == 0:
update()
func _physics_process(delta: float) -> void:
# do nothing in editor
if Engine.editor_hint:
return
# sync hitbox
$HeadHitbox.scale.x = $ToFlip.scale.x
# check if can still spike before doing all this work
if not can_spike:
return
# use positions in correct axis
var pos = position.x if move_direction == Direction.HORIZONTAL else position.y
var pos_start = startpos.x if move_direction == Direction.HORIZONTAL else startpos.y
# slightly different logic depending on forward/backwards unfortunately :I
match sign(direction):
1.0:
# make sure there are any positions left to check in this direction
if current_spike_position < spike_positions.size():
# check if passed the spike position
if pos >= pos_start + spike_positions[current_spike_position]:
# move on to next position
current_spike_position += 1
spike()
-1.0:
# make sure there are still positions left in this direction
if current_spike_position - 1 >= 0:
# check if passed the position
if pos <= pos_start + spike_positions[current_spike_position - 1]:
# move on to next (previous because backwards) position
current_spike_position -= 1
spike()
## performs the spike animation
func spike() -> void:
# reset tween
if spike_tween != null:
spike_tween.kill() # never have two tweens acting on the same thing
spike_tween = create_tween()
spike_tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
spike_tween.tween_property(spike_shape, "disabled", true, 0.0)
spike_tween.tween_property(sprite, "frame_coords:y", 0.0, 0.0)
spike_tween.tween_interval(spike_delay)
# indicator sprite
spike_tween.tween_property(sprite, "frame_coords:y", 1.0, 0.0)
spike_tween.tween_interval(spike_time * 2.0)
# spikes active
spike_tween.tween_property(spike_shape, "disabled", false, 0.0)
spike_tween.tween_property(sprite, "frame_coords:y", 2.0, 0.0)
spike_tween.tween_interval(spike_time)
func _physics_process(delta: float) -> void:
$HeadHitbox.scale.x = $ToFlip.scale.x
# spikes gone once more
spike_tween.tween_property(spike_shape, "disabled", true, 0.0)
spike_tween.tween_property(sprite, "frame_coords:y", 0.0, 0.0)
func die() -> void:
# disable spiking
can_spike = false
# stop tween
spike_tween.kill()
# disable hitbox
spike_shape.set_deferred("disabled", true)
# reset animation
sprite.frame_coords.y = 3
Audio.play_sound(death_sound, Audio.ac_die)
$"%DeathSplatter".emitting = true
func _draw() -> void:
if Engine.editor_hint:
# still draw base moving enemy debug lines
._draw()
# draw dots at spike positions
for pos in spike_positions:
var dir = Vector2.RIGHT if move_direction == Direction.HORIZONTAL else Vector2.DOWN
draw_circle(dir * pos * 8.0, 2.0, Color.red)

View file

@ -68,7 +68,6 @@ texture = ExtResource( 1 )
centered = false
hframes = 3
vframes = 4
frame = 6
[node name="SwimPlayer" type="AnimationPlayer" parent="ToFlip"]
root_node = NodePath("../..")
@ -92,6 +91,7 @@ unique_name_in_owner = true
unique_name_in_owner = true
position = Vector2( 8.5, -1.5 )
shape = SubResource( 5 )
disabled = true
[node name="Platform" type="KinematicBody2D" parent="SpikeHitbox"]