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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    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
    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 575
    Points
    218 575
    Billets dans le blog
    120
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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;
               }
            }
    ...
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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 ;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut
    j'ai rajouté le modulo
    mais sa ne change rien l'image va de droit a gauche
    le modulo de j%=4 si j=0 puis j++ j passe a 1 j/4=0,25 donc 0 reste
    mais si j=0 mon image devrais rester a droit
    je ne comprend pas a quoi peux me servir ce modulo ici

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    J'ai l'impression que tu as mal compris le modulo (noté %).

    0%4 = 0
    1%4 = 1
    2%4 = 2
    3%4 = 3

    4%4 = 0
    5%4 = 1
    6%4 = 2
    7%4 = 3

    et ainsi de suite.
    Il s'agit du reste de la division euclidienne (ou 'division entiere').

    21\4 = 5*4 + 3 (ici on a une division euclidienne).
    21/4 = 5 (division d'entier)
    21%4 = 3 (reste de la division euclidienne)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut
    j'ai compris mon erreur pour les modulo
    1%4= 1
    9%4=1

    le modulo sera utile quand j=4 4%4=0 j=0 pour remettre direction[0]=2 a droite

    mais pour le code je n'arrive pas a déplacé l'image en bas

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Le code présenté, en éliminant le code propre à la partie SDL, passe bien par toutes les directions.

    - 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 ;
    Que voulais-tu faire avec ces deux lignes ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

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


    j'ai écris ces deux lignes pour un déplacement plus rapide avec la souris

    le code fonctionne enfin mais je vois pas pourquoi je dois utiliser une boucle for
    dans ma fonction pour répéter 4 fois la meme directions
    c'est par rapport aux conditions du périmètre

    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}
    je remet le 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
    #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;
        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;
        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,taille,tab);
            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));
            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++)/*cette boucle ne sert a rien pour moi */
            {
     
            switch (direction)/*sans la boucle je dois pouvoir transmettre   une 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;
            }
        }
    }
    en fait le modulo sert a remettre a départ mon tableaux de direction pour que mon image ne fini pas de bouger
    sinon il faut répetté deux fois la boucle for une fois pour lancer la direction et une autre pour vérifier si l'image est arriver aux bout de la condition

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    j'ai écris ces deux lignes pour un déplacement plus rapide avec la souris
    Mais ces deux lignes ne font RIEN

    le code fonctionne enfin mais je vois pas pourquoi je dois utiliser une boucle for dans ma fonction pour répéter 4 fois la meme directions
    Moi non plus. Je suis étonné que tu mettes une boucle for en étant persuadé que tu n'en as pas besoin

    Je ne vois pas à quoi sert le tableau tab. Quelle importance y a t-il à ce que ce soit l'élément 0 ou 1 ou 2 ou 3 qui soit à 1 ? la chose interessante (si j'ai bien compris) est que l'un d'entre eux soit à 1.
    Dans ce cas, il suffit que la fonction deplacerROBOT() renvoie 1 ou 0 selon qu'il faille incrémenter ou non la direction.
    On aurait alors quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while (continu)
        {
           j = (j+deplacerROBOT(direction[j],&position)) %4;
           SDL_PollEvent(&event);
    ....
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int deplacerROBOT(int direction,SDL_Rect *position)
    {
        switch (direction)
        {
             case HAUT:
                if ((*position).y<0) return 1;
                (*position).y--;
                 break;
    ....
        }
        return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    j'essai d'implanter la fonction chargerNiveau( carte[][NB_BLOC_LONGEUR])
    a la fonction main
    mais des que je tape 1 avec case SDLK_KP1:
    animation(ecran);
    le code s'arrète j'en conclu que la fonction chargerNiveau ne fonctionne pas
    if (!chargerNiveau(carte))
    {
    exit(EXIT_FAILURE);
    }
    et je comprend pas ou est l'erreur
    aux niveaux de cette ligne de code switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j]) ici pour i=1 j=0 on fait 1x10 + 0 =10 et les 9 premiers on les modifies pas ?


    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
    #include <stdio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL.h>
    #include <time.h>
    #include "main.h"
    int chargerNiveau(int carte[][NB_BLOC_LONGEUR]);
    int enregistrerNiveau(int carte[][NB_BLOC_LONGEUR]);
    void animation(SDL_Surface *ecran);
    void deplacerROBOT(int direction,SDL_Rect *position,int *contacteZone);
    void editeur(SDL_Surface *ecran);
    int main ( int argc, char** argv )
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Surface *ecran=NULL,*menu=NULL;
        int continu=1;
        SDL_Event event;
        SDL_Rect position;
        position.x=0;
        position.y=0;
        menu=SDL_LoadBMP("menu.bmp");
        ecran=SDL_SetVideoMode(LARGEUR_FENETRE,LONGEUR_FENETRE,32,SDL_HWSURFACE);
        int carte[NB_BLOC_LARGEUR][NB_BLOC_LONGEUR]={0};
        while (continu)
        {
            SDL_WaitEvent(&event);
            switch (event.type)
            {
            case SDL_QUIT:
                continu=0;
                break;
            case SDL_KEYDOWN :
                switch (event.key.keysym.sym)
                {
                case SDLK_KP1:
                    animation(ecran);
                    break;
                case SDLK_KP2:
                    editeur(ecran);
                    break;
                case SDLK_KP3:
                    chargerNiveau(carte);
                    break;
                case SDLK_KP4:
                    continu=0;
                    break;
                }
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,255,255,255));
            SDL_BlitSurface(menu,NULL,ecran,&position);
            SDL_Flip(ecran);
        }
    }
    void animation(SDL_Surface *ecran)
    {
        SDL_Surface *robot=NULL;
        robot=SDL_LoadBMP("robot aspi.bmp");
        SDL_Rect position ;
        position.x=0;
        position.y=0;
        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;
        int carte[NB_BLOC_LARGEUR][NB_BLOC_LONGEUR]={0};
        SDL_Event event;
        if (!chargerNiveau(carte))
        {
            exit(EXIT_FAILURE);
        }
     
        while (continu)
        {
            deplacerROBOT(direction[j],&position,tab);
            for (i=0;i<taille;i++)
            {
                if (tab[i]==1)
                {
                    tab[i] = 0;
                    j++;
     
                }
            }
            SDL_PollEvent(&event);
            switch (event.type)
            {
            case SDL_QUIT:
                continu=0;
                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,255,255,255));
            SDL_BlitSurface(robot,NULL,ecran,&position);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(robot);
    }
     
    int chargerNiveau(int carte[][NB_BLOC_LONGEUR])
    {
        FILE* fichier = NULL;
        char ligneFichier[NB_BLOC_LARGEUR * NB_BLOC_LONGEUR + 1] = {0};
        int i = 0, j = 0;
     
        fichier = fopen("nivau.txt", "r");
        if (fichier == NULL)
        {
            return 0;
        }
     
        fgets(ligneFichier, NB_BLOC_LARGEUR * NB_BLOC_LONGEUR + 1, fichier);
     
        for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOC_LONGEUR ; j++)
            {
                switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j])/*et la je comprend pas cette ligne */
                {
                case '0':
                    carte[i][j]= 0;
                    break;
                case '1':
                    carte[i][j]= 1;
                    break;
     
                }
            }
        }
     
        fclose(fichier);
        return 1;
    }

  14. #14
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il y a confusion entre NB_BLOC_LARGEUR et NB_BLOC_LONGEUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOC_LONGEUR ; j++)
            {
                switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j])/*et la je comprend pas cette ligne */
                {
                 case '0':
                    carte[j][i]= 0;
                    break;
    (i * NB_BLOC_LARGEUR) + j : ce type d'expression arrive lorsqu'on a un tableau à une dimension, mais qu'on veut y accéder comme si c'était un tableau à deux dimensions (d'indices i, j dans cet ordre) dont la deuxième dimension serait de NB_BLOC_LARGEUR éléments.

    Ici, cette indexation est incorrecte puisque l'indice dans ligneFichier[(i * NB_BLOC_LARGEUR) + j]) va varier de 0 à NB_BLOC_LARGEUR*(NB_BLOC_LARGEUR-1) + NB_BLOC_LONGEUR-1 alors que le tableau ligneFichier[] attend visiblement NB_BLOC_LARGEUR * NB_BLOC_LONGEUR éléments.

    i * NB_BLOC_LONGEUR + j donnerait de 0 à NB_BLOC_LONGEUR*(NB_BLOC_LARGEUR-1)+NB_BLOC_LONGEUR-1 soit NB_BLOC_LONGEUR*NB_BLOC_LARGEUR-1 ce qui serait correct.

    Naturellement, ceci ne peut être la cause du problème si NB_BLOC_LONGEUR = NB_BLOC_LARGEUR


    D'après la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int carte[NB_BLOC_LARGEUR][NB_BLOC_LONGEUR]
    on s'attend à lire carte[i][j]= 0 puisque i varie de 0 à NB_BLOC_LARGEUR-1 et j de 0 à NB_BLOC_LONGEUR-1 plutôt que carte[j][i]= 0;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

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


    j'ai inverser dans le tableau carte le j et le i dans le dernier post
    mais ca ne fonctionne pas.
    cette ligne est un problème pour moi switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j])
    cette ligne ne permet pas de modifier les cases une a une mais que dix cases sur 100 du tableau carte ?
    sur cette ligne on a ajouter un 1 pour /0 ? "char ligneFichier[NB_BLOC_LARGEUR * NB_BLOC_LONGEUR + 1] = {0};"

    ne faut il pas mieux écris pour le switch (ligneFichier[i*j])?

  16. #16
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    cette ligne est un problème pour moi switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j])
    Comme je l'ai dit plus haut, cette ligne est fausse. elle devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    switch (ligneFichier[(i * NB_BLOC_LONGEUR ) + j])
    cette ligne ne permet pas de modifier les cases une a une mais que dix cases sur 100 du tableau carte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOC_LONGEUR ; j++)
            {
                switch (ligneFichier[(i * NB_BLOC_LONGEUR ) + j]) 
                {
    Pour i = 0, on accède, lorsque j varie, aux éléments d'indices 0...NB_BLOC_LONGEUR-1
    Pour i = 1 aux éléments d'indices NB_BLOC_LONGEUR...2*NB_BLOC_LONGEUR-1
    etc... jusqu'au dernier élément d'indice NB_BLOC_LARGEUR *NB_BLOC_LONGEUR-1
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut
    je te remercie ton aide
    j'ai compris pour le switch et corriger l'erreur fichier = fopen("nivau.txt", "r");
    alors que c'est fichier = fopen("niveau.txt", "r");oublie du e
    y me reste plus qu'a implanter et a comprendre l'algo a*
    mais y faut savoir manipuler les files et pas les filles
    et la c'est pas gagner
    en fais j'ai compris les structures possibilité de créer un type avec plusieurs types différents et donc une variable pointeur sur tout types

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    j'ai rajouter un obstacle "mur position2.x" pour l'image" robot position.x " aux niveau de l'axe des coordonné X uniquement
    j'ai donc modifier la fonction void deplacerRobot(int direction,SDL_Rect *position,SDL_*Rect position2,int *contacteZone)
    le problème c'est que l' image ne ce déplace pas vers l'obstacle qui ce trouve dans l'axe X Exemple les jeux pc ou on clik sur un endroit de l'écran et le personnage ce dirige
    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
    void deplacerROBOT(int direction,SDL_Rect *position,SDL_Rect *position2,int *contacteZone)
    {
        int i;
    
        for (i=0;i<2;i++)
        {
            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 || (*position).x+50>=(*position2).x)/*ici la condition qui n'est pas correcte*/
                {
                    contacteZone[2]=1;
                    break;
                }
                (*position).x++;
                break;
            case GAUCHE:
                if ((*position).x<0)
                {
                    contacteZone[3]=1;
                    break;
                }
                (*position).x--;
                break;
            }
        }
    }

  19. #19
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Je ne vois pas encore le probleme que tu evoque, juste un conseil :


    Ca se simplifie comme ceci :

    c'est plus lisible et ca permet de pallier au classique oubli de '*'.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            case HAUT:
                if ((*position).y<0)
                {
                    contacteZone[0]=1;
                    break;
                }
                (*position).y--;
                break;
    Mais a quoi sert le premier break; ??? Si c'est pour eviter de faire position->y--; alors un simple else aurait tout aussi bien fait l'affaire et aurai eu le merite d'etre clair !
    Car le break que je vois me fait plutot penser a sortir du if immediatement.

    a quoi sert le i ? a te deplacer de 2 pixel ?

    quant a ton probleme de deplacement, je ne comprend pas comment tu compte le faire ...
    Tu veux que lorsque l'utilisateur clique sur un point, ton robot s'y deplace ?
    Il faut deja retenir le point et ensuite calculer de combien tu va te deplacer a chaque tour.

  20. #20
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    A quoi sert la boucle
    Au maximum, tu vas te déplacer de 2 unités.

    Ne serait-ce pas plutôt quelque chose du genre :

    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
     
    void deplacerROBOT(int direction,SDL_Rect *position,SDL_Rect *position2,int *contacteZone)
    {
       int fin = 0 ;
       while (!fin)
            switch (direction)
            {
     
    ....
                case DROIT:
                  if  (position->x+50 >= LONGEUR_FENETRE || position->x+50 >= position2->x)   
                      fin = contacteZone[2] = 1;
                  else position->x++;
                  break;
    ....
            }
    }
    @SofEvans :
    Car le break que je vois me fait plutot penser a sortir du if immediatement.
    break ne peut être utilisé que dans le cadre d'un switch ou d'une boucle, pas d'un if.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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