From acc28cf60c482bf56bb298630a9d1b75f350d31b Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Tue, 31 Aug 2010 17:42:37 +0100 Subject: [PATCH] cookbook: Added example for animation reuse recipe Added an example showing how to reuse a ClutterAnimator instance to animate multiple actors at different times using an animatable rig, combined with reparenting. --- doc/cookbook/examples/Makefile.am | 2 + doc/cookbook/examples/animations-reuse.c | 117 ++++++++++++++++++ doc/cookbook/examples/animations-reuse.json | 124 ++++++++++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 doc/cookbook/examples/animations-reuse.c create mode 100644 doc/cookbook/examples/animations-reuse.json diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index 6039c690b..e1bcd81b9 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -4,6 +4,7 @@ NULL = noinst_PROGRAMS = \ animations-complex \ + animations-reuse \ animations-rotating \ text-shadow \ textures-reflection \ @@ -45,6 +46,7 @@ AM_CFLAGS = \ AM_LDFLAGS = $(CLUTTER_LIBS) -export-dynamic animations_complex_SOURCES = animations-complex.c +animations_reuse_SOURCES = animations-reuse.c animations_rotating_SOURCES = animations-rotating.c text_shadow_SOURCES = text-shadow.c textures_reflection_SOURCES = textures-reflection.c diff --git a/doc/cookbook/examples/animations-reuse.c b/doc/cookbook/examples/animations-reuse.c new file mode 100644 index 000000000..2a7ffbecd --- /dev/null +++ b/doc/cookbook/examples/animations-reuse.c @@ -0,0 +1,117 @@ +#include +#include + +gboolean +foo_button_pressed_cb (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + ClutterScript *script = CLUTTER_SCRIPT (user_data); + + ClutterAnimator *bounce; + ClutterActor *rig; + ClutterTimeline *bounce_timeline; + + clutter_script_get_objects (script, + "bounce_timeline", &bounce_timeline, + "rig", &rig, + "bounce", &bounce, + NULL); + + /* don't allow animation to be reused until it is complete */ + if (clutter_timeline_is_playing (bounce_timeline)) + return TRUE; + + clutter_actor_set_position (rig, 0, 0); + + clutter_actor_set_scale (rig, 1.0, 1.0); + + clutter_actor_reparent (actor, rig); + + clutter_animator_start (bounce); + + return TRUE; +} + +/* set the actor's position to the rig's position + * but parented to the background; + * remove the click handler so the rectangle can't be animated again + */ +static void +_move_to_background_cb (ClutterActor *actor, + gpointer user_data) +{ + ClutterActor *background = CLUTTER_ACTOR (user_data); + + gfloat x, y; + clutter_actor_get_position (clutter_actor_get_parent (actor), &x, &y); + + gdouble scale_x, scale_y; + clutter_actor_get_scale (clutter_actor_get_parent (actor), &scale_x, &scale_y); + + clutter_actor_reparent (actor, background); + + clutter_actor_set_position (actor, x, y); + clutter_actor_set_scale (actor, scale_x, scale_y); + + g_signal_handlers_disconnect_matched (actor, + G_SIGNAL_MATCH_FUNC, + 0, + 0, + NULL, + foo_button_pressed_cb, + NULL); +} + +void +foo_rig_animation_complete_cb (ClutterTimeline *timeline, + gpointer user_data) +{ + ClutterScript *script = CLUTTER_SCRIPT (user_data); + + ClutterContainer *rig; + ClutterActor *background; + + clutter_script_get_objects (script, + "rig", &rig, + "background", &background, + NULL); + + clutter_container_foreach (rig, + CLUTTER_CALLBACK (_move_to_background_cb), + background); +} + +int +main (int argc, char *argv[]) +{ + clutter_init (&argc, &argv); + + gchar *filename = "animations-reuse.json"; + GError *error = NULL; + + ClutterScript *script = clutter_script_new (); + clutter_script_load_from_file (script, filename, &error); + + if (error != NULL) + { + g_critical ("Error loading ClutterScript file %s\n%s", filename, error->message); + g_error_free (error); + exit (EXIT_FAILURE); + } + + clutter_script_connect_signals (script, script); + + ClutterActor *stage; + clutter_script_get_objects (script, + "stage", &stage, + NULL); + + clutter_actor_show (stage); + + clutter_main (); + + g_object_unref (script); + + return EXIT_SUCCESS; +} diff --git a/doc/cookbook/examples/animations-reuse.json b/doc/cookbook/examples/animations-reuse.json new file mode 100644 index 000000000..c300cd9e9 --- /dev/null +++ b/doc/cookbook/examples/animations-reuse.json @@ -0,0 +1,124 @@ +[ + { + "type" : "ClutterStage", + "id" : "stage", + "width" : 550, + "height" : 400, + "color" : "#333355ff", + + "signals" : [ + { "name" : "destroy", "handler" : "clutter_main_quit" } + ], + + "children" : [ + + { + "type" : "ClutterRectangle", + "id" : "rect1", + "color" : "red", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect2", + "color" : "blue", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect3", + "color" : "green", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterGroup", + "id" : "background" + }, + + { + "type" : "ClutterGroup", + "id" : "rig" + } + + ] + }, + + { + "type" : "ClutterAnimator", + "id" : "bounce", + "timeline" : { + "type" : "ClutterTimeline", + "id" : "bounce_timeline", + "duration" : 3000, + + "signals" : [ + { "name" : "completed", "handler" : "foo_rig_animation_complete_cb" } + ] + }, + + "properties" : [ + { + "object" : "rig", + "name" : "x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 100.0 ], + [ 0.6, "easeOutCubic", 150.0 ], + [ 0.8, "linear", 350.0 ], + [ 1.0, "linear", 500.0 ] + ] + }, + { + "object" : "rig", + "name" : "y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 200.0 ], + [ 0.6, "easeOutBounce", 200.0 ], + [ 0.8, "linear", 200.0 ], + [ 1.0, "linear", 0.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + } + ] + } +]