clutter学习笔记五----多个 timeline--ClutterScore
Tofloor
poster avatar
z85525006
deepin
2012-02-10 02:18
Author
这些资料不是自己编写出来,是我整理出来了的.只是作个笔记,自己也好翻查,大家也好查查.
先学习完这些,最近比较忙,后面在看clutter给的例子,好好的学习下,先把基础打牢吧!
clutter.Score 加入多个 clutter.Timeline,这些 timeline 可以同时触发,也可以依次触发。学习资料来源: Grouping Timelines in Score , Example 。
  使用方法:先创建一个 ClutterScore,然后通过 clutter.score_append()将各个 timeline 加入。这个函数的第二个参数如果为 NULL,表示作为第一个 timeline 执行,可以同时又多个第一个 timeline,第二个参数也可以是某个 timeline,表明这个 timeline 在某个 timeline 后面依次执行。
这两种方式可以分别表述为并行和串行。假设我们有两个 timeline,间隔时间分别是她 t1 和 t2,他们都分别设置了 maker-reached 的触发,时间分别为 a1 和a2,他们也同时具有 new-frame 的帧刷新触发。
1.png
  上图是串行,即依次执行的说明,一个循环的时间为作为 timeline 的时间总和,即 t1+t2+t3+......+tn,我们需要注意的是有效的 new-frame 时间,一个 timeline 的刷屏触发,只在其有效时间内。我们在 t1 的 new-frame 中设置的动态效果,会在 t2 开始的时候暂停,并在 t1 重新的时候继续执行。
2.png
上图是并行,即同时触发的例子,一个循环时间为 MAX(t1,t2,t3,......,tn),同样如果使用 new-frame
时,需要注意只在 timeline 自己有效的时间范围内。这一点必须强调。
通过并行和串行的两种方式的组合可以构造符合我们需求复制的 timeline 方式。不过根据编程思想,我们应尽量减少重复,力求简洁。通过增加复杂度来渲染自己编程能力是无知者无畏。
deepin.png
下面的例子。设置了两个 timeline,即 timeline1 和 timeliness2,他们的 new-frame
触发分别为旋转和平移一个 png 的图像。同时通过 mark-reached 的触发,将 timestamp 打印出来,来跟
踪他们的执行方式。
  1. #!/usr/bin/env python
  2. # coding:utf-8     
  3. import clutter
  4. class App:
  5.     def __init__ (self):
  6.         self.stage_color = clutter.Color(0x00, 0x00, 0x00, 0xff)
  7.         self.stage = clutter.Stage()
  8.         self.stage.set_size(800, 300)
  9.         self.stage.set_color(self.stage_color)
  10.         self.stage.connect("destroy", clutter.main_quit)
  11.         
  12.         self.rect = clutter.Texture("deepin.png")
  13.         self.rect.set_position(150, 150)
  14.         self.stage.add(self.rect)
  15.         #控制多个时间线
  16.         self.score = clutter.Score()
  17.         self.score.set_loop(True)
  18.         self.timeline1 = clutter.Timeline(5000)
  19.         self.timeline1.add_marker_at_time("my-mark", 1000)
  20.         self.timeline1.connect("new-frame", self.on_timeline_new_frame1)
  21.         self.timeline1.connect("marker-reached", self.on_timeline_marker_reached)
  22.         #并行
  23.         self.score.append(self.timeline1)
  24.         
  25.         self.timeline2 = clutter.Timeline(6000)
  26.         self.timeline2.add_marker_at_time("timeline2", 2000)
  27.         self.timeline2.connect("new-frame", self.on_timeline_new_frame2)
  28.         self.timeline2.connect("marker-reached", self.on_timeline_marker_reached)
  29.         self.score.append(self.timeline2)
  30.         #串行
  31.         #self.score.append(self.timeline1, self.timeline2)
  32.         
  33.         self.score.start()
  34.         self.step = 0
  35.     def run(self):
  36.         clutter.Actor.show_all(self.stage)
  37.    
  38.     def on_timeline_marker_reached(self, timeline, marker_name, msecs_num):
  39.         print "marker %s reached: msec-num = %d" %  (marker_name, msecs_num)
  40.         
  41.     def on_timeline_new_frame1(self, timeline, frame_num):
  42.         self.step += 1.0
  43.         if self.step >= 360:
  44.             self.step = 0
  45.         self.rect.set_rotation( clutter.X_AXIS, self.step, 0, 50, 50)
  46.         
  47.     #时间线2
  48.     def on_timeline_new_frame2(self, timeline, frame_num):
  49.         self.rect.move_by(0.4, 0)
  50. a = App()
  51. a.run()
  52. clutter.main()
Copy the Code
Reply Favorite View the author
All Replies

No replies yet