forked from team-sg/hero-mark-2
42 lines
1.3 KiB
GDScript
42 lines
1.3 KiB
GDScript
extends "res://objects/enemy/enemy.gd"
|
|
|
|
const DIRS = [Vector2.DOWN, Vector2.RIGHT, Vector2.UP, Vector2.LEFT]
|
|
|
|
export var move_speed: float = 0.0
|
|
export var clockwise: bool = false
|
|
|
|
onready var floor_test = Physics2DShapeQueryParameters.new()
|
|
onready var test_shape = $FloorTestShape
|
|
|
|
var floor_direction: int = 0
|
|
var movement_accumulator: float = 0.0
|
|
|
|
func _ready():
|
|
if clockwise:
|
|
$AnimatedSprite.flip_h = true
|
|
floor_test.set_shape(test_shape.shape)
|
|
floor_test.collision_layer = 1
|
|
for i in DIRS.size():
|
|
if is_on_surface(DIRS[i]):
|
|
floor_direction = i
|
|
break
|
|
#Easy mode
|
|
if Game.is_easy_mode:
|
|
move_speed *= Game.easy_mode_speed_factor
|
|
|
|
func _physics_process(delta):
|
|
movement_accumulator += move_speed * delta
|
|
while movement_accumulator >= 1.0:
|
|
var offset = 1 if clockwise else -1
|
|
var move_dir = posmod(floor_direction + offset, DIRS.size())
|
|
if !is_on_surface(DIRS[floor_direction]):
|
|
floor_direction = posmod(floor_direction - offset, DIRS.size())
|
|
elif is_on_surface(DIRS[move_dir]):
|
|
floor_direction = move_dir
|
|
position += DIRS[posmod(floor_direction + offset, DIRS.size())]
|
|
movement_accumulator -= 1.0
|
|
|
|
func is_on_surface(dir):
|
|
var space_state = get_world_2d().direct_space_state
|
|
floor_test.transform = test_shape.global_transform.translated(dir)
|
|
return space_state.collide_shape(floor_test, 1).size() > 0
|