Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programmer tout mon jeu en code ou avec éditeur?

je sais pas du tout

Sujet résolu
    28 juin 2007 à 11:00:03

    Bonjour,
    je voudrais faire un jeu 2d avec des sprites , avec la SDL, je suis parti pour coder tout mon jeu , sans utiliser d'éditeur, je voudrais savoir si le fait d'avoir un éditeur est + approprié. Si oui, y aurait il quelqu'un qui pourrait me mettre le code de l'éditeur? uniquement avec deux éléments:
    un mur
    une herbe
    J'aimerais que ça enregistre dans un fichier "terrain.lvl" si possible, et me donner le bout de code qui me permettra au jeu de mettre en place tous les éléments ( je veux 2 programmes séparés,le jeu et l'éditeur). J'ai déjà essayé de faire avec le code de M@teo214 mais sans succès.
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2007 à 14:01:18

      Un éditeur est plus approprié, car tu pourras ainsi modifier une carte sans avoir a recompiler ton jeu.

      Pour ce qui est tu "je veux", et bien c'est pas comme ça qu'on demande :(.

      Se que tu demandes n'est pas compliqué, si tu t'arrêtes sur une difficulté de ce genre tu ne finiras pas ton jeu ou alors c'est pas toi qui l'auras fait.

      Il faut que tu prennes le temps de réfléchir, de toi même, sans copier un code de M@atéo21.

      Te vais te donner des indications :
      je suppose que tu as un tableau pour la map.
      donc il faut que tu créés des fichiers contenant une map,
      que tu arrives à l'afficher dans ton jeu.

      Tu l'appelles comme tu veux, ton fichier, mais il faudra pour la modifier utiliser un éditeur de texte, seulement quand tu en seras là s'il est nécessaire du faire un éditeur il faudra réfléchir sur comment modifier les cases de ton tableau de ta map et de l'enregistrer.

      Faits d'abord un lecteur de carte avant l'éditeur.
      • Partager sur Facebook
      • Partager sur Twitter
        28 juin 2007 à 15:30:39

        J'y arrive!! J'y arrive!! Mon prog est en cours , mais j'aurais besoin de vos conseils:

        - Quand j'appuye sur clic gauche, j'aimerais que l'objet que j'ai sur mon curseur soit blitté, facile, mais quand je veux en mettre plusieurs? Je ne sais pas comment faire, je n'ai pas d'idées.

        merci de votre aide
        • Partager sur Facebook
        • Partager sur Twitter
          28 juin 2007 à 15:51:30

          Utilise un tableau de SDL_Rect ;)
          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2007 à 16:17:06

            C'est bon j'ai fait SDL_Rect posherbe[100];
            et après?
            comment je fais pour qu'il blitte toutees les herbes?
            j'ai essayé SDL_BlitSurface(herbe,NULL,ecran,&posherbe); mais ça ne marche pas
            je vais essayer de faire que si on appuye sur clic gauche, cela cré une variable rect et je donne l'endroit où il doit se blitter, et que si on met quelque chose par dessus ça supprime la variable de position et en cré une autre.
            postez dès que vous avez des idées pour m'aider s'il vous plaît.
            • Partager sur Facebook
            • Partager sur Twitter
              29 juin 2007 à 1:07:44

              Euh en fait tu veux qu'en appuyant sur le bouton gauche de ta souris, tu veux que les 100 surfaces herbes soient blittées en même temps ?
              Si c'est ça alors c'est simple, ton image herbe a un certain format, il te suffit de créer une boucle qui va initialiser les 100 positions en fonction du format de l'image. Par exemple, si ton image fait du 4*4 et que ton écran est de 400 par 400, tu fais :

              SDL_Rect posHerbe[100];

              posHerbe[0].x=0;
              posHerbe[0].y=0;

              for(int i = 1; i < 0, i++)
              {
               if(posHerbe[i-1].x<=400) // tu vérifies que tu ne sors pas de la fenêtre sur l'axe des x
               {
               posHerbe[i].x=posHerbe[i-1].x + 4;
               posHerbe[i].y=posHerbe[i-1].y;
               }
               else // c'est-à-dire que tu vas changer de ligne
               {
               posHerbe[i].x=0;
               posHerbe[i].y=posHerbe[i-1].y + 4; // et donc augmenter sur l'axe des y
               }
              }


              Ensuite tu fais une simple boucle qui te blitte toutes les herbes aux positions que tu as initialisées dans la boucle ci-dessus.
              • Partager sur Facebook
              • Partager sur Twitter
                29 juin 2007 à 7:32:11

                Non,
                je voudrais que quand j'appuye sur clic gauche, on me blitte une image, et ça créé une varible SDL_Rect appropriée, et me blitte l'image. Mais je souhaiterais blitter plusieurs fois la même image, mais je n'ai pas décidé combien de fois.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  29 juin 2007 à 9:20:41

                  Bonjour! :)

                  Si tu as une taille définie pour ta carte (largeur x hauteur)?

                  Si c'est le cas, j'ai un moyen (que je n'ai pas testé) qui pourrais t'aider.

                  Pour cette technique, je penses que d'avoir un tableau de "block[largeur][hauteur]" est le plus approprié. ("block" étant une structure de la forme :
                  struct block
                  {
                      int typeImage; // Utilise une énumération pour les valeurs des différentes image (vide, herbe, terre, ...)
                      SDL_Rect position;
                  };


                  Oublie pas d'initialiser ton tableau de "block" en mettant "typeImage" égale à une image particulière (exemple : typeImage = VIDE).

                  Ensuite pour remplire un block, c'est facile : tu récupères la position de la souris au moment du clic et tu détermines alors sur quel "block" on a clicé. (Pour trouver la condition à effectuer, fais toi un schéma sur papier pour t'aider).

                  Quand tu connais le block, il te suffis de définir la valeur de "block[x][y].typeImage".

                  Et il ne te reste qu'à imaginer le système de boucle à faire pour blitter les différents "block" ;)

                  Bonne chance
                  Hiura
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 juin 2007 à 10:30:54

                    En fait, j'ai réussi grâce à l'éditeur de terrain de M@teo 21 , j'ai repris quelques bout de code et créé mon éditeur, j'arrive maintenant à faire ce que je veux grâce à mon éditeur, je vous passe le code:
                    #include <SDL.h>
                    #include <SDL_image.h>

                    #define TAILLE_BLOC 35
                    #define BLOCS_LARGEUR 20
                    #define BLOCS_HAUTEUR 20

                    int chargerNiveau(int carte[][BLOCS_HAUTEUR]);
                    int sauvegarderNiveau(int carte[][BLOCS_HAUTEUR]);
                    enum {TERRE,HERBE};

                    int main ( int argc, char** argv )
                    {
                        SDL_Init(SDL_INIT_VIDEO);
                        SDL_Surface *ecran = SDL_SetVideoMode(175 + BLOCS_LARGEUR * TAILLE_BLOC  ,BLOCS_HAUTEUR * TAILLE_BLOC,32,SDL_HWSURFACE);

                        SDL_Surface *terre = IMG_Load("sprites/decors/sol.bmp");
                        SDL_Surface *herbe = IMG_Load("sprites/decors/herbes/herbe1.bmp");
                        SDL_Surface *objetchoisi = herbe;
                        int objetActuel = HERBE;
                        int i = 0, j = 0;
                        SDL_Surface *menu = IMG_Load("menu.bmp");
                        SDL_Rect posherbe;
                        posherbe.x = 0;
                        posherbe.x = 0;
                        SDL_Rect posobj;
                        SDL_Rect posmenu;
                        bool clicGaucheEnCours = false;

                        int carte[BLOCS_LARGEUR][BLOCS_HAUTEUR] = {0};

                        SDL_Rect position;

                        posmenu.x = BLOCS_LARGEUR * TAILLE_BLOC;
                        posmenu.y = 0;



                        SDL_Event event;

                        bool continuer = true;

                       chargerNiveau(carte);

                       SDL_WarpMouse(ecran->w / 2, ecran->h / 2);

                        while (continuer)
                        {
                            if(objetchoisi == herbe)
                            {objetActuel = HERBE;}

                            if(objetchoisi == terre)
                            {objetActuel = TERRE;}

                            SDL_WaitEvent(&event);
                            switch(event.type)
                            {
                                case SDL_QUIT:
                                    continuer = 0;
                                    break;

                                case SDL_KEYDOWN:
                                    switch(event.key.keysym.sym)
                                    {
                                        case SDLK_ESCAPE:
                                        continuer = false;
                                        break;

                                    }
                                    break;


                                case SDL_MOUSEBUTTONDOWN:

                            if (event.button.button == SDL_BUTTON_LEFT) /* On arrête le programme si on a fait un clic droit */
                            {
                                if(event.motion.x >=BLOCS_LARGEUR * TAILLE_BLOC && event.motion.x <= BLOCS_LARGEUR * TAILLE_BLOC + 34 && event.motion.y >= 0 && event.motion.y <= 34)
                                {objetchoisi = terre;}
                                if(event.motion.x >=BLOCS_LARGEUR * TAILLE_BLOC + 35 && event.motion.x <= BLOCS_LARGEUR * TAILLE_BLOC + 70 && event.motion.y >= 0 && event.motion.y <= 34)
                                {objetchoisi = herbe;}
                                if(event.motion.x >=BLOCS_LARGEUR * TAILLE_BLOC + 140 && event.motion.x <= BLOCS_LARGEUR * TAILLE_BLOC + 175 && event.motion.y >= 0 && event.motion.y <= 34)
                                {sauvegarderNiveau(carte);}
                                if(event.motion.x >=BLOCS_LARGEUR * TAILLE_BLOC + 140 && event.motion.x <= BLOCS_LARGEUR * TAILLE_BLOC + 175 && event.motion.y >= 35 && event.motion.y <= 74)
                                {chargerNiveau(carte);}
                                if(posobj.x <= BLOCS_LARGEUR * TAILLE_BLOC)
                                {
                                carte[event.button.x / TAILLE_BLOC][event.button.y / TAILLE_BLOC] = objetActuel;
                                clicGaucheEnCours = 1;
                                }



                            }

                            break;

                            case SDL_MOUSEBUTTONUP: // On désactive le booléen qui disait qu'un bouton était enfoncé
                            if (event.button.button == SDL_BUTTON_LEFT)
                            {clicGaucheEnCours = 0;}

                           break;

                           case SDL_MOUSEMOTION:
                           posobj.x = event.motion.x;
                                posobj.y = event.motion.y;
                        if (clicGaucheEnCours) // Si on déplace la souris et que le bouton gauche de la souris est enfoncé
                        {
                            carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = objetActuel;
                        }
                       break;
                            }
                            // Effacement de l'écran
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                    // Placement des objets à l'écran
                    for (i = 0 ; i < BLOCS_LARGEUR ; i++)
                    {
                        for (j = 0 ; j < BLOCS_HAUTEUR ; j++)
                        {
                            position.x = i * TAILLE_BLOC;
                            position.y = j * TAILLE_BLOC;

                            switch(carte[i][j])
                            {
                                case HERBE:
                                    SDL_BlitSurface(herbe, NULL, ecran, &position);
                                    break;
                                case TERRE:
                                    SDL_BlitSurface(terre, NULL, ecran, &position);
                                    break;
                            }
                        }
                    }
                    SDL_BlitSurface(menu,NULL,ecran,&posmenu);
                    SDL_BlitSurface(objetchoisi,NULL,ecran,&posobj);
                    // Mise à jour de l'écran
                    SDL_Flip(ecran);
                        }

                        SDL_FreeSurface(terre);
                        SDL_FreeSurface(herbe);
                        SDL_FreeSurface(objetchoisi);
                        SDL_Quit();
                        return EXIT_SUCCESS;
                    }


                    int chargerNiveau(int carte[][BLOCS_HAUTEUR])
                    {FILE* fichier = NULL;
                        char ligneFichier[BLOCS_LARGEUR * BLOCS_HAUTEUR + 1] = {0};
                        int i = 0, j = 0;

                        fichier = fopen("terrain.lvl", "r");


                        fgets(ligneFichier, BLOCS_LARGEUR * BLOCS_HAUTEUR + 1, fichier);

                        for (i = 0 ; i < BLOCS_HAUTEUR ; i++)
                        {
                            for (j = 0 ; j < BLOCS_LARGEUR ; j++)
                            {
                                switch (ligneFichier[(i * BLOCS_LARGEUR) + j])
                                {
                                    case '0':
                                        carte[j][i] = 0;
                                        break;
                                    case '1':
                                        carte[j][i] = 1;
                                        break;
                                    case '2':
                                        carte[j][i] = 2;
                                        break;
                                    case '3':
                                        carte[j][i] = 3;
                                        break;
                                    case '4':
                                        carte[j][i] = 4;
                                        break;
                                }
                            }
                        }

                        fclose(fichier);
                        }

                    int sauvegarderNiveau(int carte[][BLOCS_HAUTEUR])
                    {
                        FILE* fichier = NULL;
                        int i = 0, j = 0;

                        fichier = fopen("terrain.lvl", "w");

                        for (i = 0 ; i < BLOCS_HAUTEUR ; i++)
                        {
                            for (j = 0 ; j < BLOCS_LARGEUR ; j++)
                            {
                                fprintf(fichier, "%d", carte[j][i]);
                            }
                        }

                        fclose(fichier);

                    }


                    et quelques images:
                    Image utilisateur
                    Image utilisateur
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 juin 2007 à 10:45:56

                      tu pourrais utiliser des classes ça serait mieux pour modifier ton éditeur, pouvoir rajouter des fonctionnalités, pour un problème d'organisation surtout.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juin 2007 à 11:04:14

                        je sais pas utiliser les classes, quoique si mais faut que je révise... en tout cas merci à tous
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Programmer tout mon jeu en code ou avec éditeur?

                        × 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