Skip to content

Flying Enemy

Jack X. edited this page Jun 12, 2026 · 7 revisions

Flying Enemy

System Summary

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.


Connected Systems

Connecting Systems:

Subsystems:

  • None

Bugs

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

Feature List / Breakdown of Features

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.

Important Variables

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.


Important Functions

  • 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.


Movement Logic

  1. Enemy spawns at Point A (editor placement)
  2. Point B is calculated using offset: Point B = Point A + Offset
  3. Enemy moves toward target point using normalized direction
  4. When close enough to target: switches target to the opposite point and repeats

Data Flow

  1. Editor places enemy
  2. assign_script()
  3. Resource created/saved (.tres)
  4. apply_script() on load
  5. Point A set = global position
  6. Point B calculated = A + offset
  7. Enemy begins patrol movement

Future Work / Risks

Future Work:

  1. Add support for variable movement patterns (e.g., sine wave, circular)
  2. Add visual indicators for patrol path in editor

Risks:

  • None

Miscellaneous Notes

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

Clone this wiki locally