Last active
December 20, 2015 22:29
-
-
Save pushcx/6205039 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# an interative animation queue for Crafty | |
Crafty.c "AnimationQueue", | |
init: -> | |
@requires("Tween") | |
@step_done_callback = undefined | |
# animations should be an array of hashes with the keys | |
# tween: a hash that gets passed to tween() | |
# frames: number of frames, passed to tween() | |
# callback: optional, a callback to run after this step completes | |
# done is a callback to run when all steps are completed | |
animate: (animations=[], done) -> | |
@animation_queue ||= [] | |
Array::push.apply @animation_queue, animations | |
# all done callbacks will fire, even if animate() is called multiple times | |
# before finishing. Queueing a new animation from a callback results in | |
# that callback executing immediately, because the queue is in the middle | |
# of finishing. Use window.setInterval(function () {foo.animate(...)}, 0) | |
# to queue after your callback is done. | |
@done_callbacks ||= [] | |
@done_callbacks.push done if done | |
# unbind any existing copies of our callback so that multiple calls to | |
# animate() don't trigger multiple step endings | |
@unbind('TweenEnd').bind 'TweenEnd', (property) => | |
# ignore TweenEnd for anything else | |
return unless property == 'AnimationQueueStepDone' | |
@step_done_callback() if @step_done_callback | |
@step_done_callback = undefined | |
if @animation_queue.length == 0 | |
done() for done in @done_callbacks | |
@done_callbacks = [] | |
return | |
# pop off next animation | |
next = @animation_queue[0] | |
@animation_queue = @animation_queue[1..] | |
# get the next animation tweening | |
next.tween['AnimationQueueStepDone'] = true | |
@tween(next.tween, next.frames) | |
@step_done_callback = next.callback | |
# dummy animation to kick off TweenEnd callback loop | |
@trigger('TweenEnd', 'AnimationQueueStepDone') | |
this |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment