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 :

Réalisation jeu de dame


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Réalisation jeu de dame
    Bonsoir,
    Je débute en gtk et j'aimerai réaliser un petit jeu de dame.
    J'aimerai avoir les grandes lignes selon vous pour saoir comment m'y prendre au niveau du damier et du déplacement de pions.

    J'ai pensé à une table avec dens chaque case une image? mais dans ce cas comment faire pour les pions?
    Ou peut être mettre un damier en image de fond avec une table avec les pions par dessus?
    enfin c'est assez vague!

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Tu as deux façons d'opérer je pense :

    1. tu utilises un GtkTable dans lequel tu places des images "fabriquées à la volée" avec la couleur de la case et le pion par dessus.
    2. tu utilises un GtkDrawingArea. Ici tu crées une image globale du damier sur laquelle tu déplaces tes pions.

    Quelque soit la méthode choisie il faudra en passer par les GdkPixbuf. Regarde la doc. officielle sur cette structure. Elle te permet de manipuler les images un peu comme tu veux.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci! Je vais aller regarder ça.

    J'avais plutôt démarré le truc avec ta 1ere méthode, les tables (j'ai réussi à faire la damier). Mais je ne vois pas trop comment faire pour déplacer les pions par la suite puisque je ne réussi pas à mettre de g_signal_connect sur mes images. Peut être que j'y my prends mal...

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Si tu utilises des GtkImage ils dérivent des GtkWidget. Tu peux donc utiliser les signaux inhérents à ces derniers.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Lorsque j'utilise le signal "clicked" par exemple pour fermer la fenetre en cliquant sur une de mes case il ne se passe rien.
    Dans l'hypothèse de la table, tu serais m'expliquer rapidement comment déplacer un pion?

    Désolé...j'ai un peu de mal à me lancer :s

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Le signal "clicked" n'est pas un signal natif d'un GtkWidget. En voici la liste :
    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
      "accel-closures-changed"                         
      "button-press-event"                             : Run Last
      "button-release-event"                           : Run Last
      "can-activate-accel"                             : Run Last
      "child-notify"                                   : Run First / No Recursion / Has Details / No Hooks
      "client-event"                                   : Run Last
      "composited-changed"                             : Run Last / Action
      "configure-event"                                : Run Last
      "delete-event"                                   : Run Last
      "destroy-event"                                  : Run Last
      "direction-changed"                              : Run First
      "drag-begin"                                     : Run Last
      "drag-data-delete"                               : Run Last
      "drag-data-get"                                  : Run Last
      "drag-data-received"                             : Run Last
      "drag-drop"                                      : Run Last
      "drag-end"                                       : Run Last
      "drag-failed"                                    : Run Last
      "drag-leave"                                     : Run Last
      "drag-motion"                                    : Run Last
      "enter-notify-event"                             : Run Last
      "event"                                          : Run Last
      "event-after"                                    
      "expose-event"                                   : Run Last
      "focus"                                          : Run Last
      "focus-in-event"                                 : Run Last
      "focus-out-event"                                : Run Last
      "grab-broken-event"                              : Run Last
      "grab-focus"                                     : Run Last / Action
      "grab-notify"                                    : Run First
      "hide"                                           : Run First
      "hierarchy-changed"                              : Run Last
      "key-press-event"                                : Run Last
      "key-release-event"                              : Run Last
      "keynav-failed"                                  : Run Last
      "leave-notify-event"                             : Run Last
      "map"                                            : Run First
      "map-event"                                      : Run Last
      "mnemonic-activate"                              : Run Last
      "motion-notify-event"                            : Run Last
      "move-focus"                                     : Run Last / Action
      "no-expose-event"                                : Run Last
      "parent-set"                                     : Run First
      "popup-menu"                                     : Run Last / Action
      "property-notify-event"                          : Run Last
      "proximity-in-event"                             : Run Last
      "proximity-out-event"                            : Run Last
      "query-tooltip"                                  : Run Last
      "realize"                                        : Run First
      "screen-changed"                                 : Run Last
      "scroll-event"                                   : Run Last
      "selection-clear-event"                          : Run Last
      "selection-get"                                  : Run Last
      "selection-notify-event"                         : Run Last
      "selection-received"                             : Run Last
      "selection-request-event"                        : Run Last
      "show"                                           : Run First
      "show-help"                                      : Run Last / Action
      "size-allocate"                                  : Run First
      "size-request"                                   : Run First
      "state-changed"                                  : Run First
      "style-set"                                      : Run First
      "unmap"                                          : Run First
      "unmap-event"                                    : Run Last
      "unrealize"                                      : Run Last
      "visibility-notify-event"                        : Run Last
      "window-state-event"                             : Run Last
    Pour commencer tu peux déjà faire tes premiers tests avec le signal "button-press-event". Je te donne ici le prototype du CALLBACK associé à ce signal :
    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
    gboolean            user_function                      (GtkWidget      *widget,
                                                            GdkEventButton *event,
                                                            gpointer        user_data)      : Run Last
     
    The ::button-press-event signal will be emitted when a button (typically from a mouse) is pressed.
     
    To receive this signal, the GdkWindow associated to the widget needs to enable the GDK_BUTTON_PRESS_MASK mask.
     
    This signal will be sent to the grab widget if there is one.
     
    widget :
    	the object which received the signal.
     
    event :
    	the GdkEventButton which triggered this signal
     
    user_data :
    	user data set when the signal handler was connected.
     
    Returns :
    	TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
    Tu pourras, une fois que tu maitriseras le clic de tes cases, ajouter la gestion du DnD de la même manière avec les signaux appropriés listés au dessus.

    Remarque:
    Il est important de ne pas oublier qu'un GtkWidget dispose d'un pointeur générique via les GObject. On peut donc y attacher n'importe quelle donnée. Un exemple pourrait être le n° de la case.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bon j'ai fait comme tu as dit, mais ce n'est pas un peu lourd? car apparament je dois ajouter autour de chaque case une eventbox pour pourvoir controler un évenement dessus?
    Enfin bref l'important est que ca marche et j'arrive bien à détecter le clique de l'utilisateur sur une case maintenant!

    Tu saurais m'expliquer un peu comment gérer le système de pions? Je dois stocker des images de cases vides, de cases avec pions et intervertir en fonction de là ou clique l'utilisateur?
    Sinon j'avais pensé à superposer mes pions dans les cases de la table, mais apparament on ne peut pas...
    Comment faire aussi au niveau du code pour demander à l'utilisateur de cliquer sur une case (avec un pion), puis sur une autre (sans) et dire de déplacer le pion?


    Désolé de poser autant de questions, mais plus j'y réfléchis et plus je m'embrouille...
    encore merci!

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Je reviens sur une ancienne réponse de ce thread. Vive les GdkPixbuf!

    Grâce à cette structure tu peux :
    • charger une image dans un GdkPixbuf (la couleur de la case par exemple).
    • Charger une autre image dans un GdkPixbuf (le pion par exemple)
    • Superposer l'image du pion sur l'image de la case et obtenir un nouveau GdkPixpuf avec.
    • Convertir le GdkPixbuf en GtkImage.

    Maintenant les fonctions pour faire ca :
    Maintenant les choses ne sont pas si simples. Il va falloir gérer le canal alpha des images que tu superposes. Tout d'abord il faut que les images des pions disposent d'un canal alpha avec une couleur définie. Tu peux faire ca avec The Gimp sans aucun problème si ce n'est pas le cas. Ensuite il te faut une fonction qui soit capable de superposer les images en utilisant le dit canal alpha.

    J'ai créé une fonction qui copie une image sur une autre tout en gérant le canal alpha. Je la mets en copie ici. Fais-en ce que tu veux :
    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
    void gdk_pixbuf_copy_area_with_alpha(const GdkPixbuf *src_pixbuf, 
    int src_x, int src_y, int width, int height, GdkPixbuf *dest_pixbuf,
    int dest_x, int dest_y)
    {
    	if (src_pixbuf && (gdk_pixbuf_get_n_channels(src_pixbuf)>3))
    	{
    		guchar *pixel_src=NULL;
    		guchar *pixel_dest=NULL;
    		register gint i=0, j=0;
    		gint x=dest_x, y=dest_y;
    		gint dest_width=gdk_pixbuf_get_height(dest_pixbuf);
     
    		if (!dest_pixbuf)
    			dest_pixbuf=gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
     
    		// Ajout du canal alpha au cas où sur le pixbuf destination.
    		if (gdk_pixbuf_get_n_channels(dest_pixbuf)<4)
    		{
    			GdkPixbuf *desta=NULL;
    			desta=gdk_pixbuf_add_alpha(dest_pixbuf, TRUE, 255, 255, 255);
    			g_object_unref(dest_pixbuf);
    			dest_pixbuf=desta;
    		}
     
    		pixel_src=gdk_pixbuf_get_pixels(src_pixbuf);
    		pixel_dest=gdk_pixbuf_get_pixels(dest_pixbuf);
    		for (j=src_y; j < src_y+height; j++)
    		{
    			x=dest_x;
    			for (i=src_x; i < src_x+width; i++)
    			{
    				if (pixel_src[(i*4)+(j*width*4)+3]!=0)
    				{
    					pixel_dest[(x*4)+(y*dest_width*4)  ]=pixel_src[(i*4)+(j*width*4)  ];
    					pixel_dest[(x*4)+(y*dest_width*4)+1]=pixel_src[(i*4)+(j*width*4)+1];
    					pixel_dest[(x*4)+(y*dest_width*4)+2]=pixel_src[(i*4)+(j*width*4)+2];
    				}
    				x++;
    			}
    			y++;
    		}
    	}
    }

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    merci beaucoup!

    juste un petit problème que je n'arrive pas à résoudre (je suis sous code blocks) et qd je compile il me marque "undefinded reference to '_gkt_pibbuf_new_from_file_utf8' "
    et j'ai le même type d'erreur à chaque fois que j'utilise une fonction avec gdt_pixbuf?
    J'ai cru comprendre qu'il fallait installer la bibliothèque gdk-pixbuf mais je ne sais pas du tout commment faire cela.

    Parceque en allant dans la racine de codeblocks je vois bien dans les insclude par exemple mon fichier gdk-pixbuf...

    EDIT : et même en mettant #include <gdk-pixbuf/gdk-pixbuf.h> avec mes include j'ai le problème à la compilation!

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    gdk_pixbuf_new_from_file_utf8(); ? Je ne la trouve pas dans la doc. Existe-t-elle?

    Pour ce qui est de l'installation de GdkPixbuf je ne peux pas répondre. Je n'utilise pas Ton IDE. Par contre je suis sur que tu trouveras les réponses sur le forum.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Je vais jetter une oeil.
    Mais oui ce que je ne comprends pas c'est que j'ai cette erreur alors que la fonction que j'utilise est Pion = gdk_pixbuf_new_from_file("pion.jpg",NULL);

    EDIT : C'est bon, tu avais bien raisons (encore une fois) j'ai trouvé ce qu'il me fallait sur le fofo, apparament il fallait ajouter la bibliothèque manuellement dans le project build. Donc je retourne sur mes dames.. ^^

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Une petite chose encore que je ne comprends pas, comment savoir sur quelle case de ma table l'utilisateur à cliqué?
    car pour l'instant je disais : si il clique sur Case[0] par exemple il se passe ça...
    Il existe un moyen de récupérer les coordonnées du clique? et je dois ensuite regarder à quelle case cela correspond?

    Enfin je pense qu'il faut regarder ou il clique, enuite voir si il y a un pion sur la case, et ensuite le déplacer si c'est possible en fonction d'un 2ème clique. C'est bien comme ça que je dois m'y prendre non? c'est ce qui ma parait le plus logique

  13. #13
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Dans les grandes lignes oui c'est comme ca que tu dois opérer.

    Maintenant comment savoir quelle case est cliquée? Comme je l'ai dit un peu plus haut on peut attacher une donnée quelconque à un GtkWidget. Si tu attaches à chaque GtkImage le n° de la case dans laquelle tu le places, lorsue tu es dans le CALLBACK du clic il te suffit de récupérer la dite donnée. (Je ne suis pas sur du tout d'être très clair sur ce coup).

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    je vois plus ou moins mais je ne comprends pas comment faire.
    POur tester les cliques je faisais :
    g_signal_connect(G_OBJECT(Case[5]),"button-press-event",G_CALLBACK(OnClik),NULL);

    Je suppose que qd tu parles d'attacher une donnée à mon widget eventbox (qui contient l'image de ma case), tu entends par là en utilisant le gpointer data. Mais dans ce cas que mettre dans G_OBJECT()? J'ai besoin des coordonnées du clique non?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Après qques recherches, j'ai cru comprendre qu'il était possible d'utiliser un système de drag and drop? D'après toi je devrais me servir de ça?
    Pourrais tu m'en dire un peu plus à dessus?
    J'ai regardé un peu le truc mais je ne comprends pas trop comment m'y prendre.


    Sinon après qques test je vais commencer à faire mon jeu. Au niveau des structures, tu me conseil de m'y prendre comment? Je fais une structure de jeu où je mets tout dedans? (images, damier, eventbox, pions...)

  16. #16
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Salut.

    Désolé pour le retard dans la réponse, vacances obligent!

    Comment structurer ton programme? Pas évident à répondre. Tu peux déjà créer une structure regroupant tous les widgets nécessaires à ton environnement graphique. Il me semble que séparer le moteur de jeu de l'interface graphique est la solution la plus logique.

    Pour le DnD c'est une fonctionnalité relativement facile à mettre en oeuvre une fois l'interface opérationnelle. Je te conseille donc de mettre cette possibilité de côté pour le moment. Lorsque tu auras un damier fonctionnel avec des clics tu pourras ajouter le DnD sans transformer ton code.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    question bete en fait... ^^'

    merci pour ton aide!!

Discussions similaires

  1. créer jeu de dame en C
    Par SAMUELSalbert dans le forum C
    Réponses: 11
    Dernier message: 31/07/2006, 20h33
  2. Code source en c d'un jeu de dames
    Par ledawa dans le forum Développement 2D, 3D et Jeux
    Réponses: 33
    Dernier message: 22/05/2006, 08h54
  3. [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
  4. [Jeu de dames]Enregistrer les règles...
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/11/2005, 19h39
  5. probleme pour un jeu de dames en python
    Par doudou152 dans le forum Général Python
    Réponses: 7
    Dernier message: 22/04/2005, 14h53

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