Skip to content

Commit

Permalink
Merge pull request #61 from maniek2332/ft/transitions_dict
Browse files Browse the repository at this point in the history
Running multiple transitions for single node
  • Loading branch information
labuzm committed Feb 16, 2020
2 parents 9c79131 + 8f5d36f commit 9027225
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 2 deletions.
87 changes: 87 additions & 0 deletions demos/transitions2/main.py
Original file line number Diff line number Diff line change
@@ -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())
4 changes: 3 additions & 1 deletion kaa/kaacore/nodes.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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

Expand Down
5 changes: 5 additions & 0 deletions kaa/kaacore/transitions.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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":
Expand Down
4 changes: 4 additions & 0 deletions kaa/nodes.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
33 changes: 33 additions & 0 deletions kaa/transitions.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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):
Expand Down Expand Up @@ -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()
)
2 changes: 1 addition & 1 deletion kaacore

0 comments on commit 9027225

Please sign in to comment.