Clutter学习(六):actor的一些动态效果

  Clutter的一个优点在于它很容易处理一些动态效果,我们在这里可以学习基本的处理,通过这些基本的动作,组合可以模拟一些3D的效果。学习资料来源: http://www.openismus.com/documents/clutter_tutorial/0.9/docs/tutorial/html/sec-actors-transformations.html

  下面的一个程序在之前的学习中都学过,通过按键来触发动态效果的处理。

#include <stdlib.h>
#include <clutter/clutter.h>

ClutterActor * rect, * label;

static gboolean on_stage_button_press(ClutterStage *stage, ClutterEvent *event,gpointer data){
// ……这个是动态效果的处理,我们在后面详细说明,这里先略去。
        return TRUE;
}

int main(int argc , char * argv[]){
        /* 对于color的第四个参数alpha因子的测试表明,这是亮度或者灰度,实际RBG的值是前面的数值*alpha/256 */
        ClutterColor stage_color ={0x00,0x00,0x00,0xff};
        ClutterColor actor_color ={0xff,0xff,0xff,0xB0};

        clutter_init(&argc, & argv);

        ClutterActor *stage = clutter_stage_get_default();
        clutter_actor_set_size(stage,350,350);
        clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);

        /* 在stage中添加一个方框(已注释)或者一个图片,用于后诉的兼容性的试验 */
        //rect = clutter_rectangle_new_with_color(&actor_color);
        //clutter_actor_set_size(rect,100,100);

        rect = clutter_texture_new_from_file("1_flowingflying.jpg" ,NULL);
        clutter_container_add_actor(CLUTTER_CONTAINER(stage),rect);
        clutter_actor_set_position(rect,150,100);

        /* 在stage中加入一个label */
        label = clutter_text_new_full ("微软雅黑 14", "你好,朋友", &actor_color);
        clutter_actor_set_position(label,150,240);
        clutter_container_add_actor(CLUTTER_CONTAINER(stage),label);
        g_signal_connect(stage,"button-press-event",G_CALLBACK(on_stage_button_press),NULL);

        clutter_actor_show_all (stage);//无需为每个actor都show一次
        clutter_main();
        return EXIT_SUCCESS;
}

  兼容性再次讨论 :我们将主体部分抽出,这样可以集中于后面描述的动态效果部分。另外我们在这里想进一步讨论兼容性问题。rect中,我们实验了方框和价值图片的例子。在我的ATI显卡的机器上,使用clutter1.0来运行,这两部分有差异,不是rect本身,而是对label的影响。这里很奇怪的,使用方框的方式,label的显示有问题,就如上一次学习中。但是很奇怪,如果我们显示图像,则label显示正常。这是两个独立的actor。作为一种现象,我们记录下来,可能图形显示涉及更多的底层功能,这些功能能够确保label的显示正常。Curious!

  下面是动态效果,基本分为转动、平移、缩放、部分显示。我们先分别根据X轴、Y轴、Z轴进行旋转,分别旋转一周,每次旋转10度,饭后进行缩放试验、继而部分显示和恢复,最后进行平移试验。

static gboolean on_stage_button_press(ClutterStage *stage, ClutterEvent *event, gpointer data){
        static int click_num = 0;
        static double angle =0.0;
        static ClutterRotateAxis axis = CLUTTER_X_AXIS;
        angle += 10;

        //Rotaion Testing。指定转轴的方向,以及转轴的位置,因此如果X轴,通过这是Y、Z来给出转轴位置

        switch(axis){
        case CLUTTER_X_AXIS:
                clutter_actor_set_rotation (rect,CLUTTER_X_AXIS ,angle, 0.0,100.0,50.0);
                if(angle > 359){
                        angle = 0.0;
                        axis = CLUTTER_Y_AXIS;
                }
                return TRUE;
        case CLUTTER_Y_AXIS:
                clutter_actor_set_rotation (rect,CLUTTER_Y_AXIS ,angle, 50.0,0.0,0.0);
                if(angle > 359){
                        angle = 0.0;
                        axis = CLUTTER_Z_AXIS;
                }
                return TRUE;
        case CLUTTER_Z_AXIS:
                clutter_actor_set_rotation (rect,CLUTTER_Z_AXIS ,angle, 0.0,0.0,0.0);
                if(angle > 359){
                        angle = 0.0;
                        axis = -1;
                }
                return TRUE;
        default:
                break;
        }
        //End of Rotaion Testing

        click_num ++;
        switch(click_num ){
        case 1:
                //缩放实验,参数二、三分别表示X轴和Y轴的缩放
                clutter_actor_set_scale (label,3.0,1.0);
                clutter_actor_set_scale(rect,1.2,1.0);
                break;
        case 2:
                clutter_actor_set_scale(label,3.0,2.0);
                clutter_actor_set_scale(rect,1.0,1.0);//恢复原来尺寸
                break;
        case 3:
                //部分显示实验,参数分别表示从哪开始显示,显示的大小,可视部分是方形
                clutter_actor_set_scale(label,3.0,3.0);
                clutter_actor_set_clip (rect,20.0,20.0,50.0,50.0);
                break;
        case 4:
                clutter_actor_set_scale(label,1.0,1.0);
                printf("Clip REMOVE Test:");
                clutter_actor_remove_clip (rect);//去除删减
                break;
        default:
                //移位测试,当然我们也可以用set_position的方式,但是那需要计算在stage的位置,这里只需给出每次的位移。
                clutter_actor_move_by (rect,-10,5);
                clutter_actor_move_by(label,0,-10);
                break;
        }

        return TRUE;
}

 

相关链接:
我的Clutter相关博客

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值