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

Développement 2D, 3D et Jeux Discussion :

Aide SDL collision


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 47
    Points : 3
    Points
    3
    Par défaut Aide SDL collision
    Bonjour, je suis entrain de coder un jeux mario en 2D de style labyrinthe.

    Du coup j'ai placer des murs saufs que je veux que quand le personnage détecte le mur, le personnage ne peut pas le traverser


    Sur ce code c'est comment j'ai afficher mes murs
    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
    void affichageFond(SDL_Renderer *sdlRenderer)
    {
     
        for (int i=0 ; i<NBC ; i++ )
        {
            for (int j=0 ; j<NBL ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureFond, NULL, &rect);
            }
     
     
     
            //Drapeau placer en [0;34]
            for (int i=0 ; i<NBC ; i++) // NBL = 20
            {
                SDL_Rect rect = rectGrille[34][0] ;
                SDL_RenderCopy(sdlRenderer, pTexturedrapeau, NULL, &rect);
            }
        }
     
         for (int i=4 ; i<5 ; i++ )
        {
            for (int j=0 ; j<4 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
         for (int i=0 ; i<5 ; i++ )
        {
            for (int j=7 ; j<8 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
         for (int i=4 ; i<5 ; i++ )
        {
            for (int j=5 ; j<7 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
         for (int i=4 ; i<10 ; i++ )
        {
            for (int j=5 ; j<6 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
         for (int i=9 ; i<10 ; i++ )
        {
            for (int j=2 ; j<5 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
        for (int i=9 ; i<16 ; i++ )
        {
            for (int j=7 ; j<8 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
         for (int i=13 ; i<14 ; i++ )
        {
            for (int j=0 ; j<16 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
          for (int i=13 ; i<14 ; i++ )
        {
            for (int j=18 ; j<20 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
          for (int i=20 ; i<21 ; i++ )
        {
            for (int j=7 ; j<20 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
           for (int i=19 ; i<20 ; i++ )
        {
            for (int j=7 ; j<8 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
     
           for (int i=29 ; i<30 ; i++ )
        {
            for (int j=0 ; j<17 ; j++)
            {
                SDL_Rect rect = rectGrille[i][j] ;
                SDL_RenderCopy(sdlRenderer, pTextureMur, NULL, &rect);
            }
     
        }
    }

    Ici c'est comment je l'utilise
    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
     
     
    // Fonction d'initialisation du jeu
    void init(SDL_Renderer *sdlRenderer)
    {
     
        // Init random
        srand(time(NULL));
     
        // Textures pour afficher éléments du jeu
        initTextures(sdlRenderer) ;
     
        // Grille pour affichage décors. Attention Table colonne/ligne pour respecter le sens x=colonne et y=ligne
        initRectGrille() ;
     
        // Affichage de la grille et des murs
        affichageFond(sdlRenderer) ;
     
        // Mise à jour de l'affichage
        IUTSDL_RefreshScreen(sdlRenderer);
    }
    Et j'ai ceci dans mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Initialisations
        init(sdlRenderer) ;
    Avez vous des solutions pour que mon problème soit résolus
    merci

  2. #2
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 47
    Points : 3
    Points
    3
    Par défaut
    Quand je lance mon projet j'obtiens ceci

    Nom : 1.PNG
Affichages : 226
Taille : 80,9 Ko

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    Pour les collisions je ne vois pas le rapport avec la SDL (vu que c'est totalement indépendant de la SDL et l'algo est toujours le mème peu importe la lib utilisé).

    Sinon l'algo est assez simple (mais il faut bien séparer son code).
    Ben un perso à une vitesse , ensuite tu fais position.x+vitesse.x et tu test si il est dans un mur alors vitesse.x = 0 , et on fait pareille pour y.
    Et après les tests de collision, on fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    position.x += vitesse.x;
    position.y += vitesse.y;

  4. #4
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 47
    Points : 3
    Points
    3
    Par défaut
    Ok, non mais c'est que je fais le code en SDL c'est comment j'ai placer mes murs et je pensais que je devait juste faire une commande de détection on créer une fonction qui détecte chaque mur

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Déjà, ta création et affichage de map sont franchement moyens.
    Il serait infiniment mieux pour l'ensemble que tu aies un tableau pour tes cases et l'id de chaque case dépend de ce qui s'y trouve. En fait c'est comme ça que j'ai toujours vu les tutos faire donc je me demande comment tu as pu imaginer ce code-là.
    Avoir un tableau de coordonnées est par contre strictement inutile : le tableau est ordonné et chaque case correspond à une coordonnées. Il est trivial de passer de l'index du tableau à ces coordonnées et inversement.
    Tu peux voir ici pour des explications détaillées et de nombreux tutos existent sur ce site-même.

    Ne serait-ce que parce que, dans ton cas, comment tu sais si la case de destination est un mur ou non ? Tu dois vérifier des coordonnées spécifiques.
    Et demain tu modifies un mur, tu dois courir à tous les endroits du code qui en parlent pour les modifier...

    Ensuite, pourquoi tu affiches NBC fois le drapeau à une même coordonnée ?

    Enfin avec ce fameux tableau de cases correctement initialisé, détecter un mur c'est un simple if de la case de ton choix pour vérifier son type.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut Conseils pour débuter
    Des murs ? Il n'y a aucune structure définissant le niveau. Ton problème ? Il y a même pas une ligne pour tester une quelconque collision.

    Kannagi te rend pas service car pour progresser faut s'investir un minimum. Je te conseille plutôt d'apprendre les bases de la programmation, car ta fonction d'affichage est très mauvaise, et de voir comment ça peut t'aider pour ton projet. Si tu bloques alors il existe de nombreuses ressources sur le sujet puis le forum évidemment. Sur ce dernier je te conseille aussi les discussions importantes car elles donnent plein de pistes pour démarrer et en plus il existe déjà des discussions en rapport avec le sujet.

    Mais c'est déjà bien d'être parvenu à afficher le niveau et en revenant plus tard sur ton code tu verras plein d'améliorations.

  7. #7
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    Citation Envoyé par ohnomorejmmings Voir le message
    Kannagi te rend pas service car pour progresser faut s'investir un minimum.
    C'est sympa ça
    Moi j'ai lu le topic comme "j'ai aucune idée de comment gérer les collisions 2D" et donc j'ai donner l'algo au moins il aura pas à réinventer la roue carré niveau algo (à voir ce qu'il va pendre ensuite).
    Effectivement son code est mal foutu , mais j'avais pas scroll son code

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    C'est sympa ça
    Désolé j'ai formulé comme un Luigi chassé par un fantôme ! Merci pour tes contributions 5 étoiles et au-delà héhé !!
    Citation Envoyé par Kannagi Voir le message
    Moi j'ai lu le topic comme "j'ai aucune idée de comment gérer les collisions 2D" et donc j'ai donner l'algo au moins il aura pas à réinventer la roue carré niveau algo
    Certes mais faut réfléchir un minimum sinon on bute sur le moindre obstacle. Sinon j'ai lu pareil sauf que comme répondu rien que le site propose déjà plein d'idées. Rien qu'une base en programmation, comme la connaissance des conditions et tableaux, permet d'avoir une piste.

    Courage Super Floflo te laisse pas décourager par un vilain rongeur !!

  9. #9
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 47
    Points : 3
    Points
    3
    Par défaut
    J'ai une question pour la fin de mon jeu
    voilà mon algo

    si xluigi =34 et yluigi =0
    alors je veux afficher une image où il y a écrit gagner (j'ai déja une image qu'il faut que j'inscruste dans le SDL)

    est ce que ça va


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void gagner (SDL_Renderer *sdlRenderer)
    {
      int xluigi,yluigi;
     
      if (xluigi==34)&(yluigi==0)
      { 
         et ici je ne sais pas comment afficher mon image car a chaque fois mon image se met sur un pixel
         et xluigi et yluigi il ne les prends pas en compte
      }
    }
    Citation Envoyé par ohnomorejmmings Voir le message
    Courage Super Floflo te laisse pas décourager par un vilain rongeur !!

  10. #10
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    a chaque fois mon image se met sur un pixel et xluigi et yluigi il ne les prends pas en compte
    Normal vu que tu défini une position qui est en pixel , tu n'as qu'a utilisé les opérateur '>=' et '<=' pour avoir une marge plus grand
    Mais c'est vraiment abusé comme question , je vois mal comment tu compte faire un jeu si tu n'arrive pas à résoudre un souci aussi simple...

  11. #11
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Salut tout le monde,

    Citation Envoyé par Bousk Voir le message
    En fait c'est comme ça que j'ai toujours vu les tutos faire donc je me demande comment tu as pu imaginer ce code-là.
    Pour être soft et concis: comme souvent sur ce forum pour faire une réponse plein d'humeur et tenter te remettre dans le droit chemin je te conseil : http://conquerirlemonde.com/blog/

    A bon entendeur.

    @Florian: Félicitation pour ton code que tu as fais dans ton coin tout seul, tu as un résultat ce qui est déjà cool mais comme les autres en ont fait la remarque et aussi tu l'as vu par toi même, ton algo/architecture amène rapidement des soucis qui ne feront qu'empirer apparemment.
    Il vaut mieux repartir sur une base saine avec les exemples/idées que l'on t'a fournie ici ou directement sur le net

    En tout cas vas y continues comme ça et ajoute nous plein de petite fonction et mécanisme à ton jeu

    TontonNico

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut Luigi vs. Mario
    Citation Envoyé par Kannagi Voir le message
    Mais c'est vraiment abusé comme question , je vois mal comment tu compte faire un jeu si tu n'arrive pas à résoudre un souci aussi simple...
    En effet et Florian ne le prend pas mal mais ça révèle que tu ne sais pas ce que tu fais. Tu compares des variables locales qui n'ont même pas été initialisées. C'est la base ! Ça confirme ce que je soupçonnais pour ta fonction d'affichage à savoir que t'as sans doute pris un code quelque part et fais des copiés-collés un peu bêtement.

    Avant de parler une langue étrangère il te faut l'apprendre. Coder c'est la même chose ! En plus quand ça sert un projet sympa c'est enthousiasmant. En suivant un cours généraliste tu verras rapidement des applications possibles et sinon il y a toujours les didacticiels spécialisés même si dans ton cas c'est à double-tranchant car encore et toujours… Les bases ! Understand ? Entiendes ?!

    À toi de choisir si tu veux être un Luigi ou Mario du code. La vie de Princesse Peach en dépend !!

  13. #13
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 47
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ohnomorejmmings Voir le message
    En effet et Florian ne le prend pas mal mais ça révèle que tu ne sais pas ce que tu fais. Tu compares des variables locales qui n'ont même pas été initialisées. C'est la base ! Ça confirme ce que je soupçonnais pour ta fonction d'affichage à savoir que t'as sans doute pris un code quelque part et fais des copiés-collés un peu bêtement.
    c'est totalement MON code aucun copier coller n'a était fait !

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

Discussions similaires

  1. [Python 2.X] Aide URGENT! collisions balles
    Par FRAZZER dans le forum Général Python
    Réponses: 0
    Dernier message: 22/05/2017, 16h52
  2. SDL - Collisions
    Par Sawyer4 dans le forum SDL
    Réponses: 7
    Dernier message: 08/04/2008, 09h54
  3. Demande d'aide pour une formation SDL/OpenGL.
    Par Squalthor dans le forum API graphiques
    Réponses: 14
    Dernier message: 13/07/2006, 20h24
  4. directx collision... aide sivouplé
    Par hakuryu dans le forum Langage
    Réponses: 5
    Dernier message: 12/01/2006, 15h09

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