让物体在开罗移动

时间:2016-01-13 21:16:49

标签: c graphics gtk drawing cairo

我需要使用Cairo来使几何公式在屏幕上移动。

如何在开罗“移动”物体(如圈子)?我确实尝试了cairo_translate(cr, x, y)函数,但它似乎改变了所有对象的引用,我不知道如何产生de“运动”。在其他框架中,我会增加x值并使用适当的clock()函数来更改速度以控制FPS,然后我将绘制绘图区域背景并使用新坐标绘制对象。

但我不知道如何用开罗制作这个,我能找到的所有文件都没有提到这是怎么做的。

这是我的代码:

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);
}

我的圈子还在。我想让所有这些都随机移动。我只是不知道如何让它们“移动”。

1 个答案:

答案 0 :(得分:1)

cairo没有动画的东西,它没有对象的概念。使用cairo更像是在画布上使用画笔:一旦你在画布上画了一些东西,它就会卡在那里而你根本无法改变它的属性,更不用说移动了它。

因此,要为使用cairo绘制的内容制作动画,您必须擦除要设置动画的画布部分并再次绘制它。如何做到这一点取决于您用来显示图形的工具包。

从标签中,我假设您使用的是GTK +。 GtkWidget有几种方法,例如gtk_widget_queue_draw()gtk_widget_queue_draw_area(),它们会安排重新绘制窗口小部件。在g_timeout_add()处理程序中调用此方法来安排动画。对于您选择重绘的GtkWidget部分(您可以使用cairo_clip_extents()从绘图处理程序中获取),您将获得一个绘图信号(与您已经使用的相同)。由于当您进入绘图处理程序时画布的相关部分已经空白,您可以开始绘制下一帧。

如果您的需求足够复杂,您可能希望考虑使用专用的动画框架。 Clutter专门设计用于GTK +,但也有其他。