from node import Node from typing import Optional, List from pygame import time, Surface """ class Scene(Node): def __init__(self, root: Node): super().__init__() self.is_active = True def active(self): self.is_active = True def deactivate(self): self.is_active = False def is_active(self): return self.is_active def _draw(self, surface: Surface): if self.is_active: for child in self.children: if isinstance(child, Node2D): child._draw(surface) def draw(self, surface: Surface): self._draw(surface) """ class SceneTree: def __init__(self, initial_scene: Node = None): self.root: Optional[Node] = None self.current_scene: Optional[Node] = initial_scene self._nodes_to_process: List[Node] = [] self._nodes_to_add: List[Node] = [] self._nodes_to_delete: List[Node] = [] # self._physics_nodes: List[Node] = [] self._running = False self.timer: time.Clock = time.Clock() def start(self, initial_scene: Node = None): self.root = Node("Root") self.current_scene = initial_scene if initial_scene else self.root\ if self.current_scene is None else self.current_scene self.root.add_child(self.current_scene) self.root.add_child(self.current_scene) self.root._enter_tree() self.root._ready() self._running = True def change_scene(self, scene): self._running = False self.current_scene = scene self.root = scene.root self._running = True def _process(self, delta: float): pass def process(self, delta: float): self.root._process(delta) """ def physics_process(self, delta: float): self.root._physics_process(delta) """ def update(self): for node in self._nodes_to_process: node.process() def queue_delete(self, node: str): node = self.root.get_node(node) if node is None: return if node in self._nodes_to_delete: return if node in self._nodes_to_process: self._nodes_to_process.remove(node) self._nodes_to_delete.append(node) if node in self._nodes_to_add: self._nodes_to_add.remove(node)