在泰本机应用程序中的动画

简介

本文将演示如何使动画泰本机应用程序中。 这篇文章的目的是提出了外语图书馆这是负责建造泰 GUI 本机应用程序所提供的可能性。 我们想把主题放在一个简洁的方式和使用大量的示例代码。 读这篇文章可以后所获得的知识用于游戏开发,以及在用户界面中执行有趣的效果。

这篇文章是针对那些有基本的了解,C 编程语言的开发人员创建的。 阅读这篇文章的开发人员应该有关于泰本机应用程序生命周期的基本知识。 然而,它是不必要的知识来理解这里展示的范例。

在附加到这篇文章的示例应用程序,您可以看到使用所描述的方法进行的动画。 使用各种各样的缓动函数来修改动画物体的运动进行动画。

执行

有很多机会结识动画泰本机应用程序中。 所有的方式来实现动画,在这篇文章介绍了基于执行动画步骤里面的回调函数。 在很多游戏中,使用从加速度计或陀螺仪的传感器的读数进行控制。 以下文章中介绍了这种方法。 你要记住回调应该用适当的频率调用或调用之间动画应该平稳的。 若要创建平滑动画可以使用称为 Ecore 动画的 EFL 库子集。 在本文稍后部分,您将学习有关它的详细信息。 一个好的做法是使用三角洲定时技术以消除速度显示动画,与当前的帧速率的变化相关联的波动。 这一点尤其重要,如果我们想要获得高精度的运动在我们的动画。

另一种方式进行动画处理的对象是时间的设置一个计时器,在指定间隔将触发动画更新功能。 它可能是一个好的解决方案,在种情况下,我们想要比当前的帧速率要慢的动画的地方。 这种类型的动画可以有用,当你想要在你的游戏使例如雪碧动画。 下面的代码演示如何注册回调:

    #define INTERVAL_IN_SECONDS 0.5

     /* callback function */
    static Eina_Bool
    cb_function(void *data)
    {
        /* do the animation step */
    
        return ECORE_CALLBACK_RENEW;
    }

    […]

    /* register the timer */
    ecore_timer_add(INTERVAL_IN_SECONDS, cb_function, data);

无限调用动画回调函数必须返回 ECORE_CALLBACK_RENEW。 您还可以取消该动画在任何时候通过返回值 ECORE_CALLBACK_CANCEL

英语图书馆,其中基于 GUI 泰本机应用程序,包含称为 Ecore 动画师,开发以创建动画的一个子集。 有了这个工具,您可以创建一个回调将调用每次当您的程序将呈现一个框架。 下面的代码演示如何注册 Ecore 动画回调:

    /* callback function */
    static Eina_Bool
    cb_function(void *data)
    {
        /* do the animation step */
    
        return ECORE_CALLBACK_RENEW;
    }

    […]

    /* register the callback */
    ecore_animator_add(cb_function, data);

在 ecore_timer 的情况下,可以在任何时候,当一个回调函数返回的值从 ECORE_CALLBACK_CANCEL 停止动画。 Ecore 动画使你能够通过调用 ecore_animator_freeze() 来冻结随时动画。 在那之后,您可以通过调用 ecore_animator_thaw () 继续动画。

    /* register the callback */
    Ecore_Animator *animator = ecore_animator_add(cb_function, data);
    
    […]
    
    /* Stop animation */
    Ecore_animator_freeze(animator); 
    
    /* Play animation after freeze */
    Ecore_animator_thaw(animator); 

也是动画的可能性设置我们的时间。 在这种情况下在回调函数的参数之一,我们收到有关在动画中位置的信息。 接收的值是一个浮点数从 0.0 到 1.0。 本文附带的示例应用程序使用所描述的方法。

    /* animation time in seconds */
    #define ANIM_TIME 1.2
     
    […]

    /* callback function */
    static Eina_Bool
    cb_function (void *data, double position)
    {
    	/* do the animation step */

     	return EINA_TRUE;
    }

    […]

    /* register the timer */
    ecore_animator_timeline_add(ANIM_TIME, cb_function, data);

Ecore 动画还提供了一整套的缓动函数用来映射在动画中,基于 ecore_animator_pos_map() 函数内部的动画对象的位置的位置。 您可以轻松地执行的动画,例如对象加速或反弹。 此主题的详细的说明可以在这里找到。 在示例程序中已实现方式如下:

    /* animation time in seconds */
    #define ANIM_TIME 1.2
    
    […]
    
    int screen_width;
    int screen_height;  
    
    […]
    
    static void
    evas_object_rotate(Evas_Object *object, double degree){
        Evas_Map *m;
        Evas_Coord x, y, w, h;
        m = evas_map_new(4);
        evas_object_geometry_get(object, &x, &y, &w, &h);
        evas_map_util_points_populate_from_object(m, object);
        evas_map_util_rotate(m, degree, x + (w / 2), y + (h / 2));
        evas_object_map_set(object, m);
        evas_object_map_enable_set(object, EINA_TRUE);
    }
    
    […]
    
    /* callback function */
    static Eina_Bool
    _do_animation(void *data, double pos)
    {
         double frame = pos;
         int x, y;
         frame = ecore_animator_pos_map(pos, animation_type, 0.0, 0.0);
         
          /* some mathematical calculations of new X and Y position
          X = …;
          Y = …;
          Double rotation_angle = …; 
           */
    
          […]
    
         evas_object_rotate(data, rotation_angle );
    
         evas_object_move(data, x, y);
    
         return EINA_TRUE;
    }

    […]

    /* register the timer */
    ecore_animator_timeline_add(ANIM_TIME, _do_animation, data);

此动画更改位置的对象和它的自转。 动画的太空飞船的移动量依据相切轨迹。 根据变量 animation_type 的值,一个不同的位置被映射每次和动画的对象加快、 减慢或移动均匀。

摘要

在这篇文章中,我们提出了如何创建的动画在特定的时间间隔调用步骤。 我们还描述了步骤执行沿呈现使用 ecore_animator 的每个帧的动画。  此外,这篇文章演示如何停止和恢复动画以及如何实施是内置的缓动函数 EFL 图书馆。 如果你想要探索更多的英语,你应该查阅相关的文档。

文件附件: 
List
SDK Version Since: 
2.3.1