forked from team-sg/hero-mark-2
eels reborn
This commit is contained in:
parent
7e460cc4e1
commit
04dec83275
6 changed files with 104 additions and 92 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue