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 :

SDL ne peut plus déclarer de variable


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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 : 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
    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
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut
    Où se situe exactement ton problème ? Je dois avouer que ce n'est pas très clair

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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 : 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
    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
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Ma page sur DVP
    Mon Portfolio

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

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    La coordonnées de fond.y me semble énorme.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

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

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    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

    Ma page sur DVP
    Mon Portfolio

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

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    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

    Ma page sur DVP
    Mon Portfolio

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

  13. #13
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Je tique sur 2 choses dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. je ne peut plus accédé a ma base de donnée Interbase
    Par touhami dans le forum InterBase
    Réponses: 2
    Dernier message: 19/11/2005, 09h21
  2. Réponses: 5
    Dernier message: 20/09/2005, 22h48
  3. Un peut plus beau !
    Par Virgile59 dans le forum Contribuez
    Réponses: 3
    Dernier message: 15/09/2005, 13h11
  4. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50
  5. peut on mettre 1 variable ds la fonct° ouverture d'1 popup?
    Par zorba49 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/07/2005, 12h24

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