IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

drawing area et itérations


Sujet :

GTK+ avec C & C++

  1. #1
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut drawing area et itérations
    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 :

    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';
    }
    2) j'utilise le signal motion_notify_event pour pouvoir dessiner sur la drawing_area mais :
    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 :

    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;
    }
    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
    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;
        }
    }
    PS : je sauvegarde ma drawing_area en la copiant dans un pixbuf, peut-on la sauvegarder directement ?
    PS2 : f->anim=='P' veut dire play, 'S' stable, 'N' ou autre pause.

  2. #2
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162

  3. #3
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    pour gtk_file_chooser j'ai la réponse : http://library.gnome.org/devel/gtk/2...leChooser.html

  4. #4
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    personne ?

  5. #5
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    peut-on utiliser les threads en c , si oui comment?

  6. #6
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    j'ai vu que les thread en gtk+ existaient mais apparemment c'est compliqué...
    comment faire pour que l'affichage soit fluide alors qu'il est raffraichit aprés un cacul sur un tableau de 640x480 (int) ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Le motion event doit être émis très très très souvent. Si tu ne demandes le rafraichissement de ta drawing area qu'une fois sur 100 ou sur 1000, est-ce que ça aide ?

  8. #8
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    je sais pas trop, le motion event doit en effet être demander souvent...quand je dessine et c'est peut être pour ça que le trait n'est pas fluide mais en diminuant l'échantilonnage c'est pas vraiment mieux.

    Et en ce qui concerne le raffraichisement il ne se sert pas du motion event..

    PS : je viens de tester en désactivant les signaux de la souris...marche pas, j'ai les même problèmes (sauf celui du dessin bien sûr)

Discussions similaires

  1. Drawing area - problème d'affichage
    Par Bertrand_g dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 20/03/2008, 21h59
  2. Gtkmm - Drawing area - crash
    Par Bertrand_g dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 20/03/2008, 14h19
  3. Dessiner sur une drawing area
    Par Fibus dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 19/12/2007, 16h57
  4. Drawing area
    Par Blackshade dans le forum GTK+ avec PHP
    Réponses: 4
    Dernier message: 06/06/2007, 16h51
  5. Image de fond dans un drawing area
    Par smux dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 15/09/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo