五个演员

凌乱的舞台

Garfileo posted @ 2011年7月15日 14:18 in Clutter 笔记 with tags clutter , 2834 阅读

这篇文章的标题并非暗示我要写一篇文学作品,它只是表示我将“Clutter”与“Stage”这两个英文单词翻译成了中文。本文主要介绍 Clutter Stage 的基本知识。

Clutter 是什么

Clutter 是一个 C 程序库,它对 OpenGL 的 API 进行了过滤和封装,目标是将窗口及部件作为三维空间中的平面元素(2D Surface),让它们快速且平滑的的动起来(当然,这要借助显卡的 3D 加速驱动的支持)。

Clutter 为“平面元素”这个概念提供了术语“Actor(演员)”,本文及后续的文章中我们将一直使用这个术语。

如果想获取 Clutter 更为详细的介绍,建议阅读文献 [1]。

Stage 是什么

Stage 是 Clutter 中的一个基本的 Actor。

“舞台”是“演员”???

我一直都不怎么喜欢面向对象经常反人类的抽象风格,但是为了用 Clutter 做个项目,所以只好忍受它的这一逻辑。

Clutter 库是基于 GObject 库实现的面向对象抽象,其中 ClutterActor [2] 是一个基类,而 ClutterStage 类 [3] 继承了 ClutterActor,因此才有了上文中的逻辑——舞台是演员。

为了充分了解 ClutterStage 继承 ClutterActor 的原理,可能你需要阅读文献 [4, 5]。

ClutterStage 主要作用是为所有的 Actor 构建一个背景。

构建 Stage

下面的例子可以构建一个 Stage,并且单击事件会改变 Stage 的颜色。

#include <clutter/clutter.h>

ClutterColor black_color = { 0x00, 0x00, 0x00, 0xff }; /* 黑色 */
ClutterColor white_color = { 0xff, 0xff, 0xff, 0xff }; /* 白色 */
ClutterColor blue_color  = { 0x00, 0x00, 0xff, 0xff }; /* 蓝色 */

static gboolean
on_stage_button_press (ClutterStage *stage, ClutterEvent *event, gpointer data)
{
        static guint status = 1;
        
        switch (status++) {
        case 0:
                clutter_stage_set_color (CLUTTER_STAGE (stage), &black_color);
                break;
        case 1:
                clutter_stage_set_color (CLUTTER_STAGE (stage), &white_color);
                break;
        default:
                clutter_stage_set_color (CLUTTER_STAGE (stage), &blue_color);
                status = 0;
        }
        
        return TRUE; /* Stop further handling of this event. */
}

int 
main(int argc, char *argv[])
{
        if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
                return 1;
        
        /* 获取默认的 Stage 并设置其尺寸与颜色 */
        ClutterActor *stage = clutter_stage_get_default ();

        clutter_stage_set_title (CLUTTER_STAGE (stage), "Hello Stage!");
        clutter_actor_set_size (stage, 400, 200);
        clutter_stage_set_color (CLUTTER_STAGE (stage), &black_color);
        
        /* 显示 Stage: */
        clutter_actor_show (stage);
        
        /* 使 Stage 可以处理鼠标或键盘的单击信号 */ 
        g_signal_connect (stage, "button-press-event", G_CALLBACK (on_stage_button_press), NULL);
        
        /* 开启 Clutter 主循环,响应事件 */
        clutter_main ();
        
        return 0;
}

clutter_init() 函数是 Clutter 的初始化函数,它在运行时会创建一个 Stage 对象并将其作为应用程序默认的 Stage。在需要使用这个 Stage 对象时,可使用 clutter_stage_get_default() 函数获取它。

由于 Stage 是 Actor 的子类,所以 Actor 类的公共方法对于 Stage 也是有效的,例如上述代码中使用了 clutter_actor_set_size() 函数来设置 Stage 的长度与宽度,并使用了 clutter_actor_show() 函数显示 Stage。

Stage 类也提供了自己的一些方法,例如上例中的 clutter_stage_set_title() 与 clutter_stage_set_clor() 函数,分别设置 Stage 所在窗口的标题以及 Stage 颜色。

值得注意的是 Clutter 的 Actor 对象通常提供了一些信号,因此可使用 g_signal_connect() 函数将特定的 Actor 对象的信号与回调函数挂接起来。

上述示例最后使用的 clutter_main() 函数可以开启 Clutter 的主循环,使得应用程序响应事件。

编译与运行

可使用 gcc 编译上述示例(假设 C 文件为 stage.c):

$ gcc $(pkg-config --cflags --libs clutter-1.0) stage.c -o stage

程序运行结果见下图:

参考文献

[1] Clutter 的概述

[2] ClutterActor 文档

[3] ClutterStage 文档

[4] 使用 GObject 库模拟类的数据封装形式

[5]  GObject 的子类继承

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter