<chapter id="creating-your-own-behaviours"> <chapterinfo> <author> <firstname>Matthew</firstname> <surname>Allum</surname> <affiliation> <address> <email>mallum@openedhand.com</email> </address> </affiliation> </author> </chapterinfo> <title>Creating You Own Behaviours</title> <para> Clutter comes with a number of fairly generic prebuilt behaviour classes which provide a basis for transitions, animations and other visual effects. However even with the ability to combine a number of these behaviours sometimes they are not enough and a custom behaviour is needed to create a spcific animation. </para> <para> In order to implement a new #ClutterBehaviour subclass the usual machinery for subclassing a GObject should be used. The new subclass then just overides the ClutterBehaviour::alpha_notify() method. This method is passed an alpha value which is then used to compute modifications to any actors the behaviour is applied to. </para> <example id="clutter-behaviour-alpha-notify-example"> <para>This example demonstrates a behaviour that produces a vertical 'wipe' like affect by modifying the actors clip region</para> <programlisting> static void clutter_behaviour_foo_alpha_notify (ClutterBehaviour *behaviour, guint32 alpha_value) { ClutterActor *actor gint i, n; gdouble factor; /* Normalise alpha value */ factor = (gdouble) alpha_value / CLUTTER_ALPHA_MAX_ALPHA; n = clutter_behaviour_get_n_actors (behaviour); /* Change clip height of each applied actor. Note usually better to use * clutter_behaviour_actors_foreach () for performance reasons. */ for (i = 0; i<n; i++) { int clip_height; actor = clutter_behaviour_get_nth_actor (behaviour, i); clip_height = clutter_actor_get_height (actor) - (clutter_actor_get_height (actor) * factor); clutter_actor_set_clip (actor, 0, 0, clutter_actor_get_width (actor), clip_height); } } </programlisting> </example> <para> If the new behaviour is meant to set an initial state on the actors to which its applied to, then the ClutterBehaviour::applied signal class handler should be overridden. </para> </chapter>