113 lines
2.5 KiB
GDScript
113 lines
2.5 KiB
GDScript
extends RigidBody2D
|
|
|
|
@export var speed = -70
|
|
@onready var ray_cast_left = $RayCastLeft
|
|
@onready var ray_cast_right = $RayCastRight
|
|
@onready var animated_sprite_2d = $AnimatedSprite2D
|
|
@onready var timer = $Timer
|
|
@onready var die = $die
|
|
@onready var ray_cast_left_2 = $RayCastLeft2
|
|
@onready var ray_cast_right_2 = $RayCastRight2
|
|
var innocent = false
|
|
@onready var timer_2 = $Timer2
|
|
var is_down = false
|
|
@onready var collision_shape_2d = $CollisionShape2D
|
|
@onready var ray_cast_left_3 = $RayCastLeft3
|
|
@onready var ray_cast_right_3 = $RayCastRight3
|
|
@onready var player = %player
|
|
|
|
func _ready():
|
|
var coll = CapsuleShape2D.new()
|
|
coll.height = 24
|
|
coll.radius = 7
|
|
collision_shape_2d.shape = coll
|
|
|
|
func _physics_process(delta):
|
|
if abs(position.x - player.position.x) < 225 or is_down:
|
|
linear_velocity.x = speed
|
|
|
|
if ray_cast_left_2 == null:
|
|
return
|
|
|
|
if ray_cast_left.is_colliding() or ray_cast_left_2.is_colliding():
|
|
speed = abs(speed)
|
|
animated_sprite_2d.flip_h = true
|
|
elif ray_cast_right.is_colliding() or ray_cast_right_2.is_colliding():
|
|
speed = -abs(speed)
|
|
animated_sprite_2d.flip_h = false
|
|
|
|
var other = null
|
|
if ray_cast_left_3.is_colliding():
|
|
other = ray_cast_left_3.get_collider()
|
|
elif ray_cast_right_3.is_colliding():
|
|
other = ray_cast_right_3.get_collider()
|
|
|
|
if is_down and speed != 0 and other != null:
|
|
other.f_die()
|
|
|
|
if innocent:
|
|
return
|
|
|
|
var body = null
|
|
if ray_cast_left_2.is_colliding():
|
|
if speed != 0:
|
|
body = ray_cast_left_2.get_collider()
|
|
else:
|
|
speed = 160
|
|
innocent = true
|
|
die_sound.play()
|
|
timer_2.start()
|
|
elif ray_cast_right_2.is_colliding():
|
|
if speed != 0:
|
|
body = ray_cast_right_2.get_collider()
|
|
else:
|
|
speed = -160
|
|
innocent = true
|
|
die_sound.play()
|
|
timer_2.start()
|
|
|
|
if body != null:
|
|
body.shrink()
|
|
innocent = true
|
|
timer_2.start()
|
|
|
|
|
|
@onready var die_sound = $dieSound
|
|
|
|
func f_die():
|
|
die_sound.play()
|
|
speed = 0
|
|
innocent = true
|
|
collision_layer = 32
|
|
timer.start()
|
|
|
|
func f_shrink(body):
|
|
die_sound.play()
|
|
if not is_down:
|
|
# collission mask only to walls
|
|
ray_cast_left.collision_mask = pow(2, 1-1)
|
|
ray_cast_right.collision_mask = pow(2, 1-1)
|
|
speed = 0
|
|
collision_shape_2d.shape.height -= 9
|
|
die.position.y += 2
|
|
animated_sprite_2d.play("shrink")
|
|
is_down = true
|
|
ray_cast_left_2.scale.x = 2
|
|
ray_cast_right_2.scale.x = 2
|
|
elif speed == 0:
|
|
speed = 160 if body.position.x < position.x else -160
|
|
else:
|
|
speed = 0
|
|
|
|
func _on_timer_2_timeout():
|
|
innocent = false
|
|
|
|
|
|
func _on_die_body_entered(body):
|
|
f_shrink(body)
|
|
body.velocity.y = body.JUMPt_velocity/1.5
|
|
|
|
|
|
func _on_timer_timeout():
|
|
queue_free()
|