让物体在开罗移动

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+ 一起使用而设计的,但也有其他的。