Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SDL
SDL Forum d'entraide sur l'API SDL. Avant de poster -> FAQ SDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/05/2012, 23h34   #1
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2012, 00h33   #2
Lintel-oo
Membre habitué
 
Homme
Étudiant
Inscription : avril 2011
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 239
Points : 128
Points : 128
Où se situe exactement ton problème ? Je dois avouer que ce n'est pas très clair
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2012, 03h07   #3
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
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
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2012, 06h25   #4
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 590
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 590
Points : 7 007
Points : 7 007
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/05/2012, 14h53   #5
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
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();
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2012, 17h35   #6
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 415
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 : 10 415
Points : 39 726
Points : 39 726
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.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2012, 20h26   #7
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
oui j'y avait pensé aussi mais dans l'autre sens cela ne marche pas :/
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 00h25   #8
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 415
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 : 10 415
Points : 39 726
Points : 39 726
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.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 01h42   #9
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
c'est normal je charge le niveau en entier et après il se scroll avec un timer en décrémentant
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 09h33   #10
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 415
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 : 10 415
Points : 39 726
Points : 39 726
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.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 16h34   #11
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
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
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 17h07   #12
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 415
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 : 10 415
Points : 39 726
Points : 39 726
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.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2012, 02h28   #13
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 203
Points : 319
Points : 319
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,
Citation:
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.
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2012, 11h01   #14
Jarmen kell
Invité de passage
 
Homme
Étudiant
Inscription : 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
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;
Jarmen kell est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h18.


 
 
 
 
Partenaires

Hébergement Web