clutter学习笔记二(不是教程,请不要骂人)
Tofloor
poster avatar
z85525006
deepin
2012-02-05 00:50
Author
Stage Widget
使用 GtkClutterEmbed 可以将一个 ClutterStage 放在 GTK+ 窗口中。比如,窗口可能包含其它的 GTK+ widget,可以与 stage 中的actor 交互。使用 gtk_clutter_embed_new() 初始化 widget,然后像其它 GTK+ widget 一样,将它加入一个容器 (container)。调用gtk_clutter_embed_get_stage 从GtkClutterEmbed widget 获得 ClutterStage ,然后就可以使用 Clutter API 了。
当使用 GtkClutterEmbed widget 时,应该使用 gtk_clutter_init 而不是 clutter_init() 和 gtk_init() 初始化 Clutter 和GTK+。
使用 gtk_main() 而不是 clutter_main() >进入 main 循环。

C语言可以这样使用.pytwhon没有用过,找不到相关,改天我问问王勇.

==========================================================================

标准的 Clutter actors 具有 2D 形状,能够在三维空间定位和旋转,但它们没有深度。因此理论上讲,当恰好旋转到边面对屏幕时,actor 不可见。
当需要复杂的 3D 对象时,就需要使用 OpenGL ES
API 了,附录 Implementing Actors 有相关阐述。现在,我们看下标准的 actor :

clutter.Rectangle: 一个矩形;
clutter.Text :     文本
clutter.Texture : 图像
clutter.Label :   显示文本
clutter.Entry : 可以被编辑的文本

============================
例子:
  1. #!/usr/bin/env python
  2. #! coding:utf-8
  3. import clutter
  4. import gtk
  5. class Clutter():
  6.     def __init__(self):
  7.        stage = clutter.Stage()
  8.       
  9.        clutter.Actor.set_size(stage,400,200)
  10.        stage.connect('destroy', clutter.main_quit) #退出clutter窗口
  11.        label = clutter.Text()
  12.        label.set_font_name('Mono 32')
  13.        label.set_text("Linux Deepin")
  14.        label.set_position(50, 30)
  15.        stage.add(label)
  16.        stage.show()
  17.        clutter.main()
  18.       
  19.       
  20. Clutter()
Copy the Code
========================================
每个 actor 都应该调用  ****.add() 函数加入 stage,紧接着要指定它的位置。所有的 actor 都继承自 ClutterActor,所
有可以通过调用 clutter.Actor.set_position设置 x 和 y 坐标,用clutter.Actor.set_depth() 设置 z 坐标,用
clutter.Actor.set_size() 设置宽和高。
actor 的位置是以其所在容器(如 stage)的左上角为原点 , 但原点可以调用 clutter.Actor.set_anchor_point()改变。
缺省状态下,actor 是隐藏的,所以要记得调用 clutter.actor.show() 显示 actor,之后也可以调用clutter.actor.hide() 隐藏它。
linux.png
运行看看,图片是不是在stage的左上角,然后调用clutter.Actor.set_anchor_point()再来试试,一定很好玩!
  1. #!/usr/bin/env python
  2. #! coding:utf-8
  3. import clutter
  4. import gtk
  5. class Clutter():
  6.     def __init__(self):
  7.        stage = clutter.Stage()
  8.        stage_color = clutter.Color(0x00, 0x00, 0x0, 0xff)
  9.       
  10.        stage.set_size(350,350) #也可以clutter.Actor.set_size(stage,350,350)
  11.        stage.set_color(stage_color)
  12.        #图片
  13.        rect = clutter.Texture("linux.png")
  14.        stage.add(rect)
  15.        stage.connect('destroy', clutter.main_quit) #退出clutter窗口
  16.        stage.show()   
  17.        clutter.main()
  18.       
  19.     #def        
  20. Clutter()
Copy the Code
================================================
Actor 可以进行缩放、旋转、部分透明等变换。
缩放调用:
clutter.Actor.set_scale 来增加或减少actor 的大小。
注意,这不会改变 clutter.Actor.get_width()和clutter.Actor.搞clutter.Actor.get_height() 的结果,因为这仅仅在视觉效果上改变了 actor 的大小。再次调用 clutter.Actor.set_scale() 将代替之前的变换而不是在现有的结果上进行。
==============================================================
剪切
Actors 也可以被"剪切",通过 clutter_actor_set_clip() 可以控制 actor 的一部分被显示,参数中给出剪切的矩形区域。 比如,可以
这样实现滚动,创建一个大容器,每次设置剪切矩形使仅仅一小部分可见。 Scrolling up could then be implemented by moving the actor down
while moving the clip up. 剪切可以调用clutter.Actor.remove_clip() 删除。
剪切域之外的区域不消耗显存,不需要太多处理。
移动clutter.Actor.set_scale()和clutter.Actor.set_rotation()的移动函数,但是可以通过调用clutter.actor.move_by() 或者 clutter.actor.set_depth () 来移动 actor。
不像缩放和旋转操作,clutter.actor.move_by() 实质上改变 clutter.actor.get_x() 等函数的结果。
========================================================
例子:
  1. #!/usr/bin/env python
  2. #! coding:utf-8
  3. import clutter
  4. import gtk
  5. class Clutter():   
  6.     def __init__(self):
  7.        self.click_num = 0
  8.        stage = clutter.Stage()
  9.        stage_color = clutter.Color(0x00, 0x00, 0x0, 0xff)
  10.        actor_color = clutter.Color(0xff, 0xff, 0xff, 0xB0)
  11.       
  12.        stage.set_size(350,350) #也可以clutter.Actor.set_size(stage,400,200)
  13.        stage.set_color(stage_color)
  14.        #图片
  15.        self.rect = clutter.Texture("linux.png")
  16.        stage.add(self.rect)
  17.        self.rect.set_position(150,100)
  18.        self.label = clutter.Text("微软雅黑 14", "欢迎你加入深度Linux", actor_color)
  19.        stage.add(self.label)
  20.       
  21.        stage.connect('destroy', clutter.main_quit) #退出clutter窗口
  22.        stage.connect('button-press-event', self.on_stage_button_press)
  23.       
  24.        stage.show_all()
  25.        clutter.main()
  26.    
  27.     def on_stage_button_press(self, stage, event):
  28.         print '深度Linux'
  29.         self.click_num += 1
  30.         
  31.         if self.click_num == 1:
  32.             self.label.set_scale(3.0, 1.0)
  33.         
  34.         elif self.click_num == 2:
  35.             self.label.set_scale(3.0, 1.0)
  36.         
  37.         elif self.click_num == 3:
  38.             self.label.set_scale(3.0, 2.0)   
  39.             self.rect.set_clip(20.0, 20.0, 50.0, 50.0)
  40.             
  41.         elif self.click_num == 4:
  42.             self.rect.set_scale(1.0, 1.0)
  43.         
  44.         else:
  45.             self.rect.move_by(10, 5)
  46.             self.label.move_by(0, 10)  
  47.         #缩放测试
  48.         
  49. if __name__ == "__main__":            
  50.     Clutter()
Copy the Code
     
      
=========================================================
旋转调用:
clutter_actor_set_rotation() 可以围绕 x 轴、y 轴、z 轴旋转 actor, 旋转轴和旋转角度在参数中指定,CLUTTER_X_AXIS、
clutter.X_AXIS [requires y and z]、clutter.Y_AXIS [requires x and z ], clutter.Z_AXIS [requires x and y]分别代表 x,y,z 轴。三个轴中只有两个轴的坐标被指定,具体哪两个轴,依旋转轴而定。比如,当使用 CLUTTER_X_AXIS 时, y 和 z 参数指定了在 X 轴上的旋转中心。 跟 clutter.Actor.set_scale() 类似, 旋转操作只在视觉效果上操作,不会影响 actor 的真正位置、宽、高,clutter.Actor.get_x() 的接口依然返回旋转之前的值。
跟 clutter.Actor.set_scale() 类似,旋转操作发生在视觉效果上,不会影响 actor 的真正位置、宽、高,clutter.Actor.get_x() 的
接口依然返回旋转之前的值。
=========================================================
123.png
clutter真的很好学!不过我也是刚刚入门而已!
例子:
  1. #!/usr/bin/env python
  2. #! coding:utf-8
  3. import clutter
  4. import gtk
  5. class Clutter():   
  6.     def __init__(self):
  7.        self.axis = clutter.X_AXIS
  8.        self.angle = 0.0
  9.        stage = clutter.Stage()
  10.        stage_color = clutter.Color(0x00, 0x00, 0x0, 0xff)
  11.        actor_color = clutter.Color(0xff, 0xff, 0xff, 0xB0)
  12.       
  13.        stage.set_size(350,350) #也可以clutter.Actor.set_size(stage,400,200)
  14.        stage.set_color(stage_color)
  15.        #图片
  16.        self.rect = clutter.Texture("linux.png")
  17.        stage.add(self.rect)
  18.        self.rect.set_position(150,100)
  19.        label = clutter.Text("微软雅黑 14", "欢迎你加入深度Linux", actor_color)
  20.        stage.add(label)
  21.       
  22.        stage.connect('destroy', clutter.main_quit) #退出clutter窗口
  23.        stage.connect('button-press-event', self.on_stage_button_press)
  24.       
  25.        stage.show_all()
  26.        clutter.main()
  27.    
  28.     def on_stage_button_press(self, stage, event):
  29.         print '深度Linux'
  30.         #Rotaion Testing。指定转轴的方向,以及转轴的位置,因此如果 X 轴,通过这是 Y、Z 来给出转轴位置
  31.         self.angle += 10
  32.         if self.axis == clutter.X_AXIS:
  33.             self.rect.set_rotation(clutter.X_AXIS, self.angle, 0.0, 100.0,50.0)
  34.             if self.angle > 359:
  35.                 self.angle = 0.0
  36.                 self.axis  = clutter.Y_AXIS
  37.             return True
  38.         
  39.         if self.axis  == clutter.Y_AXIS:
  40.             self.rect.set_rotation(clutter.Y_AXIS, self.angle, 50.0, 0.0, 0.0)
  41.             if self.angle > 359:
  42.                 self.angle = 0.0
  43.                 self.axis  = clutter.Z_AXIS
  44.             return True
  45.         
  46.         if self.axis  == clutter.Z_AXIS:
  47.             self.rect.set_rotation(clutter.Z_AXIS, self.angle, 0.0, 0.0, 0.0)
  48.             if self.angle > 359:
  49.                 self.angle = 0.0
  50.                 self.axis  = -1
  51.             return True
  52. if __name__ == "__main__":            
  53.     Clutter()
Copy the Code
=========================================================
有一个clutter.Timeline是可以很好玩的
Reply Favorite View the author
All Replies
leaeasy
deepin
2012-02-05 04:22
#1
太好了,我找了很久了
Reply View the author
dshbusiness
deepin
2012-02-05 04:23
#2
看看,lz精神可嘉
Reply View the author