使用SDL-C库,简单游戏中的鼠标移动错误

时间:2018-08-26 00:18:30

标签: c events event-handling sdl

我正在尝试制作一个简单的游戏。我使用以下代码将一些图像放置在屏幕上。我要这样做,以便在按下左键并移动鼠标时,这些图像会连续显示在屏幕上(这样播放器就不必多次单击。)我有以下内容:

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 :(得分:2)

您不是在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的{​​{1}}的处理程序,而不是将其值与常量event.button.button进行比较。

注意:由于这个原因,许多开发人员开始将常量放在比较的左侧,这样,如果您键入错误的运算符,编译器 就会给您一个错误。例如,

SDL_BUTTON_RIGHT