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

SDL Discussion :

Problème également avec IMG_Load


Sujet :

SDL

  1. #81
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Heu mais non, car les pommes se blit quand le serpent les manges.
    Or si le serpent ne bouge pas, donc il ne peut pas les manger (et donc pas de blittage de pommes ).

    Voila comment j'ai fais ma pause :

    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
     
    case SDLK_RETURN:
                                if(!enPause)
                                {
                                    ancienneVitesse = vitesse;
                                    //Je met une valeur négative à la
                                    //variable vitesse
                                    vitesse = -1;
     
                                    //enPause = 1 (le jeu est en pause :p)
                                    enPause = 1;
                                }
                                else //Sa veut dire que enPause = 1
                                {
                                    //On remet la vitesse à son ancienne valeur
                                    vitesse = ancienneVitesse;
     
                                    //On dis que le jeu n'est plus en pause :)
                                    enPause = 0;
                                }
                                break;
    Et ensuite pour ne plus que le serpent avance j'ai fais sa :

    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
     
    /* GESTION DU TEMPS */
     
            //On regarde si la vitesse n'est pas négative
            if(vitesse > 0)
            {
                tempsActuel = SDL_GetTicks();
                if((tempsActuel - tempsPrecedent) > vitesse)
                {
                    //On appelle une fonction pour déplacer le serpent
                    deplacerSerpent(direction,positionSerpent,&positionPomme,nombreDeCorp,&gameOver,&pomme);
     
                    tempsPrecedent = tempsActuel; //On remet tempsPrecedent à 0
     
                }//Fin du if((tempsActuel - tempsPrecedent) > vitesse)
     
            }//Fin du if(vitesse > 0)
    En gros quand on appuie sur entrée, on sauvegarde l'ancienne vitesse, et on met la variable vitesse à -1.

    Ensuite je teste si ma variable vitesse est négative, si elle ne l'ai pas je déplace le serpent.

    Mais le problème c'est que quand j'appuie sur entrée (pour mettre le jeu en pause), sa accélère le serpent :s

    A+

  2. #82
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    case SDLK_RETURN:
                                if(!enPause)
                                {
                                    ancienneVitesse = vitesse;
                                    //Je met une valeur négative à la
                                    //variable vitesse
                                    vitesse = -1;
    //...
    essaye plutot en mettant vitesse à 0 et pas à -1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    case SDLK_RETURN:
                                if(!enPause)
                                {
                                    ancienneVitesse = vitesse;
                                    //Je met une valeur négative à la
                                    //variable vitesse
                                    vitesse = 0;
    //...

  3. #83
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    heu non en faite plus tu met une valeur basse à vitesse plus ça iras vite donc il te faut entourer(un if) avec un booleen qui dira si oui ou non on deplace le serpent.

  4. #84
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    C'est fait, tu as raison c'est plus simple de tester si enPause vaut 0 ou pas

    Il me reste 2 choses que je veux faire ensuite j'auais fini mon jeu !

    La première c'est pouvoir blitter la tête du serpent d'une autre couleur (je vais réfléchir comment je vais m'y prendre).

    Et le deuxième c'est : si le serpent se passe dessus, on affiche un cadre bleu avec écrit GameOver dessus (et un lien pour refaire une partie).

    Pour l'instant mon gameOver ne marche pas, voila comment j'a fais :

    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
     
    void deplacerSerpent(int direction, SDL_Rect positionSerpent[], SDL_Rect *positionPomme, int nombreDeCorp,int *gameOver, int *pomme)
    {
        int i = 0;
    //Je vous passe la suite
    //Maintenant on test si le serpent ne se passe pas dessus
        for(i = 1 ;i < nombreDeCorp ; i++)
        {
            //Si le serpent se passe dessus
            if(positionSerpent[0].x == positionSerpent[i].x && positionSerpent[0].y == positionSerpent[i].y)
            {
                //Dans ce cas là on lui dit qu'il a perdu
                gameOver = 1;
            }
        }
    Ensuite je fais sa :

    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
     
    //Si le joueur a perdu (gameOver = 1)
            if(gameOver)
            {
                //On créer le rectangle
                surfaceGameOver = SDL_CreateRGBSurface(SDL_HWSURFACE,200,200,32,0,0,0,0);
     
                //On colorie le rectangle
                SDL_FillRect(surfaceGameOver,NULL,SDL_MapRGB(surfaceGameOver->format,0,0,200));
     
                //On positionne le carré
                positionAutresElements.x = ecran->w/2;
                positionAutresElements.y = ecran->h/2;
     
                //Et on blit :)
                SDL_BlitSurface(surfaceGameOver,NULL,ecran,&positionAutresElements);
                fprintf(stderr,"GameOver vaut %ld",gameOver);
            }
    Voila, et ne fonctionne pas :s

    A+

  5. #85
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    c'est bien le bon code mais le test que tu fait ce fait dans la fonction deplacer serpent, je pense que si tu mettais ce code dans la boucle principale de ton main ça ferait le test si le serpent ce mord à chaque tour de boucle et pas à l'appel de la fonction deplacerSerpent.

  6. #86
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    heu en faite tu peu trés bien manipuler le gameOver dans ta fonction sauf que tu ne dois pas oublier que c'est un pointeur donc qu'il faut que tu fasse.

    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
     
    void deplacerSerpent(int direction, SDL_Rect positionSerpent[], SDL_Rect *positionPomme, int nombreDeCorp,int *gameOver, int *pomme)
    {
        int i = 0;
    //Je vous passe la suite
    //Maintenant on test si le serpent ne se passe pas dessus
        for(i = 1 ;i < nombreDeCorp ; i++)
        {
            //Si le serpent se passe dessus
            if(positionSerpent[0].x == positionSerpent[i].x && positionSerpent[0].y == positionSerpent[i].y)
            {
                //Dans ce cas là on lui dit qu'il a perdu
                *gameOver = 1;
            }
        }

  7. #87
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    J'ai mis le test pour savoir si il se passe dessus dans la boucle principale.

    Apparament sa marche (enfin gameOver passe à 1), mais rien ne s'affiche !

    Pourtant ce code est bon ? :

    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
     
    //Si le joueur a perdu (gameOver = 1)
            if(gameOver)
            {
                //On créer le rectangle
                surfaceGameOver = SDL_CreateRGBSurface(SDL_HWSURFACE,LARGEUR_CADRE_GAMEOVER,HAUTEUR_CADRE_GAMEOVER,NBRE_DE_BIT,0,0,0,0);
     
                //On colorie le rectangle
                SDL_FillRect(surfaceGameOver,NULL,SDL_MapRGB(surfaceGameOver->format,0,0,200));
     
                //On positionne le carré
                positionAutresElements.x = (ecran->w/2) - (LARGEUR_CADRE_GAMEOVER / 2);
                positionAutresElements.y = (ecran->h/2) - (HAUTEUR_CADRE_GAMEOVER / 2);
     
                //Et on blit :)
                SDL_BlitSurface(surfaceGameOver,NULL,ecran,&positionAutresElements);
            }
    Quand le serpent se passe dessus il devrait apparaitre un carré bleu de taille 200 * 200 (mes #define LARGEUR_CADRE_GAMEOVER et HAUTEUR_CADRE_GAMEOVER valent 200).

    Mais rien ne s'affiche !

    A+

  8. #88
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    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
    //Si le joueur a perdu (gameOver = 1)
            if(*gameOver == 1)
            {
                //On créer le rectangle
                surfaceGameOver = SDL_CreateRGBSurface(SDL_HWSURFACE,LARGEUR_CADRE_GAMEOVER,HAUTEUR_CADRE_GAMEOVER,NBRE_DE_BIT,0,0,0,0);
     
                //On colorie le rectangle
                SDL_FillRect(surfaceGameOver,NULL,SDL_MapRGB(surfaceGameOver->format,0,0,200));
     
                //On positionne le carré
                positionAutresElements.x = (ecran->w/2) - (LARGEUR_CADRE_GAMEOVER / 2);
                positionAutresElements.y = (ecran->h/2) - (HAUTEUR_CADRE_GAMEOVER / 2);
     
                //Et on blit :)
                SDL_BlitSurface(surfaceGameOver,NULL,ecran,&positionAutresElements);
            }

  9. #89
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    n'oublie pas que tu est dans ta fonction donc il faut que tu travaille avec un pointeur vers gameOver.

  10. #90
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Re

    Je l'ai retiré de ma fonction.
    Ce morceau de code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Maintenant on test si le serpent ne se passe pas dessus
            for(i = 1 ;i <= nombreDeCorp ; i++)
            {
                //Si le serpent se passe dessus
                if(positionSerpent[0].x == positionSerpent[i].x || positionSerpent[0].y == positionSerpent[i].y)
                {
                    //Dans ce cas là on lui dit qu'il a perdu
                    gameOver = 1;
                }//Fin du if
            }//fin du for
    Il est dans ma boucle principale.

    Il y a pas mal de bug car apparament ma variable gameOver vaut 1 des le début !
    Dans mon code ou j'affiche le carré, j'ai rajouté : enPause = 1, pour que le programme se mette en pause.
    Et des que je lance le programme, la fenetre se met directement en pause.
    Donc apparament, il y a un problème dans mon code, comme si le serpent initialement positionné se passait dessus :s

    A+

  11. #91
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    là j'avoue que pour faire mes propres test il me faudrais ton code donc si tu pouvais me l'envoyer.

  12. #92
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    C'est normal, il faut un && logique à la place de ton ||.

    Jc

  13. #93
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    J'avais mis && à la place de || mais sa ne change rien !

    Il y a plein de choses que je trouve bizard (par exemple quand on place la tête du serpent au début).

    J'ai fais un zip de mon code : Cliquez ici

    A+

  14. #94
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    premierement : tu avais oublié un SDL_Flip(ecran); dans ton blit de la surface bleu. ça ne l'affichais pas car c'etait masqué par le fond ecran.
    deuxiémement : il faut repensé ta boucle for d'une autre maniére car tu verras le probléme qui ce pose à toi aprés ce petit probléme réglé (SDL_Flip())

    edit :

    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
            if(gameOver)
            {
                //On créer le rectangle
                surfaceGameOver = SDL_CreateRGBSurface(SDL_HWSURFACE,LARGEUR_CADRE_GAMEOVER,HAUTEUR_CADRE_GAMEOVER,NBRE_DE_BIT,0,0,0,0);
    
                //On colorie le rectangle
                SDL_FillRect(surfaceGameOver,NULL,SDL_MapRGB(surfaceGameOver->format,0,0,200));
    
                //On positionne le carré
                positionAutresElements.x = (ecran->w/2) - (LARGEUR_CADRE_GAMEOVER / 2);
                positionAutresElements.y = (ecran->h/2) - (HAUTEUR_CADRE_GAMEOVER / 2);
    
                //Et on blit :)
                SDL_BlitSurface(surfaceGameOver,NULL,ecran,&positionAutresElements);
                SDL_Flip(ecran);
            }

  15. #95
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Il parrait qu'il ne faut mettre qu'un SDL_Flip() par programme, donc j'ai mis le SDL_FillRect() qui colorie l'ecran avant le blit (comme sa on voit mon carré bleu )

    Sinon je sais qu'il faut que je mette le jeu en pause, met je rajouterais cette ligne de code après, car la sa me fait bugger mon programme (sa rame).

    De quel boucle for parlais tu ?

    A+

  16. #96
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    les problèmes tu sais ça vas... ça viens... mais ça viens plus qu'autre chose
    sinon dis moi quel probléme tu rencontre maintenant?

  17. #97
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Mon problème actuel, c'est que des que je lance mon programme, ma variable gameOver se met à 1 (comme si j'avais perdu !).

    A+

  18. #98
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    non elle ne ce met pas à 1 c'est juste que les coordonnées sont considérées comme egales tout le temps. il faut repenser ton for.

  19. #99
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    En tout cas il execute le code qu'il y a à l'interieur de if(gameOver){...}

    Il faut que je repense ce for ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Maintenant on test si le serpent ne se passe pas dessus
            for(i = 1 ; i <= nombreDeCorp ; i++)
            {
                //Si le serpent se passe dessus
                if(positionSerpent[0].x == positionSerpent[i].x && positionSerpent[0].y == positionSerpent[i].y)
                {
                    //Dans ce cas là on lui dit qu'il a perdu
                    gameOver = 1;
                }//Fin du if
            }//fin du for
    Je vois pas trop comment faire autrement ? Mon code est clair, si la tête du serpent est sur le corp alors il a perdu !

    A+

  20. #100
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    oui mais apparemment ça ne fonctionne pas car c'est toujours considérés comme egal donc gameOver est toujours egal à 1. je pense qu'il faudrais penser autrement ou faire une verification de tes placement de tout les membres de ton serpent pour verifier si c'est egal ou pas à la position de la tête.

Discussions similaires

  1. Problème avec IMG_load
    Par erreipnaej dans le forum SDL
    Réponses: 11
    Dernier message: 16/11/2008, 10h41
  2. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  3. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. problème JSP avec JBuilder et Weblogic 7
    Par viny dans le forum JBuilder
    Réponses: 2
    Dernier message: 24/04/2003, 08h07

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