让物体在开罗移动

Posted

技术标签:

【中文标题】让物体在开罗移动【英文标题】:Make objects move in Cairo 【发布时间】:2016-01-13 21:16:48 【问题描述】:

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

如何在开罗“移动”物体(如圆圈)?我确实尝试了cairo_translate(cr, x, y) 函数,但它似乎改变了所有对象的引用,我不知道如何产生“运动”。在其他框架中,我会增加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);

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

【问题讨论】:

cairo 不是动画框架;要“动画化”事物,您需要在给定的时间间隔内对绘图区域的重绘进行排队,并在矩形中绘制所有重新更改的内容。此外,您在 cairo 上绘制的元素本身也不是“对象”;一旦你提交了一些东西(与cairo_stroke() 和朋友一起),它就在画布上并且不能再更改了。 “在其他框架中,我会增加 x 值并使用适当的 clock() 函数来改变速度以控制 FPS,然后我将绘制绘图区域背景并使用新坐标绘制对象。” - 好吧,如果你在开罗这样做会发生什么? @immibis,我不知道在开罗怎么做。我没有看到控制程序时钟的文档,或者在循环中放置增量函数的位置等。我只是没有找到与该主题相关的任何内容。 @tvaz 我以为开罗只会画东西。循环、增加 x 值和计时都不是绘制东西,所以 Cairo 不这样做。 是的,您必须将所有用于显示内容的东西都排成队列。对于 GTK+,这将是 gtk_widget_queue_draw() 系列函数与 g_timeout_add() 结合在计时器上运行。还有专门的动画框架,例如 Clutter(可以与 GTK+ 一起使用)。您需要弄清楚什么最适合您的需求。 【参考方案1】:

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

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

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

如果您的需求足够复杂,您不妨考虑使用专用的动画框架。 Clutter 是专门为与 GTK+ 一起使用而设计的,但还有其他的。

【讨论】:

以上是关于让物体在开罗移动的主要内容,如果未能解决你的问题,请参考以下文章

unity里怎么让一个物体在在5秒内从某点移动到另外一点?

在unity3d里无法移动物体

Unity 物体轨迹移动

unity3d让物体移动固定距离

unity3d中如何让物体从一个点自动移动到另一个点呢,

unity中让物体移动到鼠标点击位置(单击移动和双击暂停移动)