让物体在开罗移动
Make objects move in Cairo
我需要使用 Cairo 让几何公式在屏幕上移动。
开罗的一个 "move" 对象(如圆圈)如何?我确实尝试了 cairo_translate(cr, x, y)
函数,但它似乎更改了所有对象的引用,我不知道如何生成 de "movement"。在其他框架中,我会增加 x
值并使用适当的 clock()
函数更改速度以控制 FPS,然后我会绘制绘图区域背景并使用新坐标绘制对象。
但我不知道如何用 Cairo 制作这个,我能找到的所有文档都没有提到这是如何完成的。
这是我的代码:
genRandVector(numOfBalls);
/* creates big ball */
cairo_set_line_width(cr, 5);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_arc(cr, balls_MAP[0].x, balls_MAP[0].y, CONF.big_rad, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
cairo_fill(cr);
/* creates other balls */
int i;
cairo_close_path(cr);
cairo_set_source_rgb(cr, 0, 0, 0);
for(i = 1; i < numOfBalls; i++) {
cairo_arc(cr, balls_MAP[i].x, balls_MAP[i].y, CONF.small_rad, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_fill(cr);
cairo_close_path(cr);
}
我的圈子还在。我想让他们都随机移动。我只是不知道怎么做 "move".
cairo 没有动画,也没有对象的概念。使用 cairo 更像是在 canvas 上使用画笔:一旦你在 canvas 上画了东西,它就会卡在那里,你根本无法引用它来改变它的属性,更不用说移动它了左右。
因此,要为用 cairo 绘制的东西设置动画,您必须擦除正在设置动画的 canvas 部分,然后重新绘制。如何做到这一点取决于您用来显示图形的工具包。
根据标签,我假设您使用的是 GTK+。 GtkWidget 有几种方法,例如 gtk_widget_queue_draw()
和 gtk_widget_queue_draw_area()
,它们将安排您的小部件的重绘。在 g_timeout_add()
处理程序中调用它来安排您的动画。对于您选择重绘的 GtkWidget 部分(您可以使用 cairo_clip_extents()
从绘图处理程序中获取),您将获得一个绘图信号(与您已经使用的信号相同)。由于 canvas 的相关部分在您进入绘制处理程序时已经被消隐,因此您可以开始绘制下一帧。
如果您的需求足够复杂,不妨考虑使用专用的动画框架。 Clutter 是专为与 GTK+ 一起使用而设计的,但也有其他的。
我需要使用 Cairo 让几何公式在屏幕上移动。
开罗的一个 "move" 对象(如圆圈)如何?我确实尝试了 cairo_translate(cr, x, y)
函数,但它似乎更改了所有对象的引用,我不知道如何生成 de "movement"。在其他框架中,我会增加 x
值并使用适当的 clock()
函数更改速度以控制 FPS,然后我会绘制绘图区域背景并使用新坐标绘制对象。
但我不知道如何用 Cairo 制作这个,我能找到的所有文档都没有提到这是如何完成的。
这是我的代码:
genRandVector(numOfBalls);
/* creates big ball */
cairo_set_line_width(cr, 5);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_arc(cr, balls_MAP[0].x, balls_MAP[0].y, CONF.big_rad, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
cairo_fill(cr);
/* creates other balls */
int i;
cairo_close_path(cr);
cairo_set_source_rgb(cr, 0, 0, 0);
for(i = 1; i < numOfBalls; i++) {
cairo_arc(cr, balls_MAP[i].x, balls_MAP[i].y, CONF.small_rad, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_fill(cr);
cairo_close_path(cr);
}
我的圈子还在。我想让他们都随机移动。我只是不知道怎么做 "move".
cairo 没有动画,也没有对象的概念。使用 cairo 更像是在 canvas 上使用画笔:一旦你在 canvas 上画了东西,它就会卡在那里,你根本无法引用它来改变它的属性,更不用说移动它了左右。
因此,要为用 cairo 绘制的东西设置动画,您必须擦除正在设置动画的 canvas 部分,然后重新绘制。如何做到这一点取决于您用来显示图形的工具包。
根据标签,我假设您使用的是 GTK+。 GtkWidget 有几种方法,例如 gtk_widget_queue_draw()
和 gtk_widget_queue_draw_area()
,它们将安排您的小部件的重绘。在 g_timeout_add()
处理程序中调用它来安排您的动画。对于您选择重绘的 GtkWidget 部分(您可以使用 cairo_clip_extents()
从绘图处理程序中获取),您将获得一个绘图信号(与您已经使用的信号相同)。由于 canvas 的相关部分在您进入绘制处理程序时已经被消隐,因此您可以开始绘制下一帧。
如果您的需求足够复杂,不妨考虑使用专用的动画框架。 Clutter 是专为与 GTK+ 一起使用而设计的,但也有其他的。