From 8f5d36fa8b66309ce1f23292a9d263945a6a24fe Mon Sep 17 00:00:00 2001 From: maniek2332 Date: Mon, 10 Feb 2020 23:01:20 +0100 Subject: [PATCH] added NodeTransitionsManager --- demos/transitions2/main.py | 87 +++++++++++++++++++++++++++++++++++++ kaa/kaacore/nodes.pxd | 4 +- kaa/kaacore/transitions.pxd | 5 +++ kaa/nodes.pxi | 4 ++ kaa/transitions.pxi | 33 ++++++++++++++ kaacore | 2 +- 6 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 demos/transitions2/main.py diff --git a/demos/transitions2/main.py b/demos/transitions2/main.py new file mode 100644 index 00000000..a2cb1f07 --- /dev/null +++ b/demos/transitions2/main.py @@ -0,0 +1,87 @@ +import os +import random + +from kaa.engine import Engine, Scene +from kaa.input import Keycode +from kaa.geometry import Vector, Circle +from kaa.sprites import Sprite +from kaa.nodes import Node +from kaa.physics import SpaceNode, BodyNode +from kaa.colors import Color +from kaa.transitions import ( + NodeTransitionsSequence, NodeTransitionsParallel, AttributeTransitionMethod, + NodePositionTransition, NodeRotationTransition, NodeScaleTransition, + NodeColorTransition, NodeCustomTransition, BodyNodeVelocityTransition, + NodeTransitionDelay, NodeTransitionCallback, +) + + +PYTHON_IMAGE_PATH = os.path.join('demos', 'assets', 'python_small.png') + + +def random_color(): + return Color(random.random(), random.random(), random.random()) + + +class DemoTransitionsScene(Scene): + def __init__(self): + self.camera.position = Vector(0., 0.) + self.python_img = Sprite(PYTHON_IMAGE_PATH) + + self.obj = self.root.add_child(Node( + position=Vector(-50, 0), + shape=Circle(10.), + color=random_color(), + )) + + self.obj.transitions_manager.set( + 'movement', + NodePositionTransition( + Vector(100, 30), 3000., + advance_method=AttributeTransitionMethod.add, + loops=0, back_and_forth=True, + ) + ) + + def _randomize_color_transition(self): + return NodeColorTransition( + random_color(), 2000., + loops=0, back_and_forth=True, + ) + + def update(self, dt): + for event in self.input.events(): + if event.keyboard_key and event.keyboard_key.is_key_down: + pressed_key = event.keyboard_key.key + if pressed_key == Keycode.q: + self.engine.quit() + elif pressed_key == Keycode.num_1: + self.obj.transitions_manager.set( + 'color', self._randomize_color_transition() + ) + elif pressed_key == Keycode.num_2: + self.obj.transitions_manager.set( + 'pseudo_timer', + NodeTransitionsSequence([ + NodeTransitionDelay(1000.), + NodeTransitionCallback( + lambda node: node.transitions_manager.set( + 'color', self._randomize_color_transition(), + ) + ) + ]) + ) + elif pressed_key == Keycode.num_0: + self.obj.transitions_manager.set( + 'color', None + ) + self.obj.transitions_manager.set( + 'pseudo_timer', None + ) + + +if __name__ == '__main__': + with Engine(virtual_resolution=Vector(300, 300)) as engine: + engine.window.size = Vector(800, 600) + engine.window.center() + engine.run(DemoTransitionsScene()) diff --git a/kaa/kaacore/nodes.pxd b/kaa/kaacore/nodes.pxd index 0a587b86..a7336b80 100644 --- a/kaa/kaacore/nodes.pxd +++ b/kaa/kaacore/nodes.pxd @@ -10,7 +10,7 @@ from .fonts cimport CTextNode from .shapes cimport CShape from .sprites cimport CSprite from .scenes cimport CScene -from .transitions cimport CNodeTransitionHandle +from .transitions cimport CNodeTransitionHandle, CNodeTransitionsManager from .exceptions cimport raise_py_error @@ -95,6 +95,8 @@ cdef extern from "kaacore/nodes.h" nogil: CNodeTransitionHandle transition() except +raise_py_error void transition(const CNodeTransitionHandle& transition) except +raise_py_error + CNodeTransitionsManager& transitions_manager() except +raise_py_error + CScene* scene() except +raise_py_error CNodePtr parent() except +raise_py_error diff --git a/kaa/kaacore/transitions.pxd b/kaa/kaacore/transitions.pxd index 8c327d66..6379685e 100644 --- a/kaa/kaacore/transitions.pxd +++ b/kaa/kaacore/transitions.pxd @@ -2,6 +2,7 @@ from libc.stdint cimport uint32_t from libcpp cimport bool from libcpp.vector cimport vector from libcpp.memory cimport unique_ptr +from libcpp.string cimport string from .exceptions cimport raise_py_error @@ -26,6 +27,10 @@ cdef extern from "kaacore/transitions.h" nogil: cdef CNodeTransitionHandle make_node_transitions_parallel(const vector[CNodeTransitionHandle]&, ...) \ except +raise_py_error + cdef cppclass CNodeTransitionsManager "kaacore::NodeTransitionsManager": + CNodeTransitionHandle get(const string& name) except +raise_py_error + void set(const string& name, const CNodeTransitionHandle& transition) except +raise_py_error + cdef extern from "kaacore/node_transitions.h" nogil: cdef enum CAttributeTransitionMethod "kaacore::AttributeTransitionMethod": diff --git a/kaa/nodes.pxi b/kaa/nodes.pxi index 43b48198..56549f0f 100644 --- a/kaa/nodes.pxi +++ b/kaa/nodes.pxi @@ -297,6 +297,10 @@ cdef class NodeBase: else: self._get_c_node().transition(CNodeTransitionHandle()) + @property + def transitions_manager(self): + return _NodeTransitionsManager.create(self._c_node_ptr) + cdef class Node(NodeBase): def __init__(self, **options): diff --git a/kaa/transitions.pxi b/kaa/transitions.pxi index eeb51591..68a23857 100644 --- a/kaa/transitions.pxi +++ b/kaa/transitions.pxi @@ -8,6 +8,7 @@ from .kaacore.vectors cimport CVector from .kaacore.sprites cimport CSprite from .kaacore.transitions cimport ( CNodeTransitionHandle, CTransitionWarping, + CNodeTransitionsManager, CAttributeTransitionMethod, CNodePositionTransition, CNodeRotationTransition, CNodeScaleTransition, CNodeColorTransition, CBodyNodeVelocityTransition, @@ -16,6 +17,7 @@ from .kaacore.transitions cimport ( make_node_transition, make_node_transitions_sequence, make_node_transitions_parallel ) +from .kaacore.nodes cimport CNodePtr class AttributeTransitionMethod(IntEnum): @@ -219,3 +221,34 @@ cdef NodeTransitionBase get_transition_wrapper(const CNodeTransitionHandle& tran py_transition._setup_handle(transition) return py_transition + + +cdef class _NodeTransitionsManager: + cdef CNodePtr c_node + + def __init__(self): + raise ValueError("This class shouldn't be initialized manually!") + + @staticmethod + cdef create(CNodePtr c_node): + assert c_node + cdef _NodeTransitionsManager manager = \ + _NodeTransitionsManager.__new__(_NodeTransitionsManager) + manager.c_node = c_node + return manager + + def get(self, str transition_name): + cdef CNodeTransitionHandle c_transition = \ + self.c_node.get().transitions_manager().get(transition_name.encode('ascii')) + if c_transition: + return get_transition_wrapper(cmove(c_transition)) + + def set(self, str transition_name, NodeTransitionBase transition): + if transition is not None: + self.c_node.get().transitions_manager().set( + transition_name.encode('ascii'), transition.c_handle + ) + else: + self.c_node.get().transitions_manager().set( + transition_name.encode('ascii'), CNodeTransitionHandle() + ) diff --git a/kaacore b/kaacore index 8b800c2d..9de3bc57 160000 --- a/kaacore +++ b/kaacore @@ -1 +1 @@ -Subproject commit 8b800c2d43c3ee8d348325261612024a5b00873e +Subproject commit 9de3bc57b93183500caa180397ec50f193fdeb25