tvaz Posted January 13, 2016 at 09:05 PM Report Share #591944 Posted January 13, 2016 at 09:05 PM Boas, Preciso de fazer mover várias formas geométricas numa drawing area no Cairo, mas não faço ideia de como o fazer (e não encontro documentação útil neste tópico). Se por um lado parece que preciso usar cairo_translate(cr, x, y) para movimentar um objeto na drawing area, por outro não sei como fazer a chamada sucessiva à função para apresentar a imagem em novas coordenadas por frame (noutros frameworks chamaria a função no loop e controlaria os fps's por uma função clock( ) ). O código que tenho de momento é este: 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); } e tenho os objetos parados no ecrã. Gostava de saber como os fazer mover aleatoriamente no Cairo. Obrigado! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 13, 2016 at 09:31 PM Report Share #591946 Posted January 13, 2016 at 09:31 PM o cairo serve somente para pintar algo numa superfície, algo que não tem nada haver com o gestor da janela. o que quero dizer é que não apresentas o código responsável pela actualização da tua janela. código esse onde deverás "repintar" as bolas. para "mover" as bolas, basta actualizar a informação posicional destas na estrutura existente no array de bolas : balls_MAP IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
tvaz Posted January 13, 2016 at 10:06 PM Author Report Share #591947 Posted January 13, 2016 at 10:06 PM (edited) o cairo serve somente para pintar algo numa superfície, algo que não tem nada haver com o gestor da janela. o que quero dizer é que não apresentas o código responsável pela actualização da tua janela. código esse onde deverás "repintar" as bolas. para "mover" as bolas, basta actualizar a informação posicional destas na estrutura existente no array de bolas : balls_MAP Obrigado pela resposta. Estou a ver. Então, pelo que entendi: devo chamar num loop o 'g_signal_connect()', que tem o CALLBACK da função acima, alterando antes o array das posições das figuras. Ele não "atualiza" mas sim refaz a drawing area com os novos dados. Será isso? Mas como controlo a frequência do loop? Isto é, como diminuo os frames para tornar percetivel o movimento das figuras? EDIT: mas se colocar a g_signal_connect() num loop ele não entra no main() e não escuta os eventos. Como devo fazer o loop? Eis o meu código: gtk_init(&argc, &argv); GtkWidget *display = gtk_window_new(GTK_WINDOW_TOPLEVEL), *actarea = gtk_drawing_area_new(); gtk_window_set_position(GTK_WINDOW(display), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(display), PROG.width, PROG.height); gtk_window_set_title(GTK_WINDOW(display), PROG.title); gtk_container_add(GTK_CONTAINER(display), actarea); g_signal_connect(G_OBJECT(display), "destroy", G_CALLBACK(quit), NULL); g_signal_connect(G_OBJECT(actarea), "draw" , G_CALLBACK(on_draw_event), NULL); gtk_widget_show_all(display); gtk_main(); return 0; Edited January 13, 2016 at 11:20 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 13, 2016 at 10:42 PM Report Share #591949 Posted January 13, 2016 at 10:42 PM http://stackoverflow.com/questions/34497652/manually-control-gtk-widget-redraw-tick-rate IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now