Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]soucis de fonction

Sujet résolu
    11 avril 2006 à 19:59:01

    Yop yop :)

    Avec les derniers chapitres en date je me suis lancé dans la prog d'un jeux, enfin le début car il manque encore 2 3 chapitres mini je pense pour pouvoir le mener à bien. ;)

    Enfin bref, arriver à un certain nombre de lignes, j'ai voulu faire un peut de rangement en augmentant le nombre de fonctions pour simplifier le main pour la suite couper en plusieurs fichiers plus aisement mais un petit probleme se pose... :/

    Si la séparation de l'affichage pour le fond et l'interface c'est bien passée, celle pour l'affichage d'une piece nettement moins. En effet sur le code suivant qui fonctionne, si l'ont commente les lignes en dessu du commentaire // generation et affichage d'une pièce // jusqu'au comment // generator(); // et que l'ont decomment ce dernier pour faire appel a la fonction du meme noms qui contient les memes commandes alors cela ne fonctionne plus o_O

    Je sais pas trop si j'ai été clair mais je suis un peu embrouillé là :-°


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

    SDL_Surface *ecran = NULL;

    void background();
    void interface();
    void generator();

    int largeurPiece = 0;
    int hauteurPiece = 0;

    int main(int argc, char *argv[])
    {
        int continuer = 1;

        SDL_Init(SDL_INIT_VIDEO);

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); // On tente d'ouvrir une fenêtre
        SDL_WM_SetCaption("Tetris...", NULL);

        SDL_Surface *piece;

        // position dans la fenetre des differents elements graphique
        SDL_Rect PositionInterface;
            PositionInterface.x = 0;
            PositionInterface.y = 0;
        SDL_Rect positionPiece;
            positionPiece.x = 90;
            positionPiece.y = 90;

        SDL_Event event;

        background();
        interface();

        // generation et affichage d'une piece
        int nb = 1;
        switch (nb)
        {
            case 1:
            piece = IMG_Load("imgs/1.png");
            largeurPiece = 60;
            hauteurPiece = 15;
            break;
            case 2:
            piece = IMG_Load("imgs/2.png");
            largeurPiece = 45;
            hauteurPiece = 30;
            break;
        }
        SDL_BlitSurface(piece, NULL, ecran, &positionPiece);
    //    generator();

        SDL_Flip(ecran); // refresh d'ecran

        while (continuer)
        {

            SDL_WaitEvent(&event);
            switch(event.type)
            {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                    case SDLK_DOWN:
                        if ( (positionPiece.y + 15) >= 390 - hauteurPiece )
                        {
                            positionPiece.y = 390 - hauteurPiece;
                        }
                        else
                        {
                            positionPiece.y = positionPiece.y +15;
                        }
                        break;
                    case SDLK_RIGHT:
                        if ( positionPiece.x == 240 - largeurPiece )
                        {
                            positionPiece.x = positionPiece.x;
                        }
                        else
                        {
                            positionPiece.x = positionPiece.x +15;
                        }
                        break;
                    case SDLK_LEFT:
                        if ( positionPiece.x == 90 )
                        {
                            positionPiece.x = positionPiece.x;
                        }
                        else
                        {
                            positionPiece.x = positionPiece.x -15;
                        }
                        break;
                }
                if ( positionPiece.y < 390 - hauteurPiece )
                {
                    positionPiece.y = positionPiece.y +1;
                }
                break;
            }

            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            background(), interface();//generator();
            SDL_BlitSurface(piece, NULL, ecran, &positionPiece);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(piece);
        SDL_Quit();

        return (0);
    }

    void background()
    {
        SDL_Surface *Background = NULL;
        SDL_Rect PositionBackground;
            PositionBackground.x = 0;
            PositionBackground.y = 0;

        Background = IMG_Load("imgs/bg001.png");
        SDL_BlitSurface(Background, NULL, ecran, &PositionBackground);
    }

    void interface()
    {
        SDL_Surface *Interface = NULL;
        SDL_Rect PositionInterface;
            PositionInterface.x = 0;
            PositionInterface.y = 0;

        Interface = IMG_Load("imgs/autour.png");
        SDL_BlitSurface(Interface, NULL, ecran, &PositionInterface);
    }

    void generator() // d'une piece
    {
        SDL_Surface *piece = NULL;

        SDL_Rect positionPiece;
           positionPiece.x = 90;
           positionPiece.y = 90;

        int nb = 1;

        switch (nb)
            {
                case 1:
                piece = IMG_Load("imgs/1.png");
                largeurPiece = 60;
                hauteurPiece = 15;
                break;
                case 2:
                piece = IMG_Load("imgs/2.png");
                largeurPiece = 45;
                hauteurPiece = 30;
                break;
        }
        SDL_BlitSurface(piece, NULL, ecran, &positionPiece);
    }

    • Partager sur Facebook
    • Partager sur Twitter
      11 avril 2006 à 21:12:25

      Bonjour !
      Pourrais-tu être plus précis sur ce qui ne marche pas ?
      Est-ce la compilation, ou bien le déroulement prévu du jeu ?
      Si c'est le déroulement, en quoi diffèret-il de tes prévisions ? (aucun affichage de la pièce, affichage à un endroit non prévu, ...).
      (J'aurais bien testé ar moi-même, mais j'ai pas de compilateur sous la main)
      • Partager sur Facebook
      • Partager sur Twitter
        11 avril 2006 à 21:46:39

        Bah à vrai dire, il n'y a aucune erreur à la compilation dans les 2 cas mais c'est le fonctionnemant de l'ensemble qui merdouille dans l'un des 2 cas...

        Dans la config sans rien toucher au code donnée ci dessus, sa marche nickel, enfin comme prevu. cad, tout apparait et je peut deplacer la piece sans soucis...
        Dans la config en commentant et decommentant comme indiquer pour prendre en compte la fonction generator, la piece n'apparait plus et j'ai droit en quittant à un segfault en bonus dans la console secondaire d evenement :/
        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2006 à 8:00:31

          Bah, je peut toujours pas tester, mais esaye de transfomer tes variables "positionPiece" et "piece" en pointeurs que tu passe en arguments à la fonction. Ca se pourrait que ça joue sur le déroulement principal du jeu, qui qui est une source d'erreur assez impressionnant, vu que tu modifie une piece que tu n'as pas générée (tout du moins pas a même). :-°
          Ce n'est pas parce que deux variables portent le même noms qu'elles sont pareilles ! Donc tu crée ta variable dans ton generator(), (tu oublie de libérer l'espace mémoire), puis tu crois que tu modifie celle-ci dans ton main, ce qui n'est pas le cas. ^^
          Donc wsoit tu refait le tout avec des pointeurs (ça paraît impressionnant, mais ça devrait passer sans être trop dur), soit tu fait des tests en mettant tes variablers en variables globales (ça va pas êter beau, mais ça permet de tester. Il faudra, si ça marche à ce moment, que tu recode avec des pointeurs de toute façon...).

          Voila, j'espère que ça va marcher (je peut pas te le garantir, j'ai pas de compilateur :'( )
          • Partager sur Facebook
          • Partager sur Twitter
            12 avril 2006 à 10:56:53

            Citation

            vu que tu modifie une piece que tu n'as pas générée (tout du moins pas a même). :-°
            Ce n'est pas parce que deux variables portent le même noms qu'elles sont pareilles ! Donc tu crée ta variable dans ton generator(), (tu oublie de libérer l'espace mémoire), puis tu crois que tu modifie celle-ci dans ton main, ce qui n'est pas le cas. ^^


            Arf oui, c'est pour sa que la piece n'aparrait pas (en faite elle apparait et disparait aussi tot a la lancer du prog) car je veut rafraichir dans le main() la generation fait dans generator(), mais si je renvoi dans generator() comme je le fais pour le fond et l interface quand je rafraichi le tout apres l'"event" la piece apparait bien mais impossible de la bouger car elle reprend a chaque fois les valeurs initiales des variables ce qui logique. :o

            J'ai pas vraiment masse de variables à pouvoir passer en global, positionPiece me peut passer en global sauf en definissant une variable pour x et pour y mais le resultat et la piece apparait mais ne peut bouger pour la meme raison que cidessus...

            Me reste les pointeurs, et je suis pire qu'un Zero avec ces bestiolles là. :-°

            EDIT de 2h plus tard :p

            Bon j'ai relu le cours sur les pointeurs et j'ai un peu mieux assimilé le truc que les fois d'avant. J'ai donc modifier en conséquence et cela fonctionne. :)
            En conclusion, loué soit les Horis... oups... loué soit les pointeurs. ^^
            Bien que du coup sa complique légerement le code, mais aumoins sa permet de faire communiquer plus efficacement les différentes fonctions...
            • Partager sur Facebook
            • Partager sur Twitter

            [SDL]soucis de fonction

            × 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