feat: Implement enemy spawning and movement logic in the level manager
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
## enemy.gd
|
||||
# Enemy character script. Each turn, chases the player one tile using pathfinding.
|
||||
class_name Enemy
|
||||
extends Character
|
||||
|
||||
# Movement speed in pixels per second.
|
||||
const SPEED: float = 200.0
|
||||
# Distance threshold for snapping to a tile (prevents jitter).
|
||||
const ARRIVAL_THRESHOLD: float = 4.0
|
||||
|
||||
# Reference to the player — set by LevelManager after spawning.
|
||||
var _player: Player
|
||||
# True while animating toward _move_target.
|
||||
var _is_moving: bool = false
|
||||
# World position of the tile this enemy is stepping toward.
|
||||
var _move_target: Vector2 = Vector2.ZERO
|
||||
|
||||
|
||||
# Called by TurnManager. Pathfinds to the player and steps one tile closer.
|
||||
func take_turn() -> void:
|
||||
var my_tile := LevelManager.world_to_tile(position)
|
||||
var player_tile := LevelManager.world_to_tile(_player.position)
|
||||
var path := LevelManager.find_path(my_tile, player_tile)
|
||||
# path[0] is own tile; path[-1] is the player's tile (don't step there).
|
||||
if path.size() < 2:
|
||||
turn_finished.emit()
|
||||
return
|
||||
# Stop one tile away from the player — don't overlap.
|
||||
if path.size() == 2:
|
||||
turn_finished.emit()
|
||||
return
|
||||
_move_target = LevelManager.tile_to_world(path[1])
|
||||
_is_moving = true
|
||||
|
||||
|
||||
# Glides toward _move_target each frame. Emits turn_finished on arrival.
|
||||
func _physics_process(_delta: float) -> void:
|
||||
if not _is_moving:
|
||||
velocity = Vector2.ZERO
|
||||
move_and_slide()
|
||||
return
|
||||
|
||||
var to_target: Vector2 = _move_target - position
|
||||
|
||||
if to_target.length() < ARRIVAL_THRESHOLD:
|
||||
position = _move_target
|
||||
velocity = Vector2.ZERO
|
||||
move_and_slide()
|
||||
_is_moving = false
|
||||
turn_finished.emit()
|
||||
else:
|
||||
velocity = to_target.normalized() * SPEED
|
||||
move_and_slide()
|
||||
+2
-3
@@ -2,12 +2,11 @@
|
||||
# Main world node script. Sets up the map, player, and level on scene ready.
|
||||
extends Node
|
||||
|
||||
# Reference to the TileMapLayer node for rendering the map.
|
||||
|
||||
# Reference to the TileMapLayer node for rendering the map.
|
||||
var map_layer: TileMapLayer
|
||||
# Path to the Player scene to instance.
|
||||
const PLAYER_SCENE_PATH: String = "res://scenes/actors/player.tscn"
|
||||
# Reference to the TileMapLayer node for rendering the map.
|
||||
var map_layer: TileMapLayer
|
||||
# Reference to the Player node.
|
||||
var player: Player
|
||||
# Map generation settings (size, room count, etc.).
|
||||
|
||||
Reference in New Issue
Block a user