Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode Skip to content
SIMVX
HomeExamplesEditorDocs
SimVX documentation
SimVX documentation

Getting Started

  • Installation
  • Quickstart
  • Your First 2D Game
  • Your First 3D Game
  • From Monolithic to Composed
  • Patterns
  • Examples Gallery
    • 2D Joints
    • 2D Lighting
    • Navigation demo
    • NinePatch
    • 2D Path Follow
    • Sprite
    • Tilemap
    • 2D Trail
    • Animation Blend
    • ChaseCamera demo
    • CollisionWorld
    • CSG
    • Custom Shader
    • Mesh.extrude_path demo
    • First-person camera demo
    • Fog
    • GPU Particles 3D Demo
    • IBL
    • 3D Joints
    • 3D Lighting
    • Mesh Parenting
    • Model Viewer
    • Motion Blur
    • MultiMesh
    • 3D Navigation
    • Noise
    • Particles
    • 3D Path Follow demo
    • Mouse picking demo
    • Point and spot light shadow demo.
    • PostProcessParity
    • Raycast demo
    • ReflectionProbe3D
    • Render Layers Demo
    • Shadow quality demo
    • Skeletal animation demo
    • SSAO Demo
    • SubViewport
    • Node tree text demo
    • Textured cubes demo
    • Volumetric Fog
    • Debug Draw
    • Debug Overlay
    • Bouncing Balls
    • Rotating Cube
    • Triangle
    • Audio demo
    • Touch gesture recognition demo
    • i18n Demo
    • Menu Bar Demo
    • Python Console
    • Terminal Demo
    • Text Input Demo
    • Visual demo for the StyleBox theming system.
    • TreeView Demo
    • Undo/Redo demo
    • Widget Showcase
    • First Scene
    • First Scene
    • Balatro-Feel
    • Balatro-Feel: SimVX port
    • Casual Crusade
    • Casual Crusade (SimVX port)
    • Cavern (Challacade)
    • Cavern: SimVX Port (Engine Test Only)
    • Celeste Classic
    • Claustrowordia
    • Claustrowordia (SimVX port)
    • Clear Code Zelda
    • Clear Code Zelda: SimVX port
    • Clumsy Bird
    • Dodge the Creeps
    • GDQuest Open RPG
    • GDQuest Open RPG: SimVX port
    • HeartBeast Action RPG
    • HeartBeast Action RPG: SimVX Port
    • HexGL
    • HexGL: SimVX Port
    • Hextris
    • Hextris: SimVX port
    • Mr. Rescue
    • Mr. Rescue: SimVX port
    • PirateMaker
    • PirateMaker: SimVX port
    • Procedural Planets
    • Procedural Planets: SimVX Port
    • PyDew Valley
    • PyDew Valley → SimVX
    • Q1K3
    • Q1K3: SimVX port
    • Asteroids (raylib classic)
    • Snake (raylib classic)
    • Snake (raylib classic): SimVX port
    • Tetris (raylib classic)
    • Tetris (raylib classic): SimVX port
    • SNKRX
    • SNKRX (SimVX port)
    • Klondike Solitaire
    • Klondike Solitaire: SimVX port
    • Squash the Creeps
    • Tanks of Freedom
    • Tanks of Freedom: SimVX port
    • Tiny Yurts
    • Tiny Yurts (SimVX port)
    • Tower Defence
    • Tower Defence (SimVX port)
    • Pixel Runner
    • Pixel Runner: SimVX Port
    • You’re the OS
    • You’re the OS: SimVX Port (Tier 2 #26)
    • Asteroids 2D
    • Asteroids 3D
    • Deep Sea Aquarium
    • Pad Grid
    • Physics Sandbox
    • Planet Explorer
    • Platformer
    • Pong
    • Space Invaders 2D
    • Space Invaders 3D
    • Tic Tac Toe
    • Tic Tac Toe 3D
  • Architecture
  • Building a Simple Game with the SimVX Editor

Core Engine

  • Core Engine
  • Node System
  • Input System
  • Windowing Backends
  • Animation
  • SimVX Audio System
  • AssetServer
  • UI System
  • Math Types
  • Collision & Physics
  • Scenes
  • Particles
  • TileMap
  • 2D Lighting
  • Constructive Solid Geometry
  • Navigation
  • 3D Navigation
  • Skeleton
  • Physics Engine
  • WorldEnvironment
  • Testing
  • Package Resources
  • Save System
  • Event Bus

Graphics Backend

  • Graphics Backend
  • App Class
  • Cameras (3D)
  • Draw2D: immediate-mode 2D drawing
  • Materials
  • Custom Shaders
  • Visual Testing

Web

  • Web Export
  • Web export: resource channel

IDE

  • IDE

API Reference

  • API Reference
    • simvx.core
      • simvx.core.physics
      • simvx.core.scene_io
        • simvx.core.scene_io.loader
        • simvx.core.scene_io.source_tree
        • simvx.core.scene_io.edits
        • simvx.core.scene_io.detection
        • simvx.core.scene_io.scene_file
        • simvx.core.scene_io.scene_module
        • simvx.core.scene_io.symbols
        • simvx.core.scene_io.emitter
      • simvx.core.assets
        • simvx.core.assets.sources
          • simvx.core.assets.sources.pkg
          • simvx.core.assets.sources.file
          • simvx.core.assets.sources.mem
          • simvx.core.assets.sources.http
        • simvx.core.assets.loaders
          • simvx.core.assets.loaders.base
          • simvx.core.assets.loaders.json_loader
          • simvx.core.assets.loaders.bytes_loader
        • simvx.core.assets.source
        • simvx.core.assets.server
        • simvx.core.assets.cache
        • simvx.core.assets.handle
      • simvx.core.navigation
        • simvx.core.navigation.path_follower_2d
      • simvx.core.debug
        • simvx.core.debug.overlay
        • simvx.core.debug.ui_inspector
        • simvx.core.debug.profiler
      • simvx.core.port_helpers
        • simvx.core.port_helpers.procedural_textures
      • simvx.core.nodes_3d
        • simvx.core.nodes_3d.path
        • simvx.core.nodes_3d.text
        • simvx.core.nodes_3d.multimesh
        • simvx.core.nodes_3d.remote_transform
        • simvx.core.nodes_3d.node3d
        • simvx.core.nodes_3d.sprite
        • simvx.core.nodes_3d.chase_camera
        • simvx.core.nodes_3d.marker
        • simvx.core.nodes_3d.lights
        • simvx.core.nodes_3d.camera
        • simvx.core.nodes_3d.mesh
        • simvx.core.nodes_3d.spring_arm
      • simvx.core.input
        • simvx.core.input.events
        • simvx.core.input.map
        • simvx.core.input.state
        • simvx.core.input.enums
      • simvx.core.ui
        • simvx.core.ui.core
        • simvx.core.ui.ui_input
        • simvx.core.ui.virtual_scroll
        • simvx.core.ui.autocomplete
        • simvx.core.ui.terminal
        • simvx.core.ui.modal
        • simvx.core.ui.code_edit
        • simvx.core.ui.file_browser
        • simvx.core.ui.syntax_highlighter
        • simvx.core.ui.tabs
        • simvx.core.ui.colour_picker
        • simvx.core.ui.toolbar
        • simvx.core.ui.types
        • simvx.core.ui.clipboard
        • simvx.core.ui.markers
        • simvx.core.ui.split
        • simvx.core.ui.graph_edit
        • simvx.core.ui.virtual_controls
        • simvx.core.ui.testing
        • simvx.core.ui.menu
        • simvx.core.ui.bottom_strip
        • simvx.core.ui.containers
        • simvx.core.ui.tree
        • simvx.core.ui.code_editor_panel
        • simvx.core.ui.folding
        • simvx.core.ui.theme
        • simvx.core.ui.find_replace
        • simvx.core.ui.dock
        • simvx.core.ui.rich_text
        • simvx.core.ui.scroll
        • simvx.core.ui.file_dialog
        • simvx.core.ui.gamepad_overlay
        • simvx.core.ui.ansi_parser
        • simvx.core.ui.widgets
        • simvx.core.ui.completion_types
        • simvx.core.ui.multiline
        • simvx.core.ui.text_paragraph
        • simvx.core.ui.tooltip
        • simvx.core.ui.enums
        • simvx.core.ui.advanced
        • simvx.core.ui.grid_slots
      • simvx.core.text
        • simvx.core.text.msdf
        • simvx.core.text.font
      • simvx.core.math
        • simvx.core.math.matrices
        • simvx.core.math.types
        • simvx.core.math.rect2
        • simvx.core.math.aabb
        • simvx.core.math.curves
        • simvx.core.math.raycast
        • simvx.core.math.transforms
      • simvx.core.animation
        • simvx.core.animation.blend_space
        • simvx.core.animation.state_machine
        • simvx.core.animation.tween
        • simvx.core.animation.player
        • simvx.core.animation.sprite
        • simvx.core.animation.skeletal
        • simvx.core.animation.track
      • simvx.core.graphics
        • simvx.core.graphics.material
        • simvx.core.graphics.shader
        • simvx.core.graphics.mesh
      • simvx.core.navigation3d
        • simvx.core.navigation3d.server
        • simvx.core.navigation3d.nodes
        • simvx.core.navigation3d.mesh
      • simvx.core.nodes_2d
        • simvx.core.nodes_2d.path
        • simvx.core.nodes_2d.text
        • simvx.core.nodes_2d.remote_transform
        • simvx.core.nodes_2d.background_bands
        • simvx.core.nodes_2d.ninepatch
        • simvx.core.nodes_2d.node2d
        • simvx.core.nodes_2d.shapes
        • simvx.core.nodes_2d.ysort
        • simvx.core.nodes_2d.spring_follow
        • simvx.core.nodes_2d.canvas
        • simvx.core.nodes_2d.marker
        • simvx.core.nodes_2d.camera
        • simvx.core.nodes_2d.trail
      • simvx.core.lsp
        • simvx.core.lsp.protocol
        • simvx.core.lsp.server
        • simvx.core.lsp.client
      • simvx.core.testing
        • simvx.core.testing.scene_runner
        • simvx.core.testing.input_sim
        • simvx.core.testing.recorder
        • simvx.core.testing.diagnostics
      • simvx.core.coroutines
      • simvx.core.audio_bus
      • simvx.core.save_manager
      • simvx.core.audio_listener
      • simvx.core.decal
      • simvx.core.selection
      • simvx.core.file_state
      • simvx.core.py_console
      • simvx.core.io
      • simvx.core.scene_tree
      • simvx.core.csg
      • simvx.core.audio_backend
      • simvx.core.cli
      • simvx.core.particles
      • simvx.core.skeleton
      • simvx.core.run
      • simvx.core.surface_tool
      • simvx.core.export
      • simvx.core.gizmo
      • simvx.core.event_bus
      • simvx.core.noise
      • simvx.core.audio_effect
      • simvx.core.shell_node
      • simvx.core.gpu_particles
      • simvx.core.reflection_probe
      • simvx.core.collision
      • simvx.core.tilemap
      • simvx.core.physics_nodes
      • simvx.core.clipboard
      • simvx.core.resource
      • simvx.core.atlas
      • simvx.core.particle_trail
      • simvx.core.audio_errors
      • simvx.core.gesture
      • simvx.core.asset_resolver
      • simvx.core.signals
      • simvx.core.document
      • simvx.core.hot_reload
      • simvx.core.audio_protocol
      • simvx.core.script_embed
      • simvx.core.scripted_demo
      • simvx.core.descriptors
      • simvx.core.script
      • simvx.core.light2d
      • simvx.core.project
      • simvx.core.properties
      • simvx.core.events
      • simvx.core.shapecast
      • simvx.core.audio
      • simvx.core.easing
      • simvx.core.world_environment
      • simvx.core.fog_volume
      • simvx.core.undo
      • simvx.core.clustered_lighting
      • simvx.core.render_queue
      • simvx.core.env_sync_spec
      • simvx.core.shortcuts
      • simvx.core.mesh_lod
      • simvx.core.config
      • simvx.core.node
      • simvx.core.skeleton2d
      • simvx.core.git_status
      • simvx.core.i18n
      • simvx.core.mesh_instance_2d
      • simvx.core.decorators
      • simvx.core.audio_synth
      • simvx.core.viewport
    • simvx.graphics
      • simvx.graphics.streaming
        • simvx.graphics.streaming.server
      • simvx.graphics.assets
        • simvx.graphics.assets.scene_import
        • simvx.graphics.assets.cubemap_loader
        • simvx.graphics.assets.mesh_loader
        • simvx.graphics.assets.image_loader
      • simvx.graphics.platform
      • simvx.graphics.picking
        • simvx.graphics.picking.pick_pass
        • simvx.graphics.picking.raycast_utils
        • simvx.graphics.picking.raycast
      • simvx.graphics.shaders
      • simvx.graphics.renderer
        • simvx.graphics.renderer.render_graph
        • simvx.graphics.renderer.render_pass
        • simvx.graphics.renderer.reflection_probe_pass
        • simvx.graphics.renderer.tilemap_pass
        • simvx.graphics.renderer.shadow_renderer
        • simvx.graphics.renderer.overlay_renderer
        • simvx.graphics.renderer.custom_post_process
        • simvx.graphics.renderer.outline_pass
        • simvx.graphics.renderer.gpu_batch
        • simvx.graphics.renderer.gizmo_pass
        • simvx.graphics.renderer.particle_compute
        • simvx.graphics.renderer.scene_renderer
        • simvx.graphics.renderer.grid_pass
        • simvx.graphics.renderer.draw2d_pass
        • simvx.graphics.renderer.sub_viewport
        • simvx.graphics.renderer.colour_grading
        • simvx.graphics.renderer.light2d_pass
        • simvx.graphics.renderer.volumetric_fog_pass
        • simvx.graphics.renderer.passes
        • simvx.graphics.renderer.game_viewport
        • simvx.graphics.renderer.viewport_manager
        • simvx.graphics.renderer.particle_pass
        • simvx.graphics.renderer.mesh_registry
        • simvx.graphics.renderer.environment_sync
        • simvx.graphics.renderer.shadow_pass
        • simvx.graphics.renderer.pass_orchestrator
        • simvx.graphics.renderer.light_cull_pass
        • simvx.graphics.renderer.shadow_math
        • simvx.graphics.renderer.text_pass
        • simvx.graphics.renderer.skybox_pass
        • simvx.graphics.renderer.point_shadow_pass
        • simvx.graphics.renderer.forward
        • simvx.graphics.renderer.bloom_pass
        • simvx.graphics.renderer.render_target
        • simvx.graphics.renderer.render_context
        • simvx.graphics.renderer.tile_types
        • simvx.graphics.renderer.ibl_pass
        • simvx.graphics.renderer.transparency
        • simvx.graphics.renderer.post_process
        • simvx.graphics.renderer.ssao_pass
        • simvx.graphics.renderer.resource_registry
        • simvx.graphics.renderer.buffer_manager
        • simvx.graphics.renderer.pipeline_manager
        • simvx.graphics.renderer.pass_helpers
      • simvx.graphics.gpu
        • simvx.graphics.gpu.swapchain
        • simvx.graphics.gpu.sync
        • simvx.graphics.gpu.timestamp_pool
        • simvx.graphics.gpu.descriptors
        • simvx.graphics.gpu.pipeline_compute
        • simvx.graphics.gpu.commands
        • simvx.graphics.gpu.pipeline
        • simvx.graphics.gpu.context
        • simvx.graphics.gpu.memory
        • simvx.graphics.gpu.device
        • simvx.graphics.gpu.instance
      • simvx.graphics.ui
        • simvx.graphics.ui.ui_pass
      • simvx.graphics.materials
        • simvx.graphics.materials.custom_shader
        • simvx.graphics.materials.texture
        • simvx.graphics.materials.material
        • simvx.graphics.materials.shader_compiler
      • simvx.graphics.scene
        • simvx.graphics.scene.frustum
        • simvx.graphics.scene.transforms
        • simvx.graphics.scene.camera
        • simvx.graphics.scene.draw_batch
      • simvx.graphics.draw2d_vertex
      • simvx.graphics.engine
      • simvx.graphics.input_adapter
      • simvx.graphics.draw2d_texture
      • simvx.graphics.types
      • simvx.graphics.app
      • simvx.graphics.debug_draw
      • simvx.graphics.testing
      • simvx.graphics.draw2d_text
      • simvx.graphics.draw2d
      • simvx.graphics.text_utils
      • simvx.graphics.text_renderer
      • simvx.graphics.draw2d_transform
      • simvx.graphics.scene_adapter
      • simvx.graphics.draw2d_ops
      • simvx.graphics.playtest_patterns
      • simvx.graphics.playtest
    • simvx.editor
      • simvx.editor.panels
        • simvx.editor.panels.scene_tree
          • simvx.editor.panels.scene_tree.dialogs
          • simvx.editor.panels.scene_tree.panel
          • simvx.editor.panels.scene_tree.type_registry
        • simvx.editor.panels.inspector_sections
        • simvx.editor.panels.inspector_script
        • simvx.editor.panels.status_bar
        • simvx.editor.panels.animation
        • simvx.editor.panels.file_browser
        • simvx.editor.panels.animation_editor
        • simvx.editor.panels.inspector_widgets
        • simvx.editor.panels.anchor_preset_widget
        • simvx.editor.panels.play_controls
        • simvx.editor.panels.console
        • simvx.editor.panels.code_tab
        • simvx.editor.panels.properties
        • simvx.editor.panels.property_widgets
        • simvx.editor.panels.scene3d_view
        • simvx.editor.panels.asset_browser
        • simvx.editor.panels.viewport_math
        • simvx.editor.panels.scene2d_view
        • simvx.editor.panels.section_widgets
        • simvx.editor.panels.repl_panel
        • simvx.editor.panels.profiler_panel
      • simvx.editor.testing
        • simvx.editor.testing.demo_steps
          • simvx.editor.testing.demo_steps.handlers
            • simvx.editor.testing.demo_steps.handlers.inspector
            • simvx.editor.testing.demo_steps.handlers.menu
            • simvx.editor.testing.demo_steps.handlers.nodes
            • simvx.editor.testing.demo_steps.handlers.viewport
          • simvx.editor.testing.demo_steps.steps
      • simvx.editor.game_render_hook
      • simvx.editor.play_mode
      • simvx.editor.scene_diff
      • simvx.editor.refactor_extract
      • simvx.editor.default_scenes
      • simvx.editor.export_controller
      • simvx.editor.workspace_tabs
      • simvx.editor.templates
      • simvx.editor.cli
      • simvx.editor.node_ops
      • simvx.editor.error_recovery
      • simvx.editor.plugin
      • simvx.editor.welcome
      • simvx.editor.app
      • simvx.editor.duplicate_node_dialog
      • simvx.editor.menus
      • simvx.editor.project_registry
      • simvx.editor.about_dialog
      • simvx.editor.keyboard_nav
      • simvx.editor.layout_presets
      • simvx.editor.scene_file_ops
      • simvx.editor.modal_dialog
      • simvx.editor.preferences_dialog
      • simvx.editor.project
      • simvx.editor.web_export
      • simvx.editor.make_custom_class_dialog
      • simvx.editor.script_ops
      • simvx.editor.save_dialog
      • simvx.editor.project_settings_dialog
      • simvx.editor.extract
      • simvx.editor.error_nav
      • simvx.editor.refactor_inline
      • simvx.editor.theme
      • simvx.editor.export_dialog
      • simvx.editor.live_file_ops
      • simvx.editor.project_classes
      • simvx.editor.command_palette
      • simvx.editor.root
      • simvx.editor.state
      • simvx.editor.config
      • simvx.editor.main
      • simvx.editor.commands
      • simvx.editor.gizmo_manipulator
      • simvx.editor.hints
      • simvx.editor.input_map_dialog
      • simvx.editor.unsaved_class_warning_dialog
      • simvx.editor.autosave
      • simvx.editor.rename_class_dialog
    • simvx.ide
      • simvx.ide.widgets
        • simvx.ide.widgets.status_bar
        • simvx.ide.widgets.autocomplete
        • simvx.ide.widgets.goto_line
        • simvx.ide.widgets.minimap
        • simvx.ide.widgets.confirm_dialog
        • simvx.ide.widgets.command_palette
      • simvx.ide.panels
        • simvx.ide.panels.terminal_panel
        • simvx.ide.panels.symbol_outline
        • simvx.ide.panels.settings_panel
        • simvx.ide.panels.output_panel
        • simvx.ide.panels.file_browser
        • simvx.ide.panels.debug_panel
        • simvx.ide.panels.problems_panel
        • simvx.ide.panels.search_panel
      • simvx.ide.dap
        • simvx.ide.dap.client
      • simvx.ide.lint
        • simvx.ide.lint.runner
      • simvx.ide.lsp
        • simvx.ide.lsp.client
      • simvx.ide.debug_session
      • simvx.ide.language_server
      • simvx.ide.file_tabs
      • simvx.ide.editor_integration
      • simvx.ide.app
      • simvx.ide.state
      • simvx.ide.edit_actions
      • simvx.ide.embedded
      • simvx.ide.keybindings
      • simvx.ide.config
      • simvx.ide.playtest
Back to top
View this page

Navigation demo¶

AStar2D click-to-move character on a grid.

▶ Run in browser

Tags: 2d

Demonstrates: Node2D, on_process(), on_draw(), Input mouse position, pathfinding. Click anywhere to move the character along the shortest path. Run: uv run python examples/features/2d/navigation.py

Source¶

  1#!/usr/bin/env python3
  2"""Navigation demo -- AStar2D click-to-move character on a grid.
  3
  4Demonstrates: Node2D, on_process(), on_draw(), Input mouse position, pathfinding.
  5Click anywhere to move the character along the shortest path.
  6Run: uv run python examples/features/2d/navigation.py
  7"""
  8
  9from simvx.core import Input, InputMap, MouseButton, Node2D, Vec2
 10from simvx.graphics import App
 11
 12WIDTH, HEIGHT = 800, 600
 13CELL = 40
 14COLS, ROWS = WIDTH // CELL, HEIGHT // CELL
 15
 16
 17class AStar2D:
 18    """Minimal A* pathfinder on a 2D grid."""
 19
 20    def __init__(self, cols: int, rows: int):
 21        self.cols, self.rows = cols, rows
 22        self.blocked: set[tuple[int, int]] = set()
 23
 24    def neighbors(self, x: int, y: int):
 25        for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
 26            nx, ny = x + dx, y + dy
 27            if 0 <= nx < self.cols and 0 <= ny < self.rows and (nx, ny) not in self.blocked:
 28                yield nx, ny
 29
 30    def find_path(self, start: tuple[int, int], end: tuple[int, int]) -> list[tuple[int, int]]:
 31        if start == end or end in self.blocked:
 32            return []
 33        import heapq
 34
 35        open_set = [(0, start)]
 36        came_from: dict[tuple[int, int], tuple[int, int]] = {}
 37        g_score = {start: 0}
 38
 39        while open_set:
 40            _, current = heapq.heappop(open_set)
 41            if current == end:
 42                path = [current]
 43                while current in came_from:
 44                    current = came_from[current]
 45                    path.append(current)
 46                path.reverse()
 47                return path
 48
 49            for neighbor in self.neighbors(*current):
 50                new_g = g_score[current] + 1
 51                if new_g < g_score.get(neighbor, float("inf")):
 52                    came_from[neighbor] = current
 53                    g_score[neighbor] = new_g
 54                    h = abs(neighbor[0] - end[0]) + abs(neighbor[1] - end[1])
 55                    heapq.heappush(open_set, (new_g + h, neighbor))
 56        return []
 57
 58
 59class NavigationDemo(Node2D):
 60    def on_ready(self):
 61        InputMap.add_action("click", [MouseButton.LEFT])
 62
 63        self.astar = AStar2D(COLS, ROWS)
 64        self.player_cell = (1, 1)
 65        self.player_pos = Vec2(1 * CELL + CELL / 2, 1 * CELL + CELL / 2)
 66        self._nav_path: list[tuple[int, int]] = []
 67        self.move_speed = 200.0
 68        self.target_pos: Vec2 | None = None
 69
 70        # Add some walls
 71        for x in range(5, 15):
 72            self.astar.blocked.add((x, 5))
 73        for y in range(2, 10):
 74            self.astar.blocked.add((8, y))
 75        for x in range(3, 8):
 76            self.astar.blocked.add((x, 10))
 77
 78    def on_process(self, dt: float):
 79        # Click to set destination
 80        if Input.is_action_just_pressed("click"):
 81            mx, my = Input.mouse_position
 82            cell = (int(mx // CELL), int(my // CELL))
 83            if 0 <= cell[0] < COLS and 0 <= cell[1] < ROWS:
 84                start = self.player_cell
 85                self._nav_path = self.astar.find_path(start, cell)
 86                if self._nav_path:
 87                    self._nav_path.pop(0)  # Remove current cell
 88                    self._next_waypoint()
 89
 90        # Move toward current waypoint
 91        if self.target_pos is not None:
 92            diff = self.target_pos - self.player_pos
 93            dist = diff.length()
 94            if dist < 2.0:
 95                self.player_pos = Vec2(self.target_pos.x, self.target_pos.y)
 96                self._next_waypoint()
 97            else:
 98                direction = diff * (1.0 / dist)
 99                self.player_pos += direction * self.move_speed * dt
100
101    def _next_waypoint(self):
102        if self._nav_path:
103            cell = self._nav_path.pop(0)
104            self.player_cell = cell
105            self.target_pos = Vec2(cell[0] * CELL + CELL / 2, cell[1] * CELL + CELL / 2)
106        else:
107            self.target_pos = None
108
109    def on_draw(self, renderer):
110        # Grid
111        for x in range(COLS):
112            for y in range(ROWS):
113                blocked = (x, y) in self.astar.blocked
114                colour = (0.75, 0.22, 0.22) if blocked else (0.12, 0.12, 0.16)
115                renderer.draw_rect((x * CELL, y * CELL), (CELL - 1, CELL - 1), colour=colour, filled=True)
116
117        # Path
118        for cell in self._nav_path:
119            renderer.draw_rect(
120                (cell[0] * CELL + 4, cell[1] * CELL + 4),
121                (CELL - 9, CELL - 9),
122                colour=(0.24, 0.68, 0.28),
123                filled=True,
124            )
125
126        # Player
127        px, py = self.player_pos.x, self.player_pos.y
128        renderer.draw_circle((px, py), CELL // 3, colour=(0.24, 0.71, 1.0), filled=True)
129
130        # HUD
131        renderer.draw_text("Navigation Demo -- Click to move", (10, 10), colour=(1.0, 1.0, 1.0), scale=2)
132
133
134if __name__ == "__main__":
135    App(title="Navigation Demo", width=WIDTH, height=HEIGHT).run(NavigationDemo())
Next
NinePatch
Previous
2D Lighting
Copyright © 2026, SimVX Contributors
Made with Sphinx and @pradyunsg's Furo
On this page
  • Navigation demo
    • Source