2016-01-13 2 views
0

Мне нужно использовать Каир, чтобы геометрические формулы перемещались по экрану.Перемещение объектов в Каир

Как можно «перемещать» объекты (например, круги) в Каире? Я попробовал функцию cairo_translate(cr, x, y), но, похоже, изменил ссылку на все объекты, и я не знаю, как создать «движение». В других рамках я бы увеличил значение 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

cairo - это не анимационная структура; чтобы «оживить» вещи, которые вам нужно поставить в очередь на перерисовку области рисования с заданными временными интервалами и нарисовать все в прямоугольнике, которое снова изменилось. Также элементы, которые вы рисуете на каире, не являются «объектами» как таковыми; как только вы что-то совершите (с 'cairo_stroke()' и друзьями), он находится на холсте и больше не может быть изменен. – andlabs

+2

«В других рамках я увеличил бы значение x и изменил бы скорость с помощью соответствующей функции clock() для управления FPS, затем я бы рисовал фон области рисования и рисовал объект с новыми координатами». - Хорошо, что произойдет, если вы сделаете это с Каиром? – immibis

+0

@immibis, я не знаю, как это сделать в Каире. Я не вижу никакой документации для управления часами программ или для размещения инкрементных функций в цикле и т. Д. Я просто не нахожу ничего связанного с этой темой. – tvaz

ответ

1

cairo не анимирует вещи, и у него нет понятия объектов. Использование cairo больше похоже на использование кисти на холсте: когда вы рисуете что-то на холсте, оно застряло там, и вы не можете ссылаться на него, чтобы вообще изменить его свойства, не говоря уже о его перемещении.

Поэтому, чтобы оживить вещи, нарисованные каиром, вы должны вытереть часть холста, которая анимируется, и снова нарисовать ее. Как это сделать, зависит от того, какой инструментарий вы используете для отображения вашей графики.

Из тегов, я полагаю, вы используете GTK +. Существует несколько методов GtkWidget, таких как gtk_widget_queue_draw() и gtk_widget_queue_draw_area(), которые планируют перерисовку вашего виджета. Позвоните в обработчик g_timeout_add(), чтобы запланировать анимацию. Вы получите сигнал рисования (тот же, который вы используете уже) для части GtkWidget, которую вы выбрали для перерисовки (которую вы можете получить из обработчика рисования с помощью cairo_clip_extents()). Поскольку соответствующая часть холста будет удалена уже при вводе обработчика рисования, вы можете просто начать рисовать следующий кадр.

Возможно, вы захотите рассмотреть использование выделенной структуры анимации, если ваши потребности достаточно сложны. Clutter - это специально разработанный для использования с GTK +, но есть и другие.