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
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) |