2016-01-13 4 views
0

Je dois utiliser Cairo pour faire défiler les formules géométriques à l'écran.Faire déplacer des objets au Caire

Comment "déplacer" des objets (comme des cercles) au Caire? J'ai essayé la fonction cairo_translate(cr, x, y) mais il semble changer le référentiel pour tous les objets et je ne sais pas comment produire de "mouvement". Dans d'autres frameworks j'augmenterais la valeur x et changerais la vitesse avec une fonction clock() appropriée pour contrôler les FPS, alors je peindrais l'arrière-plan de la zone de dessin et dessinerais l'objet avec de nouvelles coordonnées.

Mais je ne sais pas comment le faire avec Cairo et toute la documentation que je peux trouver ne mentionne pas comment cela est fait.

C'est le code que j'ai:

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

Et mes cercles sont encore. Je voudrais les faire tous bouger au hasard. Je ne sais pas comment les faire bouger.

+1

cairo n'est pas une structure d'animation; pour "animer" les choses dont vous avez besoin pour mettre en file d'attente un redessin de votre zone de dessin à des intervalles de temps donnés et dessiner tout dans le rect qui a changé à nouveau. De plus, les éléments que vous dessinez sur le caire ne sont pas des «objets» en soi; Une fois que vous avez commit quelque chose (avec 'cairo_stroke()' et des amis), il est sur la toile et ne peut plus être changé. – andlabs

+2

"Dans d'autres frameworks j'ajouterais la valeur x et changerais la vitesse avec une fonction clock() appropriée pour contrôler les FPS, puis je peindrais l'arrière-plan de la zone de dessin et dessinerais l'objet avec de nouvelles coordonnées." - D'accord, que se passe-t-il si vous faites ça avec Cairo? – immibis

+0

@immibis, je ne sais pas comment faire ça au Caire. Je ne vois pas de documentation pour contrôler l'horloge des programmes, ni où placer les fonctions incrémentales dans la boucle, etc. Je ne trouve rien qui soit lié à ce sujet. – tvaz

Répondre

1

cairo n'anime pas les choses, et il n'a pas le concept d'objets. Utiliser le cairo, c'est plus comme utiliser un pinceau sur une toile: une fois que vous dessinez quelque chose sur la toile, elle est coincée et vous ne pouvez pas vous y référer pour changer ses propriétés, et encore moins pour la déplacer. Par conséquent, pour animer des objets dessinés avec cairo, vous devez effacer la partie de la toile qui est animée et la dessiner à nouveau. Comment faire cela dépend de la boîte à outils que vous utilisez pour afficher vos graphiques.

Parmi les balises, je suppose que vous utilisez GTK +. Il existe plusieurs méthodes de GtkWidget, telles que gtk_widget_queue_draw() et gtk_widget_queue_draw_area(), qui planifieront un redessin de votre widget. Appelez ceci dans un gestionnaire g_timeout_add() pour planifier votre animation. Vous obtiendrez un signal de dessin (le même que celui que vous utilisez déjà) pour la portion du GtkWidget que vous avez choisi de redessiner (que vous pouvez obtenir depuis le gestionnaire de dessin avec cairo_clip_extents()). Étant donné que la partie pertinente du canevas est déjà masquée lorsque vous entrez dans le gestionnaire de dessin, vous pouvez commencer à dessiner votre prochain cadre.

Vous pouvez envisager d'utiliser un cadre d'animation dédié à la place si vos besoins sont suffisamment compliqués. Clutter est un spécialement conçu pour être utilisé avec GTK +, mais il y en a aussi d'autres.