Bonjour,
j'ai écri un petit jeu de la vie mais j'ai quelques problèmes de "mise en forme".
J'utilise pour le jeu lui-même une drawing area et c'est elle qui me pose le plus de problèmes :
1) je raffraichit ma drawing_area de 640x480 pixel par pixel, j'ai un bouton play pour boucler le raffraichissement et pause pour le stopper mais entre le moment où je fais pause et celui ou les itérations s'arrêtent, il y a 9 itérations de plus (et non une comme attendu puisque celle en cours doit finir).
les fonctions concernées :
2) j'utilise le signal motion_notify_event pour pouvoir dessiner sur la drawing_area mais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 void iteration(fenetre *f) { int i,j; int R_AVANT=f->couleur[0].red/257,V_AVANT=f->couleur[0].green/257,B_AVANT=f->couleur[0].blue/257; int R_FOND=f->couleur[1].red/257,V_FOND=f->couleur[1].green/257,B_FOND=f->couleur[1].blue/257; guchar col[LARGEUR*HAUTEUR*3]; copie_tab(f->color,col,LARGEUR*HAUTEUR*3); for(i=0;i<LARGEUR;i++) for(j=0;j<HAUTEUR;j++) { switch(regles(col,i,j,R_AVANT,V_AVANT,B_AVANT,f->reglages)) { case 0:changer_couleur_point(f->color, i, j,R_FOND,V_FOND,B_FOND);break; case 1:changer_couleur_point(f->color, i, j,R_AVANT,V_AVANT,B_AVANT);break; case -1:changer_couleur_point(f->color, i, j,col[(i+j*LARGEUR)*3],col[(i+j*LARGEUR)*3+1],col[(i+j*LARGEUR)*3+2]);break; default:break; } } gtk_widget_queue_draw(f->drawing_area); if(f->anim!='S' && compare_tab(col,f->color)==0) { f->anim='S'; } switch(f->anim) { case 'F': gtk_label_set_text(GTK_LABEL(f->stabilite),FORCE); f->iteration++; gtk_label_set_text(GTK_LABEL(f->nb_iteration),g_strdup_printf("%d",f->iteration)); break; case 'N':/* normalement pas possible */ gtk_label_set_text(GTK_LABEL(f->stabilite),PAUSE); f->iteration++; gtk_label_set_text(GTK_LABEL(f->nb_iteration),g_strdup_printf("%d",f->iteration)); break; case 'S': gtk_label_set_text(GTK_LABEL(f->stabilite),g_strdup_printf("%s %d",STABLE,f->iteration)); gtk_label_set_text(GTK_LABEL(f->nb_iteration),g_strdup_printf("%d",f->iteration)); break; case 'P': gtk_label_set_text(GTK_LABEL(f->stabilite),NON_STABLE); f->iteration++; gtk_label_set_text(GTK_LABEL(f->nb_iteration),g_strdup_printf("%d",f->iteration)); break; default:break; } } void play(GtkWidget *widget,gpointer d) { fenetre *f=(fenetre *) d; f->anim='P'; while(f->anim=='P') { iteration(f); gtk_main_iteration(); } } void pause(GtkWidget *widget,gpointer d) { char *c=(char *) d; *c='N'; }
a) le dessin n'est pas fluide (il y a des points qui "sautent" : au lieu d'avoir une courbe "continue", j'ai un ensemble de points)
b) quand je bouge la souris en ayant fait play, le raffraichissment qui devrait avoir lieu n'est pas fait jusqu'à ce que je ne bouge plus le pointeur mais les itérations sont faites.
la fonction en cause est :
3) comment marche la fonction gtk_file_chooser_set_preview_widget ? je n'arrive pas à afficher un widget en fonction du fichier sélectionné car je ne sais comment savoir qu'un ficher est sélectionné :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 gint motion_notify_event (GtkWidget *widget, GdkEventMotion *event,gpointer data) { fenetre *f=(fenetre *) data; gint x,y; int R_AVANT=f->couleur[0].red/257,V_AVANT=f->couleur[0].green/257,B_AVANT=f->couleur[0].blue/257; GdkModifierType state; if(event->is_hint) gdk_window_get_pointer(widget->window,&x,&y,&state); else { x=event->x; y=event->y; state=(GdkModifierType)event->state; } if(state && event->type==GDK_MOTION_NOTIFY && f->color!=NULL && x>0 && y>0 && x<LARGEUR && y<HAUTEUR) { changer_couleur_point(f->color,(int)x,(int)y, R_AVANT, V_AVANT,B_AVANT); gtk_widget_queue_draw(widget); } return TRUE; }
PS : je sauvegarde ma drawing_area en la copiant dans un pixbuf, peut-on la sauvegarder directement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 void ouvrir(GtkWidget *widg,gpointer data) { fenetre *f=(fenetre *) data; f->anim='N'; f->selection=gtk_file_chooser_dialog_new("Ouvrir une image...",GTK_WINDOW(f->win), GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_OK,NULL); gtk_window_set_modal(GTK_WINDOW(f->selection),TRUE); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(f->selection),gtk_image_new_from_file(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(f->selection)))); switch(gtk_dialog_run(GTK_DIALOG(f->selection))) { case GTK_RESPONSE_OK: f->chemin=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(f->selection)); ouvrir_chemin(f); gtk_widget_destroy(f->selection); break; default:break; } }
PS2 : f->anim=='P' veut dire play, 'S' stable, 'N' ou autre pause.
Partager