You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.4 KiB

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)