Partage
  • Partager sur Facebook
  • Partager sur Twitter

sokoban Collision

comment ce passe une collision en sdl1 ?

    9 octobre 2021 à 11:44:04

    Bonjour à tous !

    Je suis en d'apprendre le langage C je suis arrivé au chapitre du sokoban j'arrive à faire une carte avec des murs, déplacer mon personnage mais je n'arrive absolument pas à gérer les collision c'est quelque chose que je ne comprend pas dsl pouvez vous m'expliquer comment m'y prendre car pour le moment je galère voilà mon code désolé d'avance pour le bazar voilà ci-dessous :

    header :

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    typedef struct AABB aabb;
    struct AABB
    {
        int x; // Abscisses
        int y; // Ordonnées
    };
    void jeu(int continuer,SDL_Event event,SDL_Surface * mario,SDL_Rect positionMario,SDL_Surface *ecran, SDL_Surface * wall);
    void maps(SDL_Surface * wall,int nombre_blocs_largeur,int nombre_blocs_hauteur,SDL_Surface *ecran, char**table
              ,SDL_Rect Rect_dest,SDL_Rect Rect_source,int i, int j);
    #endif // HEADER_H_INCLUDED
    

    voilà le header ne vous souciez pas de la structure car elle n'est pas utiliser parce soit je ne sais pas comment m'en servir et aussi que j'aurai du le faire depuis le debut mais j'avais déjà pris le code de déplacement pour zozor si vous connaissez que j'ai modifier pour mettre à la place Mario

    La map :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "header.h"
    
    void maps(SDL_Surface * wall,int nombre_blocs_largeur,int nombre_blocs_hauteur,SDL_Surface *ecran
              ,char**table,SDL_Rect Rect_dest,SDL_Rect Rect_source,int i, int j)
    {
        for(i = 0 ; i < nombre_blocs_largeur ; i++)
        {
            for(j = 0 ; j < nombre_blocs_hauteur ; j++)
            {
                Rect_dest.x = i*nombre_blocs_largeur;
                Rect_dest.y = j*nombre_blocs_hauteur;
                Rect_source.x = (table[j][i]-'0')*nombre_blocs_largeur;
                Rect_source.y = (table[j][i]-'0')*nombre_blocs_hauteur;
    
                SDL_BlitSurface(wall, &Rect_source, ecran, &Rect_dest);
            }
        }
    }
    

     Ci-dessus la map elle blit seulement les position de bloc que je mets dans une constante table qui lui est dans jeu montrer ci-dessous :

    jeu :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "header.h"
    #define LARGEUR_TILE 34  // hauteur et largeur des tiles.
    #define HAUTEUR_TILE 34
    #define NOMBRE_BLOCS_LARGEUR 32  // nombre a afficher en x et y
    #define NOMBRE_BLOCS_HAUTEUR 26
    
    void jeu(int continuer,SDL_Event event,SDL_Surface * mario,SDL_Rect positionMario
             ,SDL_Surface *ecran,SDL_Surface * wall)
    {
    char* table[] = {
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000007770000000000000000",
    "000000077777777770000000000000",
    "000000077777777770000000000000",
    "000007777777777777700000000000",
    "000007777777777777700000000000",
    "000000077 77777 70000000000000",
    "000000077777777770000000000000",
    "000000077777777777700000000000",
    "000000077777777777700000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000",
    "000000000000000000000000000000"};
    
    int nombre_blocs_largeur = NOMBRE_BLOCS_LARGEUR;
    int nombre_blocs_hauteur = NOMBRE_BLOCS_HAUTEUR;
    int i,j;
    SDL_Rect Rect_dest;
    SDL_Rect Rect_source;
    Rect_source.w = nombre_blocs_largeur;
    Rect_source.h = nombre_blocs_hauteur;
    wall = IMG_Load("mur.jpg");
    
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                case SDLK_UP: // Flèche haut
                    mario = IMG_Load("mario_haut.gif");
                    positionMario.y--;
                    if(positionMario.y > nombre_blocs_hauteur){
                        positionMario.y = event.resize.h / 2 - mario->h / 2;
                    }
                    break;
                case SDLK_DOWN: // Flèche bas
                    mario = IMG_Load("mario_bas.gif");
                    positionMario.y++;
                    break;
                case SDLK_RIGHT: // Flèche droite
                    mario = IMG_Load("mario_droite.gif");
                    positionMario.x++;
                    break;
                case SDLK_LEFT: // Flèche gauche
                    mario = IMG_Load("mario_gauche.gif");
                    positionMario.x--;
                    break;
                }
                break;
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            maps(wall,nombre_blocs_largeur,nombre_blocs_hauteur,ecran,table,Rect_dest,Rect_source,i,j);
            SDL_BlitSurface(mario, NULL, ecran, &positionMario);
            SDL_Flip(ecran);
    
        }
    
        SDL_FreeSurface(wall);
        SDL_FreeSurface(mario);
        SDL_Quit();
    }
    

    Le fichier jeu lui fais le fonctionnement du jeu il déplace pour le moment c'est la que j'avais commencé à faire les tests pour la collision, mais je me demande si c'est la bonne solution ?

    Le main ci-dessous :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "header.h"
    
    int main (int argc, char** argv)
    {
        SDL_Surface *ecran = NULL, *mario = NULL, *wall = NULL;
        SDL_Rect positionMario;
        SDL_Event event;
        int continuer = 1;
    
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Sokoban", NULL);
        mario = IMG_Load("mario_bas.gif");
        SDL_SetColorKey(mario, SDL_SRCCOLORKEY, SDL_MapRGB(mario->format, 0, 0, 255));
        positionMario.x = ecran->w / 2 - mario->w / 2;
        positionMario.y = ecran->h / 2 - mario->h / 2;
    
    
    
        SDL_EnableKeyRepeat(10, 10);
        jeu(continuer,event,mario,positionMario,ecran, wall);
    
    
        return EXIT_SUCCESS;
    
    }
    


    Il fait le démarrage du jeu c'est tout, voilà donc pour la collision comment je dois m'y prendre car malheureusement j'ai vu des cours preuve en est map viens de là justement donc j'ai beaucoup rechercher comme essayer de mon coté mais comme vous le voyez sans réelle succès bref tout conseil est bon à prendre merci de votre sollicitude !

    • Partager sur Facebook
    • Partager sur Twitter

    sokoban Collision

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown