凌乱的舞台
这篇文章的标题并非暗示我要写一篇文学作品,它只是表示我将“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 文档
[5] GObject 的子类继承
转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com