Перемещение объектов в Каир

91
10

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

Как "перемещать" объекты (например, круги) в Каире? Я попытался 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);
}

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

спросил(а) 2016-01-14T00:16:00+03:00 3 года, 11 месяцев назад
1
Решение
46

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

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

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

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

ответил(а) 2016-01-17T05:37:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема