我需要使用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);
}
我的圈子还在。我想让所有这些都随机移动。我只是不知道如何让它们“移动”。
答案 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 +,但也有其他。