2017-08-04 110 views
0

我正在開發一個使用C++利用SDL2可移植性的Tetris,事情是當我從觸摸界面獲取事件時,我有很多延遲,就像功能SDL_PollEvent() doesn' t在PC上工作,我已經寫了我的獲得事件方法。Android上的觸摸事件SDL2

float x = 0, y = 0; 

while (SDL_PollEvent(&event)){ 

    switch (event.type) { 

     case SDL_QUIT: { gameState = false; break;} 

     case SDL_FINGERDOWN: { 

      x = event.tfinger.x; 
      y = event.tfinger.y; 

      SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y); 

      window.get_AbsPixels(&x, &y); 

      if (x >= keys->U.getX() && x <= (keys->U.getX() + keys->U.getW()) && 
       y >= keys->U.getY() && x <= keys->U.getY() + keys->U.getH()) 
       return Up; 

      if (x >= keys->D.getX() && x <= (keys->D.getX() + keys->D.getW()) && 
       y >= keys->D.getY() && x <= keys->D.getY() + keys->D.getH()) 
       return Down; 

      if (x >= keys->L.getX() && x <= (keys->L.getX() + keys->L.getW()) && 
       y >= keys->L.getY() && x <= keys->L.getY() + keys->L.getH()) 
       return Left; 

      if (x >= keys->R.getX() && x <= (keys->R.getX() + keys->R.getW()) && 
       y >= keys->R.getY() && x <= keys->R.getY() + keys->R.getH()) 
       return Right; 

      break; 
     } 

     default: break; 
    } 

    return None; 
} 

但是當我調試Android上的事件採取行動推遲,儘管他們應該已經回來了,應該動畫之前收到我的應用程序,所以我想,如果他們在另一個線程處理在Android或東西,因爲他們的行爲像獨立於動畫。

與在此之前嘗試:

float x = 0, y = 0, tmpx = 0, tmpy = 0; 

while (SDL_PollEvent(&event)){ 

    if (event.type == SDL_QUIT){ gameState = false; } 

    switch (event.type) { 

     case SDL_FINGERMOTION: { 

      tmpx = event.tfinger.dx; 
      tmpy = event.tfinger.dy; 

      window.get_AbsPixels(&tmpx, &tmpy); 

      x += tmpx; y += tmpy; 
      tmpx = tmpy = 0; 

      SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y); 

      break; 
     } 

     default: break; 
    } 

    if ((x > 70 || x < -70) || (y > 70 || y < -70)) 
     return window.process_Dplcmnt(x, y); 
} 

return None; 

..但它給了我也有很多的延遲比新的。

因此,要清楚,並可以採取行動,有人可以解釋我應該如何使用Android上的SDL處理觸摸事件?提前致謝。

+0

從代碼中不清楚您的事件循環是否在另一個'while(1)'內部。它應該是。此外,您可以嘗試處理鼠標事件,因爲touch也會生成它們(如果「SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH」已禁用,並且默認情況下是這樣)。 – HolyBlackCat

+0

我不明白,SDL建議以這種方式處理事件..你究竟是什麼意思? –

+0

它應該是'while(1){while(SDL_PollEvents()){/ * event handling,without break out the loop * /}/* game code * /}'。 – HolyBlackCat

回答

0

我已經解決了,在每個case:之後,即使沒有人適合條件,總會有一個返回,所以未匹配的事件不會保持在那裏不會正確刷新,只是將狀態return None;移到了外面。現在它在PC上工作。

float x = 0, y = 0; 

while (SDL_PollEvent(&event)){ 

    switch (event.type) { 

     case SDL_QUIT: { board->setGameState(false); break;} 

     case SDL_FINGERDOWN: { 

      x = event.tfinger.x; 
      y = event.tfinger.y; 

      SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y); 

      window.get_AbsPixels(&x, &y); 

      if (x > keys->U.getX() && x < (keys->U.getX() + keys->U.getW()) && 
       y > keys->U.getY() && y < keys->U.getY() + keys->U.getH()) { 
       SDL_Log("\nRetornado Up\n"); 
       return Up; 
      } 

      if (x > keys->D.getX() && x < (keys->D.getX() + keys->D.getW()) && 
       y > keys->D.getY() && y < keys->D.getY() + keys->D.getH()) { 
       SDL_Log("\nRetornado Down\n"); 
       return Down; 
      } 

      if (x > keys->L.getX() && x < (keys->L.getX() + keys->L.getW()) && 
       y > keys->L.getY() && y < keys->L.getY() + keys->L.getH()) { 
       SDL_Log("\nRetornado Left\n"); 
       return Left; 
      } 

      if (x > keys->R.getX() && x < (keys->R.getX() + keys->R.getW()) && 
       y > keys->R.getY() && y < keys->R.getY() + keys->R.getH()) { 
       SDL_Log("\nRetornado Right\n"); 
       return Right; 
      } 

      break; 
     } 

     default: 
      //SDL_PumpEvents(); 
      //SDL_FlushEvent(SDL_FINGERDOWN); 
      break; 
    } 
} 

return None;