Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut SDL ne peut plus déclarer de variable

    Bonjour,

    Je suis nouveau et j'ai un problème avec mon code : j'ai un projet à faire pour mon école avec la SDL 2D et la SDL image et le problème est que je ne peux plus du tout déclarer de variable sinon mon programme met les images n'importe comment et le blitting ne se fait pas correctement.

    Voici mon code :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    #include <SDL/SDL.h>
    #include <C:/Program Files (x86)/CodeBlocks/SDL/include/SDL_image.h>
    #include "Ecran.h"
    #include "SDL_audio.h"
    #define _VV_ 15
     
    int main ( int argc, char** argv )
    {
        int tempsPrecedent = 0, Vitesse, continuer = 1;
        SDL_Event event;
        SDL_Rect coordonnees, Acoordonnees, fond;
        SDL_Surface  *ecran, *background, *avionA, *avion, *avionG, *avionD = NULL;
     
        coordonnees.x = 0;
        coordonnees.y = 0;
     
        fond.x = 140;
        fond.y = 13490;
     
        INIT();
        //chargement de la page, du nom de la page et de l'icone
        SDL_WM_SetIcon(IMG_Load("pack_images_sdz/iconejeu.bmp"), NULL);
        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
        SDL_WM_SetCaption("Flying Shark",NULL);
        //chargement des images
        background = IMG_Load("pack_images_sdz/background.bmp");
        avion = IMG_Load("pack_images_sdz/plane.bmp");
        avionG = IMG_Load("pack_images_sdz/planeL.gif");
        avionD = IMG_Load("pack_images_sdz/planeR.gif");
     
     
        //Acoordonnees.x = (200) - (avion->w/2); //premier test pour la position mais changer,ne s'adaptai pas a l'écran
        // Acoordonnees.y = (450) - (avion->h/2);
     
        Acoordonnees.x = ecran->w/2 - avion->w/2;
        Acoordonnees.y = ecran->h/1.3 - avion->w/1.3;
     
        SDL_SetColorKey(avion, SDL_SRCCOLORKEY, SDL_MapRGB(avion->format, 0, 0, 0)); //gere la transparence
     
        SDL_EnableKeyRepeat(10, 10); // sert a gerer la fluidité des déplacements
     
        SDL_BlitSurface(avionA, NULL, ecran, &Acoordonnees);
        Vitesse = SDL_GetTicks();
            avionA = avion;
     
       while (continuer) // affichage
        {
        SDL_BlitSurface(background, &fond, ecran , &coordonnees);
        SDL_BlitSurface(avionA, NULL, ecran, &Acoordonnees);
        SDL_Flip(ecran);
     
        SDL_PollEvent(&event); //evenementiel
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                break;
                case SDL_KEYDOWN: // Si appui d'une touche
        if (SDL_GetTicks() - Vitesse > 30 )
        {
                  switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: //Appui sur la touche Echap, on arrête le programme
                        continuer = 0;
                        break;
                        case SDLK_UP: //déplacement
                        avionA = avion;
                        Acoordonnees.y -=_VV_ ;
                        break;
                         case SDLK_DOWN:
                         avionA = avion;
                        Acoordonnees.y +=_VV_;
                        break;
                         case SDLK_RIGHT:
                         avionA = avionD;
                        Acoordonnees.x  +=_VV_ ;
                        break;
                         case SDLK_LEFT:
                         avionA = avionG;
                        Acoordonnees.x -=_VV_ ;
                        break;
                         case SDLK_SPACE:
                              ;
                        break; // evenementiel fin
                    }
                    Vitesse = SDL_GetTicks();
            }
                    break;
                    case SDL_KEYUP:
                        {
                            switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: //Appui sur la touche Echap, on arrête le programme
                        continuer = 0;
                        break;
                        case SDLK_UP: //déplacement
                        avionA = avion;
                        break;
                         case SDLK_DOWN:
                         avionA = avion;
                        break;
                         case SDLK_RIGHT:
                         avionA = avion;
                        break;
                         case SDLK_LEFT:
                         avionA = avion;
                        break;
                         case SDLK_SPACE:
                              ;
                        break; // evenementiel fin
                    }
                    Vitesse = SDL_GetTicks();
                }
          }
     
          if(Acoordonnees.x>ecran->w-avion->w) //calcul (pour que l'image ne sorte pas de l'écran)
              {
                Acoordonnees.x = ecran->w - avion->w;
              }
         else if(Acoordonnees.x<0)
            {
                 Acoordonnees.x = 0;
            }
     
          if(Acoordonnees.y>ecran->h-avion->h)
              {
                Acoordonnees.y = ecran->h- avion->h;
              }
            else if(Acoordonnees.y<0)
          {
            Acoordonnees.y = 0;
          }
         if (SDL_GetTicks() - tempsPrecedent > 30 ) //la caméra monte dans le niveau
            {
                fond.y-=3;
                tempsPrecedent = SDL_GetTicks (); // le temps précédent devient le temps actuel pour la suite
            }
        }
     
        SDL_FreeSurface(avion);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }

    ps: INIT sert a charger SDL_INIT_VIDEO

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2011
    Messages : 253
    Points : 126
    Points
    126

    Par défaut

    Où se situe exactement ton problème ? Je dois avouer que ce n'est pas très clair

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Mon probleme est le suivant, si je lance mon code comme sa il marche (il y a un avion que l'on peut dirigé et en fond le décor qui scrolle en vertical avec un timer) mais si je rajoute une seul variable, meme sans l'utilisé apres (par exemple int i = 1; ), le programme plante et l'avion se retrouve sur un fond noir, le blittage de marche pas et le décor utilisé pour le fond se trouve a l’extrémité vertical au dessus du fond noir

  4. #4
    Expert Confirmé Sénior


    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    5 009
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 5 009
    Points : 14 910
    Points
    14 910

    Par défaut

    A tout les coups, ce doit être un SEGFAULT, tu dois avoir un pointeur qui pointe n'importe où, si tu écris et si tu change ou rajoute une ligne l'erreur est détectée.


    Essaye de voir ce que te dit Valgrind.

    Et regarde ce que donne l'exécution de ton programme avec DDD.

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    j'ai refait mon code et je pense que le problème vient de ma caméra (écran dans mon code précédent, renommé caméra dans celui ci-dessous)
    voila la petite partie qui est concernée et que j'ai faite, mais je comprend pas pourquoi l'image de fond s'affiche qu'en haut de la fenêtre:
    Code C :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    int main (int argc, char *argv[])
    {
        SDL_Surface *camera, *background/*, *avion, *avionL, *avionR*/ = NULL;
        SDL_Rect coordonnees, fond/*, Acoordonnees*/;
        int tempsPrecedent = 0, Vitesse, continuer = 1;
        //SDL_Event event;
        coordonnees.x = 0;
        coordonnees.y = 0;
     
        fond.x = 140;
        fond.y = 13190;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        //chargement de la page, du nom de la page et de l'icone
        SDL_WM_SetIcon(IMG_Load("images/iconedejeu.bmp"), NULL);
     
        camera = SDL_SetVideoMode(800,600,32, SDL_HWSURFACE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Flying Shark", NULL);
     
         //chargement des images
        background = IMG_Load("images/background.bmp");
        SDL_BlitSurface(background, &fond, camera, &coordonnees);
     
        SDL_Flip(camera);
        pause();

  6. #6
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 754
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 754
    Points : 86 266
    Points
    86 266

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    coordonnees.x = 0;
        coordonnees.y = 0;
     
        fond.x = 140;
        fond.y = 13190;
     
     SDL_BlitSurface(background, &fond, camera, &coordonnees);
    Il semble que vous afficher toujours en 0,0. ( http://sdl.beuc.net/sdl.wiki/SDL_BlitSurface )

    J'ose croire que vous avez inverser coordonnees et fond.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    oui j'y avait pensé aussi mais dans l'autre sens cela ne marche pas :/

  8. #8
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 754
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 754
    Points : 86 266
    Points
    86 266

    Par défaut

    La coordonnées de fond.y me semble énorme.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    c'est normal je charge le niveau en entier et après il se scroll avec un timer en décrémentant

  10. #10
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 754
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 754
    Points : 86 266
    Points
    86 266

    Par défaut

    Si j'en crois ce tutoriel -> http://loka.developpez.com/tutoriel/sdl/premiere_app/
    Les coordonnées en Y, vont vers le bas. Donc votre image est affiché à plus de 14000 pixels en dessous de l'écran.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    oui c'est sa le concept, l'écran commence en haut a gauche aux coordoonnées 0,0 et avec ma fonction caméra je veut commencer en bas de la map déja chargé en fond en remontant (décrémentation de y) pour au final arrivé a y = 0, et la le niveau est finit

  12. #12
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 754
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 754
    Points : 86 266
    Points
    86 266

    Par défaut

    Je vais tenter de reprendre
    Le schéma pour la SDL :

    Soit, la coordonnées en 14000 est très très bas de l'écran.
    Maintenant, pour le background que vous utilisez (et pour toute les images), le point en haut à gauche est au coordonnée 0,0.
    Donc, si vous voulez afficher le bas de l'image, il faut être en -14000 (enfin, selon la dimension). Ou alors, gérer l'affichage morceau pas morceau en définissant les width et height des SDLRect (à passer dans SDL_BlitSurface).
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 264
    Points : 448
    Points
    448

    Par défaut

    Hello,

    Je tique sur 2 choses dans ton code:
    Code :
    1
    2
    fond.x = 140;
    fond.y = 13190;
    Quand tu fais ton blitSurface(..,&fond,...), il va prendre dans l'image background la coordonnée (140,13190) et la blitter en (0,0) de ecran
    C'est peut-être ce que tu souhaites, mais n'est-il pas plus normal d'écrire
    Code :
    1
    2
    fond.x = 0;
    fond.y = background->h-ecran->h;
    De cette manière, tu es sur de blitter un écran complet.

    La seconde chose, beaucoup plus importante, c'est que fond.w et fond.h ne sont pas renseignés.
    Or,
    Code :
    int SDL_BlitSurface(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
    Function Parameters
    src: the SDL_Surface structure to be copied from
    srcrect: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface
    dst: the SDL_Surface structure that is the blit target
    dstrect: the SDL_Rect structure representing the rectangle that is copied into

    The width and height in srcrect determine the size of the copied rectangle. Only the position is used in the dstrect (the width and height are ignored). Blits with negative dstrect coordinates will be clipped properly.

    Source.
    Au mieux, fond.w et fond.h valent 0, au pire, absolument n'importe quoi, et donc ton programme va chercher des informations on ne sait où (ce qui n'est peut-être pas le plus grave), mais il va les écrire quelque part en mémoire... et écraser quelque chose, ce qui t'amène dans le genre de situation dans laquelle tu te trouves.

    Edgar.

  14. #14
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2012
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Le problème venait bien de .h et .w merci a tous et surtout merci a toi edgarjacobs.
    donc pour ceux qui ont le même problème j'ai fait
    Code :
    1
    2
    3
    4
      coordonnees.x = 140; //position (un peu décalé du coté gauche) pour centrer
        coordonnees.y = 13500; //position (en bas de la map)
        coordonnees.h = 600; //ta fenêtre
        coordonnees.w = 800;

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •