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

 C Discussion :

debutant SDL une aide pour comprendre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Par défaut debutant SDL une aide pour comprendre
    salut

    le code compile mais des étapes de l'animation ne sont pas pressant
    pourquoi les étapes "3"gauche et "0"haut de la variable direction[4] ne sont pas appliqué ?



    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
     
    #include <stdio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL.h>
    #include <time.h>
    #include "main.h"
    void deplacerROBOT(int *direction,SDL_Rect *position,int taille,int *contacteZone);
    int main ( int argc, char** argv )
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Surface *ecran=NULL,*robot=NULL;
        FILE *fichier=NULL;
        int continu=1;/*boucle */
        int direction[4]={2,3,1,0};/*les quatre direction droit gauche bas haut*/
        int tab[4]={0};
        int taille=4;
        int *contacteZone=&tab[0];/*pointeur permet de modifier la valeur de la variable tab */
        int i,j=0,longeur=0,largeur=0;
        SDL_Event event;
        SDL_Rect position;
        position.x=0;
        position.y=0;
        ecran=SDL_SetVideoMode(LARGEUR_FENETRE,LONGEUR_FENETRE,32,SDL_HWSURFACE);
        robot=SDL_LoadBMP("robot aspi.bmp");
     
        while (continu)
        {
            direction[j];/*on envoi la premier valeur du tableau direction qui est 2 "droit"*/
            deplacerROBOT(&direction[j],&position,taille,contacteZone);
            for (i=0;i<taille;i++)/*boucle pour regarder qu'elle est la position du tableau mi a 1*/
            {
                if (tab[i]==1)/*condition pour changer de direction */
                {
                    tab[i]=0;/*on remette tout les valeur de tab[i] a zero*/
     
                    j++;/*on incrément la position du tableau direction*/
                 if    (j==4)/*condition quand on atteint la limite de la position du tableau direction*/
                    {
                    j=0;/*on remet la position du tableau de direction a zero*/
                    }
                }
            }
            SDL_PollEvent(&event);
            switch (event.type)
            {
            case SDL_QUIT:
                continu=0;
                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,255,255,255));
            position.x*TAILLE_BLOC;
            position.y*TAILLE_BLOC ;
            SDL_BlitSurface(robot,NULL,ecran,&position);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(robot);
    }
    void deplacerROBOT(int *direction,SDL_Rect *position,int taille,int *contacteZone)
    {
        int i;
        for (i=0;i<taille;i++)
        {
            switch (*direction)
            {
            case HAUT:
                if ((*position).y<0)
                {
                    contacteZone[i]=1;
                    break;
                }
                (*position).y--;
                break;
            case BAS:
                if ((*position).y+50>=LARGEUR_FENETRE)
                {
                    contacteZone[i]=1;
                    break;
                }
                (*position).y++;
                break;
            case DROIT:
              if  ((*position).x+50>=LONGEUR_FENETRE)
                {
                    contacteZone[i]=1;
                    break;
                }
                (*position).x++;
                break;
            case GAUCHE:
                if ((*position).x<0)
                {
                    contacteZone[i]=1;
                    break;
                }
                (*position).x--;
                break;
            }
        }
    }
    fichier h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef MAIN_H_INCLUDED
    #define MAIN_H_INCLUDED
    #define TAILLE_BLOC 50
    #define NB_BLOC_LARGEUR 10
    #define NB_BLOC_LONGEUR 10
    #define LARGEUR_FENETRE  NB_BLOC_LARGEUR*TAILLE_BLOC
    #define LONGEUR_FENETRE  NB_BLOC_LONGEUR*TAILLE_BLOC
    enum{HAUT,BAS,DROIT,GAUCHE};
    #endif // MAIN_H_INCLUDED

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Première remarque,

    Dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int i,j=0,longeur=0,largeur=0;
    Votre i n'est pas inialiser , alors que les autres variables le sont. Mieux vaut toute les initialisées.
    De plus vous l'utiliser sans l'initialisé semblerait t'il.

    Pour avoir une vérification par le compilateur, il faut activer les warnings ( pour gcc option: -Wall -Wextra ).
    Pour Visual, niveau 4 ( je crois ) dans les options de compilation.

    [OUPS , pardon c'est initialiser dans le for, mais mon conseil sur les warnings tient toujours ]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    direction[j];/*on envoi la premier valeur du tableau direction qui est 2 "droit"*/
    Ceci ne fait absolument rien ...

    Pourquoi passer direction en pointeur ( pour deplacerROBOT ) alors que vous ne modifier pas la valeur.
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Par défaut reponse
    salut

    merci de m'avoir répondu
    aux niveaux de ma fonction la variable direction reste toujours a la meme
    position direction[0]=2 "droite"?
    mais l'image va a droite puis en bas aux lieux d'aller a gauche
    il y a quand meme un changement de position et de la valeur du tableau direction
    en fait dans ma fonction il suffit juste d'envoyer la valeur de direction et pas sa position
    l'erreur viendrais donc de direction qui reste sur la meme position et la meme valeur ?

    sinon en envoyant direction comme une simple variable et non comme un pointeur
    prototype de la fonction void deplacerROBOT(int direction,SDL_Rect *position,int taille,int *contacteZone)
    l'appel de la fonction deplacerROBOT(&direction[j],&position,taille,contacteZone);
    ca ne change rien aux problème d'animation de ce code
    l'image ne fait pas droit,gauche,bas,haut mais de droit puis bas
    le code sauts des positions du tableaux directions

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce n'est pas lié à la SDL.
    Voici le déroulement de ton programme. Ca t'aidera à le corriger en détectant là où il y a anomalie par rapport à ton objectif :

    1- On débute avec direction==DROIT et position== (0,0)

    2- On va exécuter 4 fois le case DROIT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
             if  ((*position).x+50>=LONGEUR_FENETRE)
                {
                    contacteZone[i]=1;
                    break;
                }
                (*position).x++;
                break;
    ce qui amènera position à (4,0), laisse tab à {0,0,0,0,}; j reste à 0 et on reste sur direction==DROIT

    3- au passage suivant, on sera à (8,0), tab à {0,0,0,0,}; j reste à 0 et on reste sur DROIT ainsi de suite jusqu'à (448,0), direction == DROIT

    4- déplacerROBOT() va alors faire (LONGEUR_FENETRE==500) :
    i=0 : (449,0) tab {0,0,0,0}
    i=1 : (450,0) tab {0,0,0,0}
    i=2 : (451,0) tab {0,0,1,0}
    i=3 : (452,0) tab {0,0,1,1}
    en sortie j passe à 2 soit direction==BAS

    5- Le même mécanisme se produit avec BAS qui se termine avec : (452,452) et tab avec {0,0,1,1} et j passe à 2+2 = 4 modulo 4 soit 0 et on passe à DROIT.

    6- On reste éternellement à DROIT puisque tab sera toujours à {1,1,1,1} et j = j+4 modulo 4; j sera inchangé.


    Ceci étant,
    - il est inutile de passer l'adresse de direction[j] plutôt que sa valeur
    - contacteZone est inutile, on peut passer directement tab
    - le code de deplacerROBOT() peut s'écrire de façon plus lisible (pour moi)
    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
    void deplacerROBOT(int direction,SDL_Rect *position,int taille,int *contacteZone)
    {
        int i;
        for (i=0;i<taille;i++)
        {
            switch (direction)
            {
            case HAUT:
                if (position->y<0) contacteZone[i]=1;
                else position->y--;
                break;
            case BAS:
                if (position->y+50>=LARGEUR_FENETRE) contacteZone[i]=1;
                else position->y++;
                break;
            case DROIT:
                if  (position->x+50>=LONGEUR_FENETRE)  contacteZone[i]=1;
                else position->x++;
                break;
            case GAUCHE:
                if (position->x<0)contacteZone[i]=1;
                else position->x--;
                break;
            }
        }
    }
    avec dans main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
            deplacerROBOT(direction[j],&position,taille,tab);
            for (i=0;i<taille;i++)/*boucle pour regarder qu'elle est la position du tableau mi a 1*/
            {
               if (tab[i]==1)
               {
                 tab[i] = 0;             
                 j++;
                 j %= 4;
               }
            }
    ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Par défaut
    salut
    j'ai supprimé la boucle for dans la fonction
    j'ai fais n'importe quoi dans la fonction avec cet boucle for
    j'ai bien les deux premières direction gauche puis droit
    mais bas et haut ne sont pas incrémenter

    dans ma fonction le pointeur direction[i] reste toujours a 1
    exemple quand l'image va a droit et arrive a sa condition qui stop l'image
    on rentre dans la condition de la fonction le pointeur direction[2]=1 donc la variable tab[2]=1
    dans la main la boucle regarde tout les positions de tab[i] quand elle arrive a tab[2]=1 on rentre dans la condition if de la main pour incrémenter j et changer de direction puis on remet tab[i] qui est tab[2] a 0



    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
    #include <stdio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL.h>
    #include <time.h>
    #include "main.h"
    void deplacerROBOT(int *direction,SDL_Rect *position,int *contacteZone);
    int main ( int argc, char** argv )
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Surface *ecran=NULL,*robot=NULL;
         int continu=1;
        int direction[4]={2,3,1,0};
        int tab[4]={0};
        int taille=4;
        int *contacteZone=&tab[0];
        int i=0,j=0,longeur=0,largeur=0;
        SDL_Event event;
        SDL_Rect position;
        position.x=0;
        position.y=0;
        ecran=SDL_SetVideoMode(LARGEUR_FENETRE,LONGEUR_FENETRE,32,SDL_HWSURFACE);
        robot=SDL_LoadBMP("robot aspi.bmp");
     
        while (continu)
        {
     
     
            deplacerROBOT(&direction[j],&position,contacteZone);
            for (i=0;i<taille;i++)
            {
                if (tab[i]==1)
                {
                    tab[i]=0;
                    j++;
                    j %= 4;
                 }
            }
     
     
            SDL_PollEvent(&event);
            switch (event.type)
            {
            case SDL_QUIT:
                continu=0;
                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,255,255,255));
            position.x*TAILLE_BLOC;
            position.y*TAILLE_BLOC ;
            SDL_BlitSurface(robot,NULL,ecran,&position);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(robot);
    }
     
    void deplacerROBOT(int *direction,SDL_Rect *position,int *contacteZone)
    {
     
        switch (*direction)
        {
     
     
        case HAUT:
            if ((*position).y<0)
            {
                contacteZone[0]=1;
                break;
            }
            (*position).y--;
            break;
        case BAS:
            if ((*position).y+50>=LARGEUR_FENETRE)
            {
                contacteZone[1]=1;
                break;
            }
            (*position).y++;
            break;
        case DROIT:
            if  ((*position).x+50>=LONGEUR_FENETRE)
            {
                contacteZone[2]=1;
                break;
            }
            (*position).x++;
            break;
        case GAUCHE:
            if ((*position).x<0)
            {
                contacteZone[3]=1;
                break;
            }
            (*position).x--;
            break;
     
        }
    }

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - Il manque le modulo 4 sur j

    - Ces deux instructions n'ont aucun effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            position.x*TAILLE_BLOC;
            position.y*TAILLE_BLOC ;

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/01/2007, 23h28
  2. [Free Pascal] Aide pour comprendre une erreur de compilation
    Par SimoBenz dans le forum Free Pascal
    Réponses: 7
    Dernier message: 05/12/2006, 18h43
  3. Réponses: 4
    Dernier message: 18/11/2006, 22h58

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