Использование библиотеки SDL-C, ошибка движения мыши в простой игре - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь сделать простую игру.У меня есть следующий код, с помощью которого я размещаю некоторые изображения на экране.Я хочу сделать так, чтобы при нажатии левой кнопки мыши и перемещении мыши эти изображения непрерывно выводились на экран (чтобы игроку не приходилось многократно щелкать мышью). У меня есть следующее:

SDL_Surface *mur = NULL, *caisse = NULL, *objectif = NULL, *mario = NULL;
     SDL_Rect position;
     SDL_Event event;

     int continuer = 1, clic_gauche = 0, clic_droit = 0;
     int objet_actuel = MUR, i = 0, j = 0;
     int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

     //Chargement des objets et du niveau.
     mur = IMG_Load("mur.jpg");
     caisse = IMG_Load("caisse.jpg");
     objectif = IMG_Load("objectif.png");
     mario = IMG_Load("mario_bas.gif");

     if(!Charger_Niveau(carte)) //Erreur de chargement du niveau.
     exit(EXIT_FAILURE);

     while(continuer)
     {
         SDL_WaitEvent(&event);
         switch(event.type)
         {

             case SDL_MOUSEBUTTONDOWN:
                  if (event.button.button == SDL_BUTTON_LEFT)
                  {
                      carte[event.button.x/TAILLE_BLOC][event.button.y/TAILLE_BLOC] = objet_actuel; //On met l'objet actuellement choisi a l'endroit du clic.
                      clic_gauche = 1; //On retient le fait que le dernier clic etait un clic gauche.
                  }
                  else if (event.button.button = SDL_BUTTON_RIGHT)
                  {
                      carte[event.button.x/TAILLE_BLOC][event.button.y/TAILLE_BLOC] = VIDE; //On vide le bloc ou s'est produit le clic droit.
                      clic_droit = 1; //On retient le fait que le dernier clic etait un clic droit.
                  }
                  break;

             case SDL_MOUSEBUTTONUP: //On desactive le booleen qui disait qu'un bouton etait enfonce.
                  if(event.button.button == SDL_BUTTON_LEFT)
                      clic_gauche = 0;
                  else if(event.button.button == SDL_BUTTON_RIGHT)
                      clic_droit = 0;
                  break;

              case SDL_MOUSEMOTION:
                   if(clic_gauche == 1)
                   {
                       carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] == objet_actuel;
                   }
                   else if(clic_droit == 1)
                   {
                       carte[event.motion.x/TAILLE_BLOC][event.motion.y/TAILLE_BLOC] == VIDE;
                   }
                   break;

Затем цикл продолжает проверять, были ли нажаты некоторые клавиши, затем я стираю все изображения, которые были загружены с использованием двойной матричной карты, и обновляю экран.Проблема в том, что движение мыши не работает.Отладка событий довольно сложна ... кто-нибудь видит явную проблему с кодом?

1 Ответ

0 голосов
/ 26 августа 2018

Вы не присваиваете в carte в обработчике SDL_MOUSEMOTION, вы сравниваете .

(К сожалению, любое выражение может быть выражением в C, даже если оно не имеет последствий / побочных эффектов для программы, поэтому компилятор не обязательно поможет вам найти эти проблемы.)

Ваш обработчик должен быть:

  case SDL_MOUSEMOTION:
       if(clic_gauche == 1)
       {
           carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = objet_actuel;
       }
       else if(clic_droit == 1)
       {
           carte[event.motion.x/TAILLE_BLOC][event.motion.y/TAILLE_BLOC] = VIDE;
       }
       break;

(обратите внимание на один = в каждом случае if / else)

Кроме того, обратная проблема влияет на обработчик для SDL_MOUSEBUTTONDOWN, где вы присваиваете event.button.button, а не сравнивает его значение с константой SDL_BUTTON_RIGHT.

Примечание: по этой причине многие разработчики занялись размещением константы в левой части сравнения, так что компилятор будет выдавать ошибку, если вы неправильно введете оператор. Например,

else if (SDL_BUTTON_RIGHT == event.button.button)
...