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 :

Position mario dans sokoban


Sujet :

SDL

  1. #1
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 35
    Points : 45
    Points
    45
    Billets dans le blog
    1
    Par défaut Position mario dans sokoban
    Bonjour à tous,
    J'ai des petits problèmes concernant la conception de mon mario sokoban.
    J'ai réussi le tilemaping du jeu ,cependant j'ai remarqué un code que je n'arrive pas à cerner complètement.
    bref aperçu de mon codage suis débutant donc que pleuvent les critiques sa me tuera pas.
    Le main de mon programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include"cisco.h"
     
    int main(int argc,char *argv[])
    {
        fond();
        return 0;
    }
    La bibliothèque
    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
     
    /*Librairie du jeu sokoban
     
    Modification du dimanche 18/11/2012
     
    par Ambemou donald aristide................*/
     
     
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<SDL.h>
    #include<SDL/SDL_image.h>
    //variable  fenetre
    #define largeur T_blocy * T_bloc
    #define hauteur T_blocX * T_bloc
    //variable ecran
    #define T_blocX 6
    #define T_blocy 6
    #define T_bloc  34
    //Procedures et fonctions
     
    void fond();
    void pause();
    void deplacermario(int carte[][T_blocy],int direction,SDL_Rect *positionjoueur);
    void positionmario(int (*carte)[T_blocy],SDL_Rect *cordjoueur,int taill);
    void decor(SDL_Surface *screen);
     
    //Enumeration de deplacement
    enum {vide,mario,point,caisse,mur,caisse_ok};
    enum {bas,haut,gauche,droite};
    Fonctions du jeu
    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
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
     
    #include"cisco.h"
     
    void fond()
    {
        //Variable ecran
        SDL_Surface *ecran=NULL;
        //Initialisation et gestion erreur
        SDL_Init(SDL_INIT_VIDEO);
        if(SDL_Init(SDL_INIT_VIDEO)==-1)
        {
            fprintf(stderr,"Erreur de chargement",SDL_GetError());
            exit(EXIT_FAILURE);
        }
        //Initialisation ecran et gestion erreur
        ecran=SDL_SetVideoMode(largeur,hauteur,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
        if(ecran==NULL)
        {
            fprintf(stderr,"Erreur de chargement",SDL_GetError());
            exit(EXIT_FAILURE);
        }
        //AFFICHAGE ET LIBERATION MEMOIRE
     
        decor(ecran);
        SDL_FreeSurface(ecran);
        SDL_Quit();
        return 0;
    }
    void pause()
    {
        //Variable
        int continuer=1;
        SDL_Event event;
        while(continuer)
        {
            //attente evenement
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                //evenement clavier
                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer=0;
                        break;
                    }
                break;
            }
        }
    }
    void decor(SDL_Surface *screen)
    {
            //Declaration des variables
            int i,j;
            //surface coordonnées
            SDL_Rect posi;
            SDL_Rect posimario;
            SDL_Surface *o=NULL,*m[4]={NULL},*c=NULL, *mu=NULL,*c_ok=NULL,*mA=NULL, *sol=NULL;
            FILE *fichier=NULL;
            //Tableau de passage et de creation de la carte
            char tab[T_blocX*T_blocy+1]={0};
            int carte[T_blocX][T_blocy]={{0}};
            //Initialisation de la position
            posi.x;
            posi.y;
     
            posimario.x;
            posimario.y;
            //Variable évenenment
            SDL_Event geste;
            //Variable boucle
                  int continuer=1;
     
            //Ouverture fichier et gestion erreur
            fichier=fopen("decor.txt","r");
            if(fichier==NULL)
            {
                fprintf(stderr,"Erreur à l ouverture");
            }
     
                //Recuperation des données dans le fichier
                fgets(tab,T_blocX*T_blocy+1,fichier);
                //Transformation des char en entier
                for(i=0;i<T_blocX;i++)
                {
                    for(j=0;j<T_blocy;j++)
                    {
                        //T_blocy*i+j méthode de calcule pour faire évoluer tab à partir de i et j
                        switch(tab[(T_blocy*i)+j])
                        {
                            case '0':
                                carte[j][i]=0;
                            case '1':
                                carte[j][i]=1;
                            break;
                            case '2':
                                carte[j][i]=2;
                            break;
                            case '3':
                                carte[j][i]=3;
                            break;
                            case '4':
                                carte[j][i]=4;
                            break;
                            case '5':
                                carte[j][i]=5;
                            break;
                        }
                    }
                }
            fclose(fichier);
            //Chargement des images et test erreurs
            m[haut]=IMG_Load("mario_haut.gif");
            m[bas]=IMG_Load("mario_bas.gif");
            m[gauche]=IMG_Load("mario_gauche.gif");
            m[droite]=IMG_Load("mario_droite.gif");
            o=IMG_Load("objectif.png");
            c=IMG_Load("caisse.jpg");
            mu=IMG_Load("mur.jpg");
            c_ok=IMG_Load("caisse_ok.jpg");
            if(m[haut]==NULL||m[bas]==NULL||m[droite]==NULL||m[gauche]==NULL||o==NULL||c==NULL||mu==NULL||c_ok==NULL)
            {
                fprintf(stderr,"erreur au chargement",SDL_GetError());
                exit(EXIT_FAILURE);
            }
            //Initialisation de mario actuel
            mA=m[bas];
     
              // Position de mario
            positionmario(carte,&posimario,T_blocX);
            //Gestion du déplacement
        SDL_EnableKeyRepeat(100,100);
     
        while(continuer)//boucle deplacement
         {
                //Determine évenement produit
                SDL_WaitEvent(&geste);
                //Selon l'évenement
                switch(geste.type)
                {
                    case SDL_KEYDOWN:
                        switch(geste.key.keysym.sym)
                        {
                            case SDLK_UP:
                                mA=m[haut];
                            deplacermario(carte,haut,&posimario);
                            break;
                            case SDLK_DOWN:
                                mA=m[bas];
                            deplacermario(carte,bas,&posimario);
                            break;
                            case SDLK_RIGHT:
                                mA=m[droite];
                            deplacermario(carte,droite,&posimario);
                            break;
                            case SDLK_LEFT:
                                mA=m[gauche];
                            deplacermario(carte,gauche,&posimario);
                            break;
                            case SDLK_ESCAPE:
                             continuer=0;
                            break;
                        }
                    break;
                }
                //mise en place du decor
                 SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0));
                for(i=0;i<T_blocy;i++)
                {
                    for(j=0;j<T_blocX;j++)
                    {
                            posi.x=i*T_bloc;
                            posi.y=j*T_bloc;
     
                        switch(carte[i][j])
                        {
                           // collage surface decor
                            case point:
                            SDL_BlitSurface(o,NULL,screen,&posi);
                            break;
                            case caisse:
                            SDL_BlitSurface(c,NULL,screen,&posi);
                            break;
                            case mur:
                                SDL_BlitSurface(mu,NULL,screen,&posi);
                            break;
     
                        }
                    }
                }
                posi.x=posimario.x*T_bloc;
                posi.y=posimario.y*T_bloc;
                SDL_BlitSurface(mA,NULL,screen,&posi);
     
     
                SDL_Flip(screen);
        }
                //  Liberation des surfaces
        SDL_FreeSurface(o);
        SDL_FreeSurface(c);
        SDL_FreeSurface(mu);
        for(i=0;i<4;i++)
        {
            SDL_FreeSurface(m[i]);
        }
     
    }
        void deplacermario(int carte[][T_blocy],int direction,SDL_Rect *positionjoueur)
        {
            //variable de secours
            int i;
            //direction choisi
            switch(direction)
            {
                case haut:
                    //si il se  deplace vers le haut
                    if(positionjoueur->y-1<0)
                    break;
     
                    if(carte[positionjoueur->x][positionjoueur->y-1]==mur)
                    break;
                        positionjoueur->y--;
                    //if(ret[positionjoueur->x][positionjoueur->y]==mur)
                break;
                case gauche:
                if(positionjoueur->x-1<0)
                break;
                if(carte[positionjoueur->x-1][positionjoueur->y]==mur)
                break;
                    positionjoueur->x--;
                break;
                case droite:
                    if(positionjoueur->x+1>=T_blocX)
                   break;
                   //Matrice pixel x=nombre de colonnes y =nombre de lignes
                   if(carte[positionjoueur->x+1][positionjoueur->y]== mur)
                   break;
                    positionjoueur->x++;
     
                break;
                case bas :
                    if(positionjoueur->y+1>=T_blocy)
                    break;
                    if(carte[positionjoueur->x][positionjoueur->y+1]== mur)
                    break;
                    positionjoueur->y++;
     
                break;
     
     
            }
     
     
        }
    //Position de mario
    void positionmario(int (*carte)[T_blocy],SDL_Rect *cordjoueur,int taill)
    {
        //Declaration variable
        int i,k;
        //Determine position jouer
        for(i=0;i<taill;i++)
        {
            for(k=0;k<T_blocy;k++)
            {
                if(carte[i][k]== 1)
                {
                    cordjoueur->x=i;
                    cordjoueur->y=k;
                    carte[i][k]=vide;
                }
            }
        }
    }
    Bon principalement voici les codes que je ne comprend pas très bien.
    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
     
     //Recuperation des données dans le fichier
                fgets(tab,T_blocX*T_blocy+1,fichier);
                //Transformation des char en entier
                for(i=0;i<T_blocX;i++)
                {
                    for(j=0;j<T_blocy;j++)
                    {
                        //T_blocy*i+j méthode de calcule pour faire évoluer tab à partir de i et j
                        switch(tab[(T_blocy*i)+j])
                        {
                            case '0':
                                carte[j][i]=0;
                            case '1':
                                carte[j][i]=1;
                            break;
                            case '2':
                                carte[j][i]=2;
                            break;
                            case '3':
                                carte[j][i]=3;
                            break;
                            case '4':
                                carte[j][i]=4;
                            break;
                            case '5':
                                carte[j][i]=5;
                            break;
                        }
                    }
                }
            fclose(fichier);
    Le problème se situe au niveau du switch et de l'envoie dans la matrice.Je précise au début j 'avais mis i en ligne j en colonne carte[i][j] ,j'ai eu des problèmes au niveau de la procédure de déplacement.Alors j'ai effectué ce changement. carte[j][i]..
    De la manière dont je vois le code,la matrice carte est remplie par ligne.
    Ensuite dans le reste du code on utilise une lecture en i,j.Puisque la matrice est remplie en colonne les emplacements que j'ai attribué selon le tilemaping change ou reste les mêmes?

    Deuxième problème
    le positionnement de mario
    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
     
    //Position de mario
    void positionmario(int (*carte)[T_blocy],SDL_Rect *cordjoueur,int taill)
    {
        //Declaration variable
        int i,k;
        //Determine position jouer
        for(i=0;i<taill;i++)
        {
            for(k=0;k<T_blocy;k++)
            {
                if(carte[i][k]== 1)
                {
                    cordjoueur->x=i;
                    cordjoueur->y=k;
                    carte[i][k]=vide;
                }
            }
        }
    }
    Dans mon fichier decor.txt j'ai défini la position de mario à 0.0 mais dès que je fais intervenir cette procédure ,je le retrouve à une position que je n'ai pas notifié.

    Bon je chercherais en attendant la solution ,mais un coup de main n'est pas de refus.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 35
    Points : 45
    Points
    45
    Billets dans le blog
    1
    Par défaut
    Bien en cherchant un peu ,j ai résolu mes problèmes

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

Discussions similaires

  1. [win32][D5] - position curseur dans paintbox
    Par bregolhen dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/11/2005, 23h45
  2. Réponses: 4
    Dernier message: 28/10/2005, 13h32
  3. aller à une position précise dans un fichier texte
    Par bassidi meryeme dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2005, 14h57
  4. [Opera 7 & 8] Position absolue dans conteneur relatif
    Par Sub0 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 16
    Dernier message: 16/08/2005, 23h16
  5. [AS2] Position clip dans attachMovie
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 07/07/2005, 11h10

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