position-based turtle spiking (closes #135)
This commit is contained in:
parent
311528e6ed
commit
ae83195868
5 changed files with 86 additions and 51 deletions
|
@ -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 )]
|
||||
|
|
|
@ -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="."]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue