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 :

projet GTK+ jeu graphique


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut projet GTK+ jeu graphique
    bonjour,
    je travaille sur un projet qui fait partie de mon parcour scolaire .
    en effet il faut creer une fenetre où il y a des pions à deplacer , j'ai aussi besoin de recuperer les coordonnées d'un clic de la souris sur cette fenetre .
    j'ai commencer à coder et c'est mon code:
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <stdlib.h>
    #include <gtk/gtk.h>
    void deplacement(double *xc,double *yc){
      *xc=20;
      *yc=150;
    }
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
    {
    	if(event->type == GDK_BUTTON_PRESS)
    	{
    		g_print("x:%d y:%d\n",(int)event->x,(int)event->y);
    		return TRUE;
    	}
    	else
    	{
    		g_print("what else ?");
    		return FALSE;
    	}
    }
     
    gboolean circle_expose_cb(GtkWidget *wi, GdkEventExpose *ev, gpointer user_data)
    {
       cairo_t *cr;
       double xc;
       double yc;
       /* Create a cairo context */
       cr = gdk_cairo_create(wi->window);
       deplacement(&xc,&yc);
       /* Set it to a medium green */
       cairo_set_source_rgb(cr, 0, 0.7, 0);
       /* Draw a circle in the center */
       cairo_arc(cr,xc ,yc ,10, 0, 2*G_PI);
       /* Fill the circle */
       cairo_fill(cr);
     
       /* Free the context */
       cairo_destroy(cr);
     
       return FALSE;
    }
    int main(int argc,char **argv){
      GtkWidget *pWindow;
      GtkWidget *pImage;
      GtkWidget *pVBox;
      GtkWidget *window;
    GtkWidget *event_box;
    /*creation de la fenetre principale*/  
    	gtk_init(&argc,&argv);
     	pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
      	gtk_widget_set_size_request(GTK_WIDGET(pWindow),320,400);
      	gtk_window_set_position(GTK_WINDOW(pWindow),GTK_WIN_POS_CENTER);
      	gtk_window_set_title(GTK_WINDOW(pWindow),"JIPTO");
      	g_signal_connect(G_OBJECT(pWindow),"destroy",G_CALLBACK(gtk_main_quit),NULL);
     
     	pVBox = gtk_vbox_new(FALSE,0);
      	gtk_container_add(GTK_CONTAINER(pWindow),pVBox);
      	pImage = gtk_image_new_from_file("./plateau.png");
     
      	gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5);
     
      	g_signal_connect_after(pWindow, "expose-event", G_CALLBACK(circle_expose_cb), NULL);
      	window=GTK_WIDGET(pWindow);
     
     
     	/*g_object_ref(pImage);
        	gtk_container_remove(GTK_CONTAINER(pWindow), pImage);
         	gtk_container_add(GTK_CONTAINER(pVBox), pImage);
         	g_object_unref(pImage);*/
     
    	event_box=gtk_event_box_new();
    	gtk_container_add(GTK_CONTAINER(pVBox), event_box);
       	gtk_container_add(GTK_CONTAINER(event_box), pImage);
    	gtk_widget_add_events(event_box,GDK_BUTTON_PRESS_MASK);
      	g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(on_button_press_event),  NULL);
    	/*affichage de tout*/
    	gtk_widget_show_all(pWindow);
     
     	/*fermeture de gtk*/
        	gtk_main();
     
        	return EXIT_SUCCESS;
    }
    en executant , je trouve le cercle que j'ai dessiné (avec cairo) mais j'arrive pas à recuperer les coordonnées du clic de la souris
    le shell m'affiche ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Attempting to add a widget with type GtkImage to a container of type GtkEventBox, but the widget is already inside a container of type GtkVBox, the GTK+ FAQ at http://library.gnome.org/devel/gtk-faq/stable/ explains how to reparent a widget.
    serait il possible de m'aider ?
    merci d'avance .

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Les ligne 59 et 72 entrent en conflit... Tu essaies d'ajouter ton widget dans 2 conteneurs différents. Il faut choisir l'un ou l'autre: soit dans ton eventbox, sois dans ton GtkVBox. Crée ton eventbox un peu avant la ligne 59, et remplace le pImage de la ligne 59 par ton eventbox.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut projet GTK+ jeu graphique
    c'est toujours le meme probleme mais cette fois ci il y a detection des coordonnées de la souris sans afficher le cercle .
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <stdlib.h>
    #include <gtk/gtk.h>
    void deplacement(double *xc,double *yc){
      *xc=20;
      *yc=150;
    }
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
    {
    	if(event->type == GDK_BUTTON_PRESS)
    	{
    		g_print("x:%d y:%d\n",(int)event->x,(int)event->y);
    		return TRUE;
    	}
    	else
    	{
    		g_print("what else ?");
    		return FALSE;
    	}
    }
     
    gboolean circle_expose_cb(GtkWidget *wi, GdkEventExpose *ev, gpointer user_data)
    {
       cairo_t *cr;
       double xc;
       double yc;
       /* Create a cairo context */
       cr = gdk_cairo_create(wi->window);
       deplacement(&xc,&yc);
       /* Set it to a medium green */
       cairo_set_source_rgb(cr, 0, 0.7, 0);
       /* Draw a circle in the center */
       cairo_arc(cr,xc ,yc ,10, 0, 2*G_PI);
       /* Fill the circle */
       cairo_fill(cr);
     
       /* Free the context */
       cairo_destroy(cr);
     
       return FALSE;
    }
    int main(int argc,char **argv){
      GtkWidget *pWindow;
      GtkWidget *pImage;
      GtkWidget *pVBox;
      GtkWidget *window;
    GtkWidget *event_box;
    /*creation de la fenetre principale*/  
    	gtk_init(&argc,&argv);
     	pWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
      	gtk_widget_set_size_request(GTK_WIDGET(pWindow),320,400);
      	gtk_window_set_position(GTK_WINDOW(pWindow),GTK_WIN_POS_CENTER);
      	gtk_window_set_title(GTK_WINDOW(pWindow),"JIPTO");
      	g_signal_connect(G_OBJECT(pWindow),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    	event_box=gtk_event_box_new();
     	pVBox = gtk_vbox_new(FALSE,0);
      	gtk_container_add(GTK_CONTAINER(pWindow),pVBox);
      	pImage = gtk_image_new_from_file("./plateau.png");
     
      	gtk_box_pack_start(GTK_BOX(pVBox), event_box, FALSE, FALSE, 5);
     
      	g_signal_connect_after(pWindow, "expose-event", G_CALLBACK(circle_expose_cb), NULL);
      	window=GTK_WIDGET(pWindow);
     
     
     	/*g_object_ref(pImage);
        	gtk_container_remove(GTK_CONTAINER(pWindow), pImage);
         	gtk_container_add(GTK_CONTAINER(pVBox), pImage);
         	g_object_unref(pImage);*/
     
     
    	gtk_container_add(GTK_CONTAINER(pVBox), event_box);
       	gtk_container_add(GTK_CONTAINER(event_box), pImage);
    	gtk_widget_add_events(event_box,GDK_BUTTON_PRESS_MASK);
      	g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(on_button_press_event),  NULL);
    	/*affichage de tout*/
    	gtk_widget_show_all(pWindow);
     
     	/*fermeture de gtk*/
        	gtk_main();
     
        	return EXIT_SUCCESS;
    }
    le shell affiche le meme message d'erreur mais la fenetre s'affiche sans le cercle

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Reprenons: tu ne peux pas utiliser gtk_box_pack_start ou gtk_box_pack_end et ensuite gtk_container_add sur le même widget. Ces fonctions font sensiblement la même chose: elles placent un widget à l'intérieur d'un autre.

    Tu ne peux garder les lignes 71 que si tu vires la ligne 59, et inversement. Si tu ne comptes pas mettre d'autres contrôle dans la vbox, utilise gtk_container_add. Sinon, utilise gtk_box_pack_start.

  5. #5
    Membre habitué
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Par défaut
    Bonjour,

    On a créé une interface graphique avec des cases dessus, un peu comme un jeu de dames.
    Le problème est que l'on ne sait pas comment récupérer l'adresse de la case sur laquelle on a cliqué.

    Quelqu'un pourrait t'il nous aider svp ?

    Merci d'avance.

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    ça dépend, vous travaillez sur le même projet ? Parce que si ce n'est pas le cas, merci d'ouvrir un nouveau fil de discussion.

Discussions similaires

  1. Interface Graphique sur Projet de Jeu.
    Par Rockye dans le forum C++
    Réponses: 4
    Dernier message: 01/03/2013, 18h10
  2. Interface graphique pour projet gtk en C sous Linux
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 12/02/2007, 13h28
  3. Cherche Projet de jeu 2D ou 3D
    Par poussinphp dans le forum Projets
    Réponses: 9
    Dernier message: 23/05/2006, 18h36
  4. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 20h06
  5. Besoin d'aide pour un projet de jeu en ligne
    Par FLEO dans le forum Projets
    Réponses: 1
    Dernier message: 21/10/2005, 08h55

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