Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'aide pour créer un jeu de casse-briques

Idées générales

    22 mai 2006 à 13:18:00

    Bonjour,

    Alors voilà, je voudrais coder un petit jeu de casse-briques (pour l'instant, juste la base, c'est à dire, la raquette, les briques, la balle).

    Mais le problème c'est que je n'arrive pas bien à visualiser comment créer le modéle. J'aimerais avoir une fenêtre, avec à gauche le jeu, et une petite partie à droit ou on verra le score.

    Ce que je n'arrive pas à visualiser c'est comment coder cela. (Comment par exemple différencier la partie "jeu" de la partie "score" pour que la balle n'aille pas se balader dans le score ^^ et comment représenter les briques (tableau en 2 dimensions?) etc...

    En gros, j'ai besoin d'aide pour créer une ligne directrice pour se projet. :)

    Comme j'ai remarqué que quelques personnes ici avaient déja codé ce genre de jeu, j'imagine que vous pourrez m'aider.

    Merci d'avance :D
    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2006 à 14:22:49

      J'en ai fait un il y une paire d'années, que je suis en train de refaire avec la SDL. Voir ma signature pour tester l'éditeur (et me faire des niveaux) et tester la version actuelle du jeu (ça bugue un peu, parfois, mais c'est en cours de "portage" (DirectX -> SDL) et optimisation).

      J'ai personnellement pris l'approche objet, en C++. C'est-à-dire que chacun de mes objets dans le casse briques (balles, raquette, briques, bonus 3D, boulets de canon voire même les explosions) sont des objets d'une classe (un peu l'équivalent d'une structure... en plus poussé).

      Ca me permet de faire un tableau d'objets. Par exemple, pour un niveau donné, si j'ai 120 briques, j'aurais un tableau de 120 objets de la classe brique (celle-ci ayant des variables aussi diverses et variées que ses coordonnées, son état, son type, etc...).

      Si tu n'es pas à l'aise avec les structures ou la programmation objet, tu peux aussi t'en sortir en faisant de simples tableaux à plusieurs dimensions, mais c'est plus difficile, à mon avis (tableau où tu as les coordonnées, type et état de tes briques, etc...).

      Un conseil quand même : pose sur papier la façon dont tu gèreras tes différents "objets" dans ton jeu, et ne commence à programmer que lorsque tu sais la façon dont tout s'implémentera. Un casse-briques, si tu le veux un peu poussé, n'est pas si trivial que ça. :)
      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2006 à 14:28:04

        Alors, tout d'abord, merci beaucoup pour ta réponse.

        Maintenant j'ai quelques questions:

        Pour l'approche objet, justement j'en fait un peu à la fac (mais en java).

        Connais-tu un endroit (tutorial par exemple) ou je pourrais apprendre l'approche objet en C/C++?

        De plus, le C++ est-il multi-plateforme comme le C? (je débute en C/C++).

        Je vais regarder ta signature et j'aurais sûrement quelques autres questions ;)


        Edith: Je suis sous Debian donc je ne peux pas tester ton casse-briques, dommage
        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2006 à 14:32:18

          Le C++, tout comme le C, est multi plate-forme, à condition d'utiliser des librairies multi plate-formes. C'est une des raisons pour laquelle je transpose ma version DirectX en version SDL, afin qu'elle soit portable.

          Pour les tutoriels objet, ça doit être facilement trouvable, mais je n'en ai pas sous la main.
          Quand mon jeu sera terminé, j'essayerais d'en faire un tuto (ou une série de tutos), car ça peut permettre de voir pas mal de choses dans la création d'un jeu (gestion du temps, sprites, gestion des différents écrans, POO...).

          Edit : je fais une version Linux ce soir, car je suis également sous Linux chez moi. Je n'avais juste pas pensé à inclure la version linux sur mon site ;)
          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2006 à 14:33:39

            En effet, il me tarde de voir ton tutorial apparaître et pourquoi pas sur le site du zéro :)

            En attendant je vais chercher un peu sur google pour la programmation orientée objet en C++.

            Merci encore :)

            Edith: Et, si possible, pourrais-je avoir les sources de ton jeu (pas pour copier bêtement, hein) histoire d'avoir une base ?
            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2006 à 8:09:22

              La version binaire (linux) du jeu est ici : http://florent28.free.fr/CBSDL/CBSDL.tar.gz

              Pour les sources, pas tout de suite, j'attends d'avoir une version plus aboutie. :)

              Edit : allez, si je me motive, je fais un tuto sur comment commencer un casse-briques (méthodes, objets, etc...). Ca sera le préambule, si tout va bien, d'une série pour programmer le jeu en lui-même.
              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2006 à 11:29:45

                Alors motive toi :)

                Tu as déjà un élève ^^

                Merci por la version Linux ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  23 mai 2006 à 12:52:21

                  salut,

                  je serais toi je coderais les fonctions de base petit a petit :

                  1. tu cree un pong (raquette avec balle qui rebondit sur les murs

                  2. tu poses les briques (la balle rebondit sur les murs ET les briques

                  3. tu code le systeme de coordonees et la disparition des briques

                  4. tu suis le tuto texte que j ai pas encore lu et tu laisse ta balle passer sur le texte pour le moment. il sera tjrs tps de trouver comment limiter la zone de jeu plus tard !

                  nan ? :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mai 2006 à 14:40:40

                    Voilà, c'est ce que je vais faire pour l'instant. Ensuite je réécrirais sûrement le programme avec une approche objet quand le tutorial de florent28 sera écrit ;)

                    Merci pour tous vos conseils.

                    Oh, encore une chose, pour le placement des briques (sans l'approche objet), je peux reprendre le sytème de tableau à deux dimensions comme dans le jeu de Sokoban suggéré par M@teo, non?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mai 2006 à 15:04:33

                      Pour info, je viens de finir le tuto, qui est l'introduction d'une série de tutos pour faire un casse-briques (enfin, une des méthodes, je ne prétends pas avoir la meilleure solution). D'ailleurs, cette méthode est plus ou moins valable pour n'importe quel jeu ;)

                      Il est en attente de validation, vous en saurez plus quand ça sera fait :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 mai 2006 à 16:12:55

                        Merci pour tout florent28!

                        Bon j'ai un premier problème.

                        J'ai écrit un bout de code qui lance le jeu et permet de manipuler la raquette.

                        Le problème, c'est que j'essaye d'y implémenter une fonction pause, qui bloque le jeu mais je n'arrive pas à en sortir...

                        Je ne comprend pas pourquoi, voici le code de ma fonction jouer:


                        /*
                        Nom: jeu.c
                        Auteur: Michaël Delache
                        Description: Le jeu
                        Date de création: 21/05/06
                        */


                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <SDL/SDL.h>
                        #include <SDL/SDL_image.h>

                        #include "jeu.h"
                        #include "constantes.h"

                        void jouer(SDL_Surface* ecran) {
                            // Declaration et initialisation des variable (raquette, balle, etc...)
                            SDL_Surface *raquette = NULL;
                            SDL_Rect positionRaquette;
                            SDL_Event event;

                            raquette = SDL_LoadBMP("barre.bmp");

                            int continuer = 1;

                            positionRaquette.x = (1024/2)-(154/2);
                            positionRaquette.y = (768-24-20);

                            // Effacement de l'ecran
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                            // Boucle principale du jeu
                            while (continuer) {
                                SDL_PollEvent(&event);
                                switch (event.type)
                                {
                                    case SDL_KEYDOWN:
                                        switch (event.key.keysym.sym)
                                        {
                                            case SDLK_ESCAPE:
                                                continuer = 0;
                                                break;
                                            case SDLK_p:
                                                pause();
                                                break;
                                        }
                                        break;
                                    case SDL_MOUSEMOTION:
                                        positionRaquette.x = event.motion.x;
                                        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                        SDL_BlitSurface(raquette, NULL, ecran, &positionRaquette);
                                        SDL_Flip(ecran);
                                        break;
                                }
                            }
                        }

                        void pause() {
                            int continuer = 1;
                            SDL_Event event;
                            while (continuer) {
                                SDL_WaitEvent(&event);
                                switch (event.type) {
                                    case SDL_KEYDOWN:
                                        switch (event.key.keysym.sym) {
                                            case SDLK_p:
                                                continuer = 0;
                                                break;
                                        }
                                        break;
                                }
                            }
                        }



                        J'appelle la fonction "jouer" par "jouer(ecran)" dans ma fonction main (avec SDL_Surface *ecran déclaré et initialisé biensûr).

                        Si quelqu'un voit d'ou vient le fait que je ma raquette ne bouge plus (et que je ne peux plus quitter le programme), qu'il se manifeste :)

                        Merci d'avance
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 mai 2006 à 19:19:49

                          Va voir la (C'est mon casse-briques)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 mai 2006 à 21:08:44

                            Ajoute un déplacement de la barre avec les fleches. La souris, c'est pas très pratique.

                            Pour les briques, utilise un tableau à deux dimensions. Les cases du tableau auront une valeur differente en fonction de son status (briques, explosions, etc..).

                            Pour faire rebondir la balle sur le menu, pas difficile, si tu arrive à la faire rebondir sur d'autres bords, celui-çi n'est pas plus difficile.. ;)

                            Sinon, au lieu d'un fonction pause, utilise un booleen pause ui vaudra '0' si on est en pause, '1' si on y est pas; ensuite, on deplace la balle et on fait les blits seulement si pause == 1.

                            Si tu as d'autres questions, pose-les, n'hesite pas !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 mai 2006 à 21:25:14

                              Citation : guimers8

                              Ajoute un déplacement de la barre avec les fleches. La souris, c'est pas très pratique.



                              Sacrilège ! o_O
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 mai 2006 à 22:04:37

                                Sacrilège ?!?! And.. why ? o_O
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 mai 2006 à 23:20:02

                                  Merci pous vos aides.

                                  Pour les touches du clavier, ce n'est pas trés pratique... Un jeu de casse-briques se joue habituellement à la souris.

                                  Par contre je ne comprends pas l'histoire du booléen, je dois faire une vérification ou je n'actualise rien du tout si pause == 1?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 mai 2006 à 1:26:17

                                    et si tu ferais juste un system("PAUSE"); tout simplement si on appuie sur la touche p?

                                    cette fonction est pas supposée faire tout repartir une fois qu'on appuie sur une touche?

                                    peut-être que je me trompe et qu'elle n'est bonne qu'en console, alors laissez faire les tomates ;)

                                    après tout... je suis un Zér0 :-°
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 mai 2006 à 1:27:13

                                      Envoyez-lui les tomates, c'est bon qu'en console ça !
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                                        11 juin 2006 à 17:41:51

                                        euh moi je pose la question: comment faire pour le rebond? je veux dire indiquer la direction... car je ne vois pas du tout
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 juin 2006 à 17:21:05

                                          personne ne sait? ça m'étonne
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            12 juin 2006 à 17:24:17

                                            tkt il y a bien des proqui en on fait ici jen suis sur XD
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 juin 2006 à 17:48:07

                                              personnelement je penserai à une sorte de miroir lorsque la balle arrive contre la raquette par exemple

                                              la balle se deplace en allant a chaque fois deux pixels à gauche et 5 vers le bas.
                                              si elle rencontre la raquette,
                                              on defini le deplacement comme deux vers la gauche et 5 vers le haut.

                                              (les choc horizontaux modifient la verticalité et les paroies verticale, le mouvement horizontal)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                12 juin 2006 à 18:09:43

                                                la simulation des collisions:
                                                ta balle avance de 1 pixel en continue et tu deplace en meme temps ta raquette (sans pour autant arreter la balle fonction PollEvent)dès que ta balle rencontre une limite verticale a ne pas dépacer par exemple: 200 pixel vers la droite la balle s'arrete. Puis pour la faire redemmarer ta le choix entre choisir une direction a chaque fois quel touche cette limite ou utiliser la generation de nombre pseudo aleatoire pour que cette direction soit hasardeuse et imprevisible :) après pour les briques meme chose que pour les limites dès que la balle rentre dans une zone (la brique :D ) declencher un evenement (voir 2 pour que la balle rebondisse ;) ).
                                                aide pour la gestion des collision:

                                                http://www.siteduzero.com/tuto-3-6128-1-tp-zozor-dans-son-enclos.html
                                                aide pour la generation de nombre alea:

                                                http://www.siteduzero.com/tuto-3-2426-1-les-nombres-aleatoires-en-c-c.html

                                                voili voulou :D

                                                PS:
                                                ta la façon m@teo21 qui dit:

                                                bloc par bloc

                                                avantage: tu peux facilement "gerer la map"
                                                inconvenien: c'est moche.

                                                la façon pixel par pixel

                                                avantage: c'est realiste
                                                inconvenien: Tu va te faire C**** a mort a crée plusieurs niveaux
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 juin 2006 à 19:19:38

                                                  Merci pour vos réponses mais en fait ça j'avais déjà l'idée. Ce que je ne savais pas gérer la direction. Effectivement un nombre aléatoire c'est pas mal mais c'est pas réaliste o_O
                                                  Pour l'effet miroir oui mais le problème c'est que plus tu te rapproche du milieu de la barre, plus c'est un vrai mirroir et plus tu t'en éloigne plus la direction change de l'effet mirroir (et en plus dans les angles ça doit renvoyer dans la même direction) alors bon c'est pas facile nonplus... d'où mon problème.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 juin 2006 à 19:57:46

                                                    Citation : Minaithnir

                                                    la balle se deplace en allant a chaque fois deux pixels à gauche et 5 vers le bas.
                                                    si elle rencontre la raquette,
                                                    on defini le deplacement comme deux vers la gauche et 5 vers le haut.


                                                    Bon pour l'algorithme.
                                                    Mais pour le code, je vais t'en concocter un naimbus. Parce que là, j'ai un trou de mémoire ^^ .
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 juin 2006 à 22:26:24

                                                      c'est gentil, donc tu va faire un effet miroir pour tout alors? avec une equation par rapport à la normale? car pour les angles c'est différent normalement (sauf si tu arrive à changer la normale en fonction du point d'impact, ce qui doit etre possible avec les math lol j'y avait pas pensé :euh: )
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 juin 2006 à 10:23:43

                                                        En gros, si tu utilises des vecteurs de déplacement (ix, iy) pour bouger ta balle :
                                                        - tu touches un mur à gauche ou à droite : ix devient -ix
                                                        - tu touches le mur du haut : iy devient -iy
                                                        - tu touches la raquette : il faut faire un petit calcul. Sur mon casse-briques, ça donne ça :
                                                                   if (x == rqte.x) {
                                                                        ix = 0;
                                                                        iy = -1;

                                                                        n = sqrt(iy*iy+ix*ix)//norme

                                                                        ix = ix / n;  //on divise par la norme
                                                                        iy = iy / n;


                                                                    }
                                                                    else {
                                                                        double pi = 3.1415926535;

                                                                        ix = (1 / (tan(( ( (1 - ((x - rqte.x) / (rqte.l)) ) * 85) + 5)*pi/180) ));

                                                                        iy = -1;

                                                                        n = sqrt(iy*iy+ix*ix)//norme

                                                                        ix = ix / n;  //on divise par la norme
                                                                        iy = iy / n;
                                                                    }


                                                        sachant que x est le centre de la balle, et rqte.x est le centre de la raquette, dont la demi largeur est rqte.l (la raquette fait donc 2*l de largeur).

                                                        Il y a bien évidemment d'autres façons de gérer l'angle, notamment si vous gérez les déplacements de la balle avec un angle plutôt qu'avec des vecteurs...
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          13 juin 2006 à 11:58:52

                                                          ah merci j'ai compris le raisonnement mais pourquoi tu divise par la norme? c'est juste pour créer des petits deplacements?
                                                          sinon le contenu du tan, plus précisement le 1-((x - rqte.x) / (rqte.l)) je ne comprend pas vraiment ce que cela represente en angle...
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            13 juin 2006 à 12:04:17

                                                            Je divise par la norme pour que le vecteur soit toujours de la même taille. C'est-à-dire normé.
                                                            Ce n'est pas le vecteur qui détermine la vitesse, mais la vitesse elle-même (quand tu la multiplies au vecteur).

                                                            Pour l'angle, j'avoue qu'il y a beaucoup de parenthèses, et que ça peut gêner la lecture, mais le contenu du tan est bien plus grand que ce que tu en as lu...
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              13 juin 2006 à 12:14:28

                                                              Un vecteur normé pour que le déplacement soit toujours de la même taille c'est ça? (je parle de l'espace pas du temps :) )
                                                              Pour le tan j'ai bien vu ya la suite avec 85 + conversion en radian mais c'est juste la partie que je t'es écrite que je ne comprend pas en angle...
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Besoin d'aide pour créer un jeu de casse-briques

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown