Partage
  • Partager sur Facebook
  • Partager sur Twitter

Berli rpg

aperçu de mon jeu.

    16 avril 2006 à 22:31:44

    Je suis en train de créer le jeu berli rpg.

    Voici une petite capture d'écran.
    C'est juste pour commencer. :p

    //user.oc-static.com/files/9001_10000/9135.png
    Image utilisateur

    J'arrive à gérer les déplacement avec les animations du déplacement mais je n'arrive pas à gérer les sauts.

    Comment vous faites pour gérer un saut plutôt bien réalisé ?


    PS : Laissez des commentaires svp.
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2006 à 22:40:44

      ça ressemble plutôt à un jeu de plate-forme je crois.
      • Partager sur Facebook
      • Partager sur Twitter
        16 avril 2006 à 22:52:59

        Je suis aussi interesser pour savoir comment on peut réaliser un saut assez "réaliste", un peu a la mario ... J'ai déja tester quelques trucs mais comme les exemples que j'ai pu voir, les sauts étaient comment dire .. un peu "triangulaire" ^^
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 avril 2006 à 2:59:23

          Tiens essaye ca.
          Au niveau du saut c'est pas trop mauvais je trouve.
          Le principe c'est que le saut se fait progressivement.
          Quand le perso saute la variable "vitesseChute" se réduit, donc quand le perso monte sa vitesse de réduit puis s'inverse et il accèlère en retombant.
          Le seul problème cetait le mouvement horizontale. Quand on appuie sur la droite et qu'on laisse appuyer SDL déclenche plein d'événements "SDLK_RIGHT".
          Mais si on se met a sauter il arrete et le perso saute à la verticale.
          J'ai du feinter avec une variable "vitesseHorizontale" qui se met à 3 (ou -3 si c'est à gauche) et qui se remet à zéro quand on relache la fleche (SDL_KEYUP).

          (pas de remarque sur la gestion de collisions cetait pas mon but premier ^^)

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

          #define VITESSE_COURSE    3
          #define PUISSANCE_SAUT    15
          #define GRAVITE 0.5

          int chute(SDL_Rect positionPerso);

          int main (int argc, char *argv[])
          {
              SDL_Surface *ecran=NULL, *sol=NULL, *plaque=NULL, *perso=NULL;
              SDL_Event evenement;
              SDL_Rect positionPerso, positionSol, positionPlaque;
              positionPerso.x=0;
              positionPerso.y=0;
              positionSol.x=0;
              positionSol.y=380;
              positionPlaque.x=320;
              positionPlaque.y=300;


              int continuer=1;
              double vitesseChute=0, vitesseHorizontal=0;

              SDL_Init(SDL_INIT_VIDEO);
              SDL_EnableKeyRepeat(10, 10);
              ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
              sol = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, 100, 32, 0, 0, 0, 0);
              SDL_FillRect(sol, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
              plaque = SDL_CreateRGBSurface(SDL_HWSURFACE, 320, 5, 32, 0, 0, 0, 0);
              SDL_FillRect(plaque, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
              perso = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
              SDL_FillRect(perso, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));

              while (continuer)
              {


                  if (vitesseChute<0)             // On est en saut
                      vitesseChute +=GRAVITE;
                  else if (chute(positionPerso)) // On se vautre
                      vitesseChute+=GRAVITE;
                  else                            // On est sur une plateforme
                      vitesseChute=0;

                  positionPerso.y+=vitesseChute;
                  positionPerso.x+=vitesseHorizontal;

                  //Affichage ecran
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                  SDL_BlitSurface(sol, NULL, ecran, &positionSol);
                  SDL_BlitSurface(plaque, NULL, ecran, &positionPlaque);
                  SDL_BlitSurface(perso, NULL, ecran, &positionPerso);
                  SDL_Flip(ecran);

                  //Gestion des evenement
                  SDL_PollEvent(&evenement);
                  switch(evenement.type)
                  {
                      case SDL_QUIT: // Clic sur la croix
                          continuer=0;
                          break;
                      case SDL_KEYDOWN: // Appuie touche clavier
                          switch(evenement.key.keysym.sym)
                          {
                              // On saute (si le perso est sur une plaque)
                              case SDLK_SPACE:
                                  if (vitesseChute==0)
                                      vitesseChute=-PUISSANCE_SAUT;
                                  break;
                              // On bouge le perso à droite ou à gauche
                              case SDLK_RIGHT:
                                  vitesseHorizontal = VITESSE_COURSE;
                                  break;
                              case SDLK_LEFT:
                                  vitesseHorizontal = -VITESSE_COURSE;
                                  break;
                          }
                          break;
                      case SDL_KEYUP:
                          switch(evenement.key.keysym.sym)
                          {
                              // Touche relachée = stop mouvement
                              case SDLK_RIGHT:
                              case SDLK_LEFT:
                              vitesseHorizontal = 0;
                              break;
                          }
                          break;
                  }
              }

              SDL_FreeSurface(perso);
              SDL_FreeSurface(sol);
              SDL_FreeSurface(plaque);
              SDL_Quit();
              return EXIT_SUCCESS;
          }


          /* Teste si le perso tombe ou pas
          (la gestion de la plaque est foireuse
          mais cetait juste pour tester le saut) */

          int chute(SDL_Rect positionPerso)
          {
              if (positionPerso.y>360)    //La plaque du bas
                  return 0;

              if ((positionPerso.y<290)&&(positionPerso.y>275)&&(positionPerso.x<=640)&&(positionPerso.x>=320))
                  return 0;

              return 1;
          }



          Je suis impatient de voir ton mix plateforme+RPG.
          ca peut donner un truc sympa, si tu manques d'idée pour améliorer le concept envoie moi un message :)
          • Partager sur Facebook
          • Partager sur Twitter
            17 avril 2006 à 4:48:24

            Et ben alors, faut revoir vos cours de physique :D

            tu cré une fonction qui prend 5 arguments:
            la position initiale de ton bonhomme à l'écran suivant l'horizontal (que j'appel Xo)
            la position initiale de ton bonhomme à l'écran suivant la verticale (que j'appel Yo)
            la vitesse initiale de ton bonhomme (que j'appel Vo) (c'est toi qui la choisit, ça depend si il cour où si il marche)
            l'angle de saut de ton bonhomme (par raport à l'horizontal) (que j'appel a)
            le coéficient de gravité de ta planette (que j'appel g) (sur terre, c'est 9,81. Sur la lune c'est moins ;) )

            Et cette fonction devra modifier, au final, deux valeures: la position horizontal de ton bonhomme, et sa position verticale

            1) connaissant 'Vo'(c'est toi, le programmeur, qui fixe sa valeure, on va dire que ton bonhomme cour à 4 mètres par secondes(un peu moins de 15Km/H)) et l'angle 'a' (c'est toi aussi qui fixe sa valeure. Si le joueur apuis sur la touche qui permet de faire un long saut, 'a' sera de 45° (PI/4 enfait). Par contre si il veut faire un saut très haut, 'a' sera de 90° (PI/2 enfait)).
            Il faut calculer la vitesse horizontal initiale de ton bonhomme(que j'appel Vox), Vox = Vo*cosinus(a)
            Il faut calculer la vitesse verticale initiale de ton bonhomme(que j'appel Voy), Voy = Vo*sinus(a)

            2) maintenant il faut calculer la nouvelle position de ton bonhomme, à chaque instant de l'affichage
            au prochain affichage de ton bonhomme:
            y = -g*t*t/2 + Voy*t + Yo
            x = Vox*t + Xo
            sachant que 't', c'est une variable qui s'incrémente de 1 en 1, mais multiplié par le temps que met ton programme à afficher la nouvelle image. (si ton programme met 1 seconde à afficher la prochaine image, alors t = 1, tu affiches, puis ensuite t = 2, tu réaffiche avec les nouvelles coordonnées, etc. Par contre, si ton programme met 2 secondes à afficher la prochaine image (un peu pouri ton prog lol) alors t = 1*2, puis ensuite t = 2*2, etc. Si ton programme met 0.01 seconde à afficher la prochaine immage, alors t = 1*0.01, puis ensuite t = 2*0.01, etc)

            void afficher_saut(int Xo, int Yo, int Vo, double a, float g)
            {
               int t=1;
               do
               {
                  x = Vo*sin(a)*(t*le temps d'affichage de ton prog) + Xo;
                  y = -g*pow((t*le temps d'
            affichage de ton prog), 2)/2 + Vo*cos(a)*(t*le temps d'affiche de ton prog) + Yo

                  afficher ton bonhomme aux coordonnées x et y

                  t++;
                }Tant que ton bonhomme n'
            a pas retouché le sol;
            }


            Bon alors euh... là j'ai considéré que l'axe des y (ordonnées) etait dirigé vers le haut, mais on sait qu'avec la SDL, les y sont dirigé vers le bas. Donc il faut rajouter un signe négatif devant
            Ensuite, pour connaitre le temps que met ton ordi à faire le calcul et afficher l'image suivante... ben bon courage lol, moi je ne sais pas comment on fait
            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2006 à 10:55:16

              Je ne sais pas comment tu utilises ta fonction car çà me fait beuguer mon programme penadnt son exécution.

              void afficher_saut()
              {
                 int t=1;
                 do
                 {
                    pHeros.x = Vo*sin(a)*(t*0.02) + pHeros.x;
                    pHeros.y = -g*pow((t*0.02), 2)/2 + Vo*cos(a)*(t*0.02 + pHeros.y);

                    //afficher ton bonhomme aux coordonnées x et y
                    SDL_BlitSurface(heros, &Heros1, ecran, &pHeros);

                    t++;
                  }while (pHeros.y < 420 - 48);
              }
                 
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                17 avril 2006 à 11:06:34

                Citation : nonpoluant

                Et ben alors, faut revoir vos cours de physique :D

                tu cré une fonction qui prend 5 arguments:
                la position initiale de ton bonhomme à l'écran suivant l'horizontal (que j'appel Xo)
                la position initiale de ton bonhomme à l'écran suivant la verticale (que j'appel Yo)
                la vitesse initiale de ton bonhomme (que j'appel Vo) (c'est toi qui la choisit, ça depend si il cour où si il marche)
                l'angle de saut de ton bonhomme (par raport à l'horizontal) (que j'appel a)
                le coéficient de gravité de ta planette (que j'appel g) (sur terre, c'est 9,81. Sur la lune c'est moins ;) )

                Et cette fonction devra modifier, au final, deux valeures: la position horizontal de ton bonhomme, et sa position verticale

                1) connaissant 'Vo'(c'est toi, le programmeur, qui fixe sa valeure, on va dire que ton bonhomme cour à 4 mètres par secondes(un peu moins de 15Km/H)) et l'angle 'a' (c'est toi aussi qui fixe sa valeure. Si le joueur apuis sur la touche qui permet de faire un long saut, 'a' sera de 45° (PI/4 enfait). Par contre si il veut faire un saut très haut, 'a' sera de 90° (PI/2 enfait)).
                Il faut calculer la vitesse horizontal initiale de ton bonhomme(que j'appel Vox), Vox = Vo*cosinus(a)
                Il faut calculer la vitesse verticale initiale de ton bonhomme(que j'appel Voy), Voy = Vo*sinus(a)

                2) maintenant il faut calculer la nouvelle position de ton bonhomme, à chaque instant de l'affichage
                au prochain affichage de ton bonhomme:
                y = -g*t*t/2 + Voy*t + Yo
                x = Vox*t + Xo
                sachant que 't', c'est une variable qui s'incrémente de 1 en 1, mais multiplié par le temps que met ton programme à afficher la nouvelle image. (si ton programme met 1 seconde à afficher la prochaine image, alors t = 1, tu affiches, puis ensuite t = 2, tu réaffiche avec les nouvelles coordonnées, etc. Par contre, si ton programme met 2 secondes à afficher la prochaine image (un peu pouri ton prog lol) alors t = 1*2, puis ensuite t = 2*2, etc. Si ton programme met 0.01 seconde à afficher la prochaine immage, alors t = 1*0.01, puis ensuite t = 2*0.01, etc)

                void afficher_saut(int Xo, int Yo, int Vo, double a, float g)
                {
                   int t=1;
                   do
                   {
                      x = Vo*sin(a)*(t*le temps d'affichage de ton prog) + Xo;
                      y = -g*pow((t*le temps d'
                affichage de ton prog), 2)/2 + Vo*cos(a)*(t*le temps d'affiche de ton prog) + Yo

                      afficher ton bonhomme aux coordonnées x et y

                      t++;
                    }Tant que ton bonhomme n'
                a pas retouché le sol;
                }



                Bon alors euh... là j'ai considéré que l'axe des y (ordonnées) etait dirigé vers le haut, mais on sait qu'avec la SDL, les y sont dirigé vers le bas. Donc il faut rajouter un signe négatif devant
                Ensuite, pour connaitre le temps que met ton ordi à faire le calcul et afficher l'image suivante... ben bon courage lol, moi je ne sais pas comment on fait



                moi je me prends pas autant la tête
                y'a 2 limites à ta méthode.
                Le joueur peut pas vraiment faire des sauts milimétrés, tu que tu définie l'angle du saut.
                Ensuite le programme reste dans la boucle, donc si dans la boucle principale le programme gère le déplacement des monstres ou alors des missiles de je ne sais pas quoi, ben tout se figera pendant le saut. Du coup faudra remettre tous les evenements dans cetet boucle de saut !

                Dans mon script je recré un peu la physique de la gravité normale (enfin je sais pas comment ca se dit j'ai stop l'école en seconde j'ai du pompé le truc sur wikipedia).
                En gros y'a la gravité qui change la vitesse verticale (elle réduit la vitesse si c'est vers le haut et elle l'augmente si c'est vers le bas). C'est un peu comme une accélération vers le bas.
                Donc a chaque tour de boucle j'ai la vitesse de chute qui augmente (sauf si il rencontre la sol alors il arrete de tomber). Et quand il saute je remet la vitesse de chute en négatif (pour le faire monter) !

                On peut meme changer la force du saut, la vitesse de chute
                • Partager sur Facebook
                • Partager sur Twitter
                  17 avril 2006 à 11:47:57

                  Je vais corriger tout çà ! Merci !
                  En faîtes pourquoi t'as arrêter l'école ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 avril 2006 à 14:46:01

                    honettement, j'ai jamais experimenté de physique dans mes programme... là j'ai juste ressortit la théorie brut de brut d'un saut, j'en ai aucune idée à savoir si ça marche dans un programme ou pas

                    Cour de physique :D
                    Enfait, on est en permanence soumis à la gravitation de la terre (enfait, tout les objets qui nous entourent ont une force qui nous attire, mais elles sont négligeable devant celle de la terre, car ça depend de la masse de l'objet (la terre c'est énorme par raport à mon ordi ;) ))
                    Cette gravitation, c'est une acceleration qui va vers le bas (vers le centre de la terre)

                    Une fois que tu sais ça, il faut savoir que la vitesse c'est la primitive de l'acceleration
                    (lol, au cas où y en a qui savent pas, la primitive c'est le "contraire" de la dérivée. Et si y en a qui savent pas ce qu'est une dérivé, bas tant pis :lol: )
                    donc si l'acceleration qui s'applique sur toi c'est la gravitation: -g (négatif car s'applique vers le bas)
                    alors la vitesse c'est -g*t + Vo (une droite)

                    Ensuite, la position dans l'espace c'est la primitive de la vitesse
                    donc c'est -g*t*t/2 + Vo*t + Yo

                    Voilà, ensuite j'ai bettement voulu essayé de mettre ça dans une fonction, mais peut etre qu'en pratique c'est pas trop faisable...
                    Et puis j'ai pas pris en compte les frottements de l'air :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      17 avril 2006 à 16:10:37

                      Ouais... enfin dans un jeu de plate-forme appliquer le coefficent gravitationnel courant, c'est exagéré non ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 avril 2006 à 21:11:43

                        Mais non ! Comme ça, si jamais il y a un monde sur la lune, il suffira de diminuer ce chiffre ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 avril 2006 à 23:21:25

                          Ecoute c'est pas pour vouloir vous vexer mais si on parle de trajectoirs,jetez la physique à la poubelle et prenez vos cahier de math.
                          Tout d'abors il faut trouver une courbe qui ressemble au saut souaité. Le principe est d'incrementer x et de calculer y en fonction de x(si on va vers la droite sinon on fait une décrémantation.)Autrement dit si il se deplace de 1pixel vers la droite il se deplace de tant de pixel vers le haut(ou le bas).
                          Comme vous devez le savoir toute courbe de math à une équation voir 2 equations sur 2 intervales si elle est vraiment tordue ou l'equation est trop dificile.
                          Vous aves une courbe en tête?
                          Moi j'ai trouvé: y=(x-7)²/10+4,9

                          Vous trouvez ma courbe moche,alors prenez une calculette graphique et trouve une courbe plus coherente.

                          Il faut dabors déclarer quelques variables: y, qui va stoquer l'ordonnees du perso et x qui va permetre de de lire la courbe,on l'initialise a 0.

                          Prenons position.x et position.y les cordonnées du joueur.

                          Tout dabors quand on demande de sauter on donne une valeur à une variable puis on verrifit à l'aide de cette dernière dans la boucle si on a demander de sauter pour pouvoir faire nos petits calculs.
                          et on donne à y la valeur de position.y

                          Bien sur on interdit un nouveau saut tant que celui la est pas fini.
                          L'idéal est de créer une fonction qui dit quand le joueur est bloqué par le bas pour stoper le saut(idem par la droite.

                          on incremente x et on actualise les nouvelles coordonnées.
                          if ( saut==1 )
                          {
                             x++;
                             position.x = position.x+1;
                             position.y = y -( (x-7)*(x-7)/10 +4,9 );
                          }

                          if( bloqueBas(position)==1)
                          saut = 0;





                          On peut faire d'autres fonction: une si le perso ne saute pas et est dans le fait tomber et une autre qui anule le saut si il rencontre un obstacle. Ainsi si il rencontre un obstacle il s'arrete d'avancer et tombe.

                          Mais mon équation ne permet que les sauts vers la droite.Vers la gauche on fait une décrementation et on utilise celle la: y=(-x-7)²/10+4,9.

                          Ce qui est bien dans cette methode c'est que le perso va monter puis descendre tout seule.




                          Il y a un gros problème: C'est que le saut ne s'ettend que sur 14 pixels.Mais bon tout le monde sait faire de la proportionalité.
                          position.x = position.x+(1)*3;
                             position.y = y -( (x-7)*(x-7)/10 +4,9 )*3;


                          maintenant il s'ettend sur 3x14pixel.Si on veut faire plus le deplacement ce fera beaucoup de pixels par beaucoup de pixels et là je le conçois c'est moche.Le mieu est de déclarer x comme nombre decimaux et l'incrementé de 0,1;
                          x+=0,1;
                          position.x = position.x+((0,1)*10);
                             position.y = y -( (x-7)*(x-7)/10 +4,9 )*10;


                          Le saut se fera sur 10*14 pixels mais l'image se déplcera pixel par pixel.


                          Pour mon mario (ici) je n'est pas utilisé ce type de saut,je vien juste d'y penser, c'est une exclusivité pour vous. Donc si il s'avère que c'est de la gross m**** dite le.






                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            18 avril 2006 à 1:06:25

                            Aze, jpeux te prendre l'image du monstre champignon pour mon mario stp ?

                            j'ai déja fini tous les mouvements je m'attaque à la gestion de monstres :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 avril 2006 à 4:22:19

                              Ba loin de moins l'idée de dénigrer les math. Mais nan pêche que si tu veux le saut le plus réaliste possible, c'est quand même la physique qui est le mieux placé... :o (elle est faite pour ça)
                              Mais bon, ce n'est pas forcément un gage de rapidité de calcul, et puis t'façon si on veut faire un saut suréaliste où estle problème?? (vive les sauts triangulaires!! :p )
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 avril 2006 à 10:30:12

                                Dernière nouvelle : Abandon du jeu :-(
                                trop la flemme de continuer en c.
                                Creation d'un site de jeu de rôle en php.
                                Vous voulez le lien ? Eh bin, je ne vous le donnerai pas pour l'instant !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 avril 2006 à 11:00:27

                                  Tu peut tout prendre dans mon mario, puisque toute les images viennent de google.Mais je ne sait pas ou t'as vu un monstre chapignon, les seules méchants sont des tortues.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    18 avril 2006 à 13:17:44

                                    elle a un peu une gueule de champignon ta tortue :)

                                    enfin pas grave, voila la nouvelle version avec les monstres champignong (ou tortues) !
                                    http://annaccondavz.free.fr/zozor.zip

                                    Si vous etes motivé pour faire des niveaux je vous expliquerias la syntaxe du fichier "niveau.txt"

                                    et ce coup ci j'ai séparé les fonctions dans plusieurs fichiers ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 avril 2006 à 14:29:37

                                      En effet les tients ressemblent à des champignons, Mais moi je n'ai pas utilisé ton champignon mais une tortueImage utilisateur.Sinon pour ton jeu j'ai été obligé de rajouter un sleep().Ce n'était pas jouable.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        18 avril 2006 à 14:33:35

                                        hum une boucle temporelle serait bien sur ton jeu, car zozor il va plus vite que flash chez moi...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 avril 2006 à 14:41:37

                                          J'espère que M@teo parlera du temps assez rapidement.

                                          Mais dans ton cas (celui qui code le jeu) :

                                          Dans ton code quelque part au début de la gestion du mouvement :
                                          static Uint32 last_time = SDL_GetTicks();
                                          Uint32 current_time = SDL_GetTicks();
                                          Uint32 ellapsed_time = current - last_time;
                                          last_time = current_time;

                                          et appel tes fonctions de mouvement avec le parametre ellapsed_time.

                                          Par exemple pour faire bouger un perso tu fais
                                          perso.x += vitesse_sur_x_en_pixel_par_milliseconde * ellapsed_time

                                          Du coup tu as des mouvements indépendants de la vitesse d'éxécution.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            18 avril 2006 à 22:54:08

                                            static Uint32 last_time = SDL_GetTicks();


                                            ca marche pas ca, le C veut pas de fonction pour initialiser les variables "static"...
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              18 avril 2006 à 22:57:06

                                              Ben tu la mets en variable globale quelque part le problème est pas là.
                                              Le code donné était ici C++ mais l'idée est "last_time" doit être initialisé une seule fois à la première frame.
                                              Je connais pas le code du gars en question pour savoir exactement en quoi il compile ni où il doit le mettre.
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Berli rpg

                                              × 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