Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec le sokoban

Ma fonction déplacerJoueur foire

    23 avril 2006 à 18:05:57

    Bonjour à tous!
    J'ai éssayer de refaire le sokoban à ma façon, en lisant un minimum le cours. Tout allait bien jusqu'à la fonction qui déplace le joueur et gère les collisions :( . La fonction est censé modifier le tableau carte (indentique à celui du cours) pour déplacer mon personnage d'une case à l'autre. Malheureusement, rien ne se passe.
    Voici la fonction:
    void deplacerJoueur(int *carte[][NOMBRE_COLONNES], int direction,
        SDL_Rect *positionJoueur)
    {

        switch (direction)
        {
            case HAUT:
                //Un mur
                if (carte[positionJoueur->y - 1][positionJoueur->x] == MUR)
                {
                    break;
                }
                //Une caisse
                else if (carte[positionJoueur->y - 1][positionJoueur->x] == CAISSE)
                {
                    //Deux caisses de suite
                    if (carte[positionJoueur->y - 2][positionJoueur->x] == CAISSE)
                    {
                        break;
                    }
                    //Une caisse et un mur
                    else if (carte[positionJoueur->y - 2][positionJoueur->x] == MUR)
                    {
                        break;
                    }
                    //Une caisse et objectif ou rien
                    else
                    {
                        carte[positionJoueur->y - 2][positionJoueur->x] = CAISSE;
                        carte[positionJoueur->y - 1][positionJoueur->x] = JOUEUR;
                        break;
                    }
                }
                //Rien ou objectif
                else
                {
                    carte[positionJoueur->y - 1][positionJoueur->x] = JOUEUR;
                    break;
                }

            case GAUCHE:
                //Un mur
                if (carte[positionJoueur->y][positionJoueur->x - 1] == MUR)
                {
                    break;
                }
                //Une caisse
                else if (carte[positionJoueur->y][positionJoueur->x - 1] == CAISSE)
                {
                    //Deux caisses de suite
                    if (carte[positionJoueur->y][positionJoueur->x - 2] == CAISSE)
                    {
                        break;
                    }
                    //Une caisse et un mur
                    else if (carte[positionJoueur->y][positionJoueur->x - 2] == MUR)
                    {
                        break;
                    }
                    //Une caisse et objectif ou rien
                    else
                    {
                        carte[positionJoueur->y][positionJoueur->x - 2] = CAISSE;
                        carte[positionJoueur->y][positionJoueur->x - 1] = JOUEUR;
                        break;
                    }
                }
                //Rien ou objectif
                else
                {
                    carte[positionJoueur->y][positionJoueur->x - 1] = JOUEUR;
                    break;
                }

            case BAS:
                //Un mur
                if (carte[positionJoueur->y + 1][positionJoueur->x] == MUR)
                {
                    break;
                }
                //Une caisse
                else if (carte[positionJoueur->y + 1][positionJoueur->x] == CAISSE)
                {
                    //Deux caisses de suite
                    if (carte[positionJoueur->y + 2][positionJoueur->x] == CAISSE)
                    {
                        break;
                    }
                    //Une caisse et un mur
                    else if (carte[positionJoueur->y + 2][positionJoueur->x] == MUR)
                    {
                        break;
                    }
                    //Une caisse et objectif ou rien
                    else
                    {
                        carte[positionJoueur->y + 2][positionJoueur->x] = CAISSE;
                        carte[positionJoueur->y + 1][positionJoueur->x] = JOUEUR;
                        break;
                    }
                }
                //Rien ou objectif
                else
                {
                    carte[positionJoueur->y + 1][positionJoueur->x] = JOUEUR;
                    break;
                }

            case DROITE:
                //Un mur
                if (carte[positionJoueur->y][positionJoueur->x + 1] == MUR)
                {
                    break;
                }
                //Une caisse
                else if (carte[positionJoueur->y][positionJoueur->x + 1] == CAISSE)
                {
                    //Deux caisses de suite
                    if (carte[positionJoueur->y][positionJoueur->x + 2] == CAISSE)
                    {
                        break;
                    }
                    //Une caisse et un mur
                    else if (carte[positionJoueur->y][positionJoueur->x + 2] == MUR)
                    {
                        break;
                    }
                    //Une caisse et objectif ou rien
                    else
                    {
                        carte[positionJoueur->y][positionJoueur->x + 2] = CAISSE;
                        carte[positionJoueur->y][positionJoueur->x + 1] = JOUEUR;
                        break;
                    }
                }
                //Rien ou objectif
                else
                {
                    carte[positionJoueur->y][positionJoueur->x + 1] = JOUEUR;
                    break;
                }
        }
    }


    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2006 à 13:35:19

      Personne ne peut m'aider?
      • Partager sur Facebook
      • Partager sur Twitter
        26 avril 2006 à 13:57:35

        Pourquoi passes-tu un pointeur sur le tableau carte dans ta fonction ?
        Essaye de passer le tableau, et non un pointeur sur un tableau.
        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2006 à 19:02:31

          En fait, je veux modifier la valeur de carte. Il me semble donc que je dois avoir un pointeur (comme dans le fil rouge des pointeurs). De toute manière, j'ai éssayé sans et ca ne fonctionne pas.
          • Partager sur Facebook
          • Partager sur Twitter
            26 avril 2006 à 19:16:00

            Il te faut un poiteur sur carte, qui est un tableau, donc un pointeur. Tu l'utiliseras comme ceci :

            fonction(carte[][x]);

            fonction(long *carte[][x])
            {
            carte[0][0] = MARIO;
            }


            C'ets du vite fait pour t'aider, j'espère que c'est juste :p
            • Partager sur Facebook
            • Partager sur Twitter
              26 avril 2006 à 19:21:30

              Justement, puisque c'est un tableau, et donc un pointeur, il n'y a pas besoin de mettre l'étoile devant pour le passer à la fonction. C'est surement pour ça que ça ne marche pas, car tu envoies à la fonction un pointeur sur un pointeur
              • Partager sur Facebook
              • Partager sur Twitter
                26 avril 2006 à 19:53:55

                J'ai fait les changement que vous m'avez conseillez. J'ai édité le 1er message donc si vous pouviez vérifier que c'est bien ça. En tout cas, le problème n'est pas résolu, le perso ne se déplace toujours pas.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 avril 2006 à 20:45:51

                  Tout est OK il me semble pour cette fonction, mais elle ne modifie pas la position du joueur, donc j'imagine que tu as un système qui lis ensuite le tableau pour positionner le joueur sur la case contenant JOUEUR. Le problème doit se situer à cet endroit.
                  Sinon moi je te conseillerais de faire comme M@teo dans son TP, modifier directement la position du joueur dans la fonction, ça évite de faire à chaque appui d'une touche une boucle qui lis le tableau, alors qu'il ne change pas.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 avril 2006 à 21:20:38

                    Oui effectivement c'est peut-être mieux. Mais j'ai pas lu sa fonction a matheo alors je savais pas ce qu'il faisait. En même temps, maintenant que je suis partit ca me plairait de réussire de cette manière.
                    Voici le code qui affiche la carte:
                    for(ligne = 0; ligne < NOMBRE_LIGNES; ligne++)
                            {
                                for(colonne = 0; colonne < NOMBRE_COLONNES; colonne++)
                                {
                                    positionCase.x = colonne * TAILLE_BLOC;
                                    positionCase.y = ligne * TAILLE_BLOC;

                                    switch(carte[ligne][colonne])
                                    {
                                        case MUR:
                                            SDL_BlitSurface(mur, NULL, ecran, &positionCase);
                                            break;

                                        case CAISSE:
                                            SDL_BlitSurface(caisse, NULL, ecran, &positionCase);
                                            break;

                                        case CAISSE_OK:
                                            SDL_BlitSurface(caisseOk, NULL, ecran, &positionCase);
                                            break;

                                        case OBJECTIF:
                                            SDL_BlitSurface(objectif, NULL, ecran, &positionCase);
                                            break;

                                        case JOUEUR:
                                            SDL_BlitSurface(joueurActuel, NULL, ecran, &positionCase);
                                            break;

                                    }
                                }
                            }
                            SDL_Flip(ecran);
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 avril 2006 à 21:30:36

                      Alors là franchement je vois pas d'où vient le problème. Tu pourrais expliquer exactement ce qui se passe quand tu veux jouer ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 avril 2006 à 12:39:06

                        La carte s'affiche, le personnage aussi. Mais le personnage ne se déplace pas lorsque j'appuie sur un boutton, le personnage ne se déplace pas. Par contre il change de position.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 mai 2006 à 21:18:21

                          Bonsoir!
                          Je me permet de ressortir ce post car j'ai trouvé une erreure bizard dans le fichier stderr.txt et je me demande si ça a un rapport avec mon preoblème lors du dépacement du joueur. Voila ce qui est écrit dans stderr :

                          Citation : stderr.txt

                          Fatal signal: Segmentation Fault (SDL Parachute Deployed)


                          Est-ce que quelqu'un c'est ce que c'est? et si ça a un rapport avec mon problème, est-ce que quelqu'un pourrait me dire comment corriger cela?
                          Merci d'avance.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème avec le sokoban

                          × 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