-
Notifications
You must be signed in to change notification settings - Fork 0
Flying Enemy
The Flying Enemy is a dynamic enemy type that moves between two points in space, a predictable traversal pattern for the player. Unlike Patrol enemies, Flying Enemies are not constrained to ground navigation and instead move freely in straight-line paths between two defined offsets.
Connecting Systems:
- Game Manager
- Property Editor
- Entity Manager
- Resource System (FlyingPreset .tres files)
Subsystems:
- None
List of known bugs. Be descriptive but keep it brief!
- Very small offset values result in nearly invisible movement (must ensure slider range is sufficient)
- May get stuck on props if approached at an unusual angle
Base Enemy (Inherited):
- When landed on, the player defeats them and gets a bounce.
- When run into from another direction, the player takes damage.
- Supports health system.
- Uses shared enemy interface (Enemy.gd).
Flying Enemy:
- Property Flying Speed: Controls how fast the enemy travels between points. Higher values = faster movement.
- Property Point B Offset: Defines the second movement point relative to the spawn position. X controls horizontal distance, Y controls vertical distance. Supports diagonal movement (e.g., Offset (256, 0) -> moves right, Offset (0, -256) -> moves up, Offset (256, 256) -> moves diagonally).
- Moves in a straight line between Point A (spawn position) and Point B (Point A + Offset).
- Automatically switches direction when reaching a point.
- Uses normalized direction vector for smooth motion.
- Uses direct velocity-based movement (no pathfinding).
- Ignores gravity.
- Can collide with level geometry.
propertyFile: Resource = Stores the currently assigned FlyingPreset resource.
point_a: Vector2 = Spawn position (set when enemy is placed).
point_b: Vector2 = Calculated endpoint based on offset.
target_point: Vector2 = Current movement destination.
speed: float = Movement speed of the enemy.
-
func assign_script(id: String, position: Vector2i) -> void: Assigns a FlyingPreset resource to the enemy based on a generated ID. Loads the correct .tres file from disk, assigns it to propertyFile, and sets the enemy's identity in the editor system. -
func apply_script(file: Resource) -> void: Applies a FlyingPreset resource to the enemy instance. Reads stored data from the resource, updates movement behavior based on saved values, and recalculates patrol path (Point A and Point B). Does NOT reposition the enemy in world space; assumes enemy is already placed correctly by the editor.
- Enemy spawns at Point A (editor placement)
- Point B is calculated using offset:
Point B = Point A + Offset - Enemy moves toward target point using normalized direction
- When close enough to target: switches target to the opposite point and repeats
- Editor places enemy
- assign_script()
- Resource created/saved (.tres)
- apply_script() on load
- Point A set = global position
- Point B calculated = A + offset
- Enemy begins patrol movement
Future Work:
- Add support for variable movement patterns (e.g., sine wave, circular)
- Add visual indicators for patrol path in editor
Risks:
- None
Offset-based system was chosen instead of absolute coordinates to:
- Make enemy placement reusable
- Simplify editing in property menu
- Avoid dependency on world coordinates in resources
Movement is intentionally simple (no pathfinding) to ensure:
- Predictability for level design
- Easy debugging
- Low performance cost
Resources
Known Issues
Future Work
Globals
Managers
- Main Menu Manager
- Master Manager
- Camera Manager
- Hotkey Manager
- Import Export Manager
- Audio Manager
- Animation Manager
- PopUp Manager
UI
Managers
- Editor Manager
- Tile Manager
- Entity Manager
- Icon Manager
- Preview Manager
- Tool Manager
- Asset Manager
- Custom Cursor Manager
Tiles & Entities
- Grid Lines
- Preview Line
- Tiles & Entities
- Enemies
- Patrolling Enemy
- Flying Enemy
- Shooting Enemy
- Stationary Enemy
- Moving Platform
- Property Editing
Asset Swapping
UI
Managers
Player