Godot Comparison

SimVX’s API is modeled on Godot but uses Pythonic conventions. This table maps common Godot patterns to their SimVX equivalents.

API Mapping

Godot (GDScript)

SimVX (Python)

Notes

@export var speed = 5.0

speed = Property(5.0)

Setting is a kept alias for Property

signal health_changed

health_changed = Signal()

Same observable pattern

health_changed.connect(fn)

conn = health_changed.connect(fn)

Returns Connection with disconnect()

health_changed.connect(fn, CONNECT_ONE_SHOT)

health_changed.connect(fn, once=True)

Auto-disconnects after first emit

func _ready():

def ready(self):

No underscore prefix

func _process(delta):

def process(self, dt):

Same

func _physics_process(delta):

def physics_process(self, dt):

Same

$Player/Camera

self["Player/Camera"]

__getitem__ with slash paths

get_node("Player")

self.get_node("Player")

Also works

get_tree()

self.tree

Property; get_tree() kept as alias

queue_free()

self.destroy()

queue_free() kept as alias

get_node("../Sibling")

self.get_node("../Sibling")

Relative paths supported

is_in_group("enemies")

self.is_in_group("enemies")

Same

add_to_group("enemies")

self.add_to_group("enemies")

Same

Structural Differences

  • Language: Pure Python 3.13+ instead of GDScript/C#. Standard Python tooling (pytest, mypy, ruff) applies.

  • Rendering: Vulkan only. No OpenGL fallback. GPU-driven with multi-draw indirect – no per-object draw calls.

  • Math: Vec2/Vec3 are numpy.ndarray subclasses. All rotation APIs use degrees (not radians).

  • Input: Typed enum keys only – InputMap.add_action("jump", [Key.SPACE]). No string-based legacy API.

  • Scenes: JSON serialization via save_scene()/load_scene(). No .tscn/.tres format.

  • Coroutines: Generator-based (yield from wait(0.5)) instead of await. No async/await runtime.

Import Pattern

from simvx.core import Node, Node3D, Camera3D, MeshInstance3D
from simvx.core import Property, Signal, Vec3, Mesh, Material
from simvx.core import InputMap, Key, Input
from simvx.graphics import App

The API is still evolving. When something feels awkward compared to Godot, the engine should be improved rather than worked around.