forked from team-sg/hero-mark-2
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://maps/map.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://objects/hud/hud.tscn" type="PackedScene" id=2]
|
[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]
|
[sub_resource type="RectangleShape2D" id=8]
|
||||||
extents = Vector2( 128, 4 )
|
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"]]
|
[node name="Map" type="Node2D" groups=["map"]]
|
||||||
pause_mode = 1
|
pause_mode = 1
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
@ -196,42 +181,24 @@ position = Vector2( 88, 528 )
|
||||||
position = Vector2( 56, 40 )
|
position = Vector2( 56, 40 )
|
||||||
right_down_boundary = 9.0
|
right_down_boundary = 9.0
|
||||||
speed = 50
|
speed = 50
|
||||||
spike_delay = 3.0
|
|
||||||
|
|
||||||
[node name="Turtle2" parent="Enemies" instance=ExtResource( 16 )]
|
[node name="Turtle2" parent="Enemies" instance=ExtResource( 16 )]
|
||||||
position = Vector2( 88, 264 )
|
position = Vector2( 88, 264 )
|
||||||
left_up_boundary = 10.0
|
left_up_boundary = 10.0
|
||||||
speed = 30
|
speed = 30
|
||||||
spike_delay = 0.5
|
|
||||||
|
|
||||||
[node name="Eel" parent="Enemies" instance=ExtResource( 18 )]
|
[node name="Eel" parent="Enemies" instance=ExtResource( 18 )]
|
||||||
position = Vector2( 152, 96 )
|
position = Vector2( 152, 96 )
|
||||||
speed = 50.0
|
speed = 50.0
|
||||||
|
|
||||||
[node name="Path2D" parent="Enemies/Eel" index="0"]
|
|
||||||
curve = SubResource( 13 )
|
|
||||||
|
|
||||||
[node name="Eel2" parent="Enemies" instance=ExtResource( 18 )]
|
[node name="Eel2" parent="Enemies" instance=ExtResource( 18 )]
|
||||||
position = Vector2( 144, 256 )
|
position = Vector2( 144, 256 )
|
||||||
speed = 50.0
|
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 )]
|
[node name="Eel3" parent="Enemies" instance=ExtResource( 18 )]
|
||||||
position = Vector2( 40, 112 )
|
position = Vector2( 40, 112 )
|
||||||
speed = 50.0
|
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="Collectibles" type="Node2D" parent="."]
|
||||||
|
|
||||||
[node name="Star" parent="Collectibles" instance=ExtResource( 17 )]
|
[node name="Star" parent="Collectibles" instance=ExtResource( 17 )]
|
||||||
|
|
|
@ -379,20 +379,17 @@ speed = 60
|
||||||
position = Vector2( 56, 32 )
|
position = Vector2( 56, 32 )
|
||||||
right_down_boundary = 13.0
|
right_down_boundary = 13.0
|
||||||
speed = 50
|
speed = 50
|
||||||
spike_delay = 3.0
|
|
||||||
|
|
||||||
[node name="Turtle2" parent="Enemies/Turtle" instance=ExtResource( 16 )]
|
[node name="Turtle2" parent="Enemies/Turtle" instance=ExtResource( 16 )]
|
||||||
position = Vector2( 48, 280 )
|
position = Vector2( 48, 280 )
|
||||||
left_up_boundary = 6.0
|
left_up_boundary = 6.0
|
||||||
speed = 30
|
speed = 30
|
||||||
spike_delay = 2.5
|
|
||||||
|
|
||||||
[node name="Turtle3" parent="Enemies/Turtle" instance=ExtResource( 16 )]
|
[node name="Turtle3" parent="Enemies/Turtle" instance=ExtResource( 16 )]
|
||||||
position = Vector2( 192, 472 )
|
position = Vector2( 192, 472 )
|
||||||
left_up_boundary = 3.0
|
left_up_boundary = 3.0
|
||||||
right_down_boundary = 3.0
|
right_down_boundary = 3.0
|
||||||
speed = 30
|
speed = 30
|
||||||
spike_delay = 1.0
|
|
||||||
|
|
||||||
[node name="Collectibles" type="Node2D" parent="."]
|
[node name="Collectibles" type="Node2D" parent="."]
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,7 @@ material = SubResource( 4 )
|
||||||
position = Vector2( 4, 4 )
|
position = Vector2( 4, 4 )
|
||||||
z_index = -3
|
z_index = -3
|
||||||
frames = SubResource( 5 )
|
frames = SubResource( 5 )
|
||||||
|
frame = 1
|
||||||
playing = true
|
playing = true
|
||||||
|
|
||||||
[node name="Steam" parent="." instance=ExtResource( 23 )]
|
[node name="Steam" parent="." instance=ExtResource( 23 )]
|
||||||
|
@ -167,10 +168,10 @@ right_down_boundary = 5.0
|
||||||
position = Vector2( 152, 152 )
|
position = Vector2( 152, 152 )
|
||||||
left_up_boundary = 4.0
|
left_up_boundary = 4.0
|
||||||
right_down_boundary = 4.0
|
right_down_boundary = 4.0
|
||||||
move_direction = 1
|
spike_positions = [ -2.0, 2.0 ]
|
||||||
|
|
||||||
[node name="MovingPlatform" parent="." instance=ExtResource( 6 )]
|
[node name="MovingPlatform" parent="." instance=ExtResource( 6 )]
|
||||||
position = Vector2( 128, 152 )
|
position = Vector2( 96, 144 )
|
||||||
scale = Vector2( 2, 1 )
|
scale = Vector2( 2, 1 )
|
||||||
left_up_boundary = 4.0
|
left_up_boundary = 4.0
|
||||||
right_down_boundary = 4.0
|
right_down_boundary = 4.0
|
||||||
|
|
|
@ -1,37 +1,107 @@
|
||||||
tool
|
tool
|
||||||
extends "res://objects/enemy/enemy_move_sidesideupdown.gd"
|
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
|
export var spike_time: float = 0.25
|
||||||
|
|
||||||
|
# animates the spikes
|
||||||
|
var can_spike: bool = true
|
||||||
var spike_tween: SceneTreeTween
|
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 sprite: Sprite = $"%Sprite"
|
||||||
onready var spike_shape: CollisionShape2D = $"%SpikeShape"
|
onready var spike_shape: CollisionShape2D = $"%SpikeShape"
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
# don't act in the editor
|
||||||
if Engine.editor_hint:
|
if Engine.editor_hint:
|
||||||
return
|
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.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
|
||||||
|
# indicator sprite
|
||||||
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)
|
|
||||||
|
|
||||||
spike_tween.tween_property(sprite, "frame_coords:y", 1.0, 0.0)
|
spike_tween.tween_property(sprite, "frame_coords:y", 1.0, 0.0)
|
||||||
spike_tween.tween_interval(spike_time * 2.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(spike_shape, "disabled", false, 0.0)
|
||||||
spike_tween.tween_property(sprite, "frame_coords:y", 2.0, 0.0)
|
spike_tween.tween_property(sprite, "frame_coords:y", 2.0, 0.0)
|
||||||
spike_tween.tween_interval(spike_time)
|
spike_tween.tween_interval(spike_time)
|
||||||
|
# spikes gone once more
|
||||||
func _physics_process(delta: float) -> void:
|
spike_tween.tween_property(spike_shape, "disabled", true, 0.0)
|
||||||
$HeadHitbox.scale.x = $ToFlip.scale.x
|
spike_tween.tween_property(sprite, "frame_coords:y", 0.0, 0.0)
|
||||||
|
|
||||||
func die() -> void:
|
func die() -> void:
|
||||||
|
# disable spiking
|
||||||
|
can_spike = false
|
||||||
|
# stop tween
|
||||||
spike_tween.kill()
|
spike_tween.kill()
|
||||||
|
# disable hitbox
|
||||||
spike_shape.set_deferred("disabled", true)
|
spike_shape.set_deferred("disabled", true)
|
||||||
|
# reset animation
|
||||||
sprite.frame_coords.y = 3
|
sprite.frame_coords.y = 3
|
||||||
Audio.play_sound(death_sound, Audio.ac_die)
|
Audio.play_sound(death_sound, Audio.ac_die)
|
||||||
$"%DeathSplatter".emitting = true
|
$"%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
|
centered = false
|
||||||
hframes = 3
|
hframes = 3
|
||||||
vframes = 4
|
vframes = 4
|
||||||
frame = 6
|
|
||||||
|
|
||||||
[node name="SwimPlayer" type="AnimationPlayer" parent="ToFlip"]
|
[node name="SwimPlayer" type="AnimationPlayer" parent="ToFlip"]
|
||||||
root_node = NodePath("../..")
|
root_node = NodePath("../..")
|
||||||
|
@ -92,6 +91,7 @@ unique_name_in_owner = true
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
position = Vector2( 8.5, -1.5 )
|
position = Vector2( 8.5, -1.5 )
|
||||||
shape = SubResource( 5 )
|
shape = SubResource( 5 )
|
||||||
|
disabled = true
|
||||||
|
|
||||||
[node name="Platform" type="KinematicBody2D" parent="SpikeHitbox"]
|
[node name="Platform" type="KinematicBody2D" parent="SpikeHitbox"]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue