터치 지원 추가

터치 입력 이벤트를 처리하려면 게임 루프의 motionEvents 배열을 읽습니다. 여기에는 마지막으로 이러한 배열이 정리된 이후 발생한 이벤트가 포함됩니다. 포함된 이벤트 수는 motionEventsCount에 저장됩니다.

  1. 게임 루프의 각 이벤트를 반복하고 처리합니다. 이 예에서 다음 코드는 motionEvents를 반복하고 handle_event를 통해 처리합니다.

    for(size_t i = 0; i < mApp->motionEventsCount; ++i) {
      GameActivityMotionEvent* motionEvent = mApp->motionEvents[i];
    
      int action = motionEvent->action;
      int actionMasked = action & AMOTION_EVENT_ACTION_MASK;
      int ptrIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
        AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
    
      struct CookedEvent ev;
      memset(&ev, 0, sizeof(ev));
    
      if (actionMasked == AMOTION_EVENT_ACTION_DOWN ||
        actionMasked == AMOTION_EVENT_ACTION_POINTER_DOWN) {
          ev.type = COOKED_EVENT_TYPE_POINTER_DOWN;
      } else if (actionMasked == AMOTION_EVENT_ACTION_UP ||
        actionMasked == AMOTION_EVENT_ACTION_POINTER_UP) {
          ev.type = COOKED_EVENT_TYPE_POINTER_UP;
      } else {
          ev.type = COOKED_EVENT_TYPE_POINTER_MOVE;
      }
    
      ev.motionPointerId = motionEvent->pointers[ptrIndex].id;
      ev.motionIsOnScreen = motionEvent->source == AINPUT_SOURCE_TOUCHSCREEN;
      ev.motionX = GameActivityPointerInfo_getX(
        &motionEvent->pointers[ptrIndex]);
      ev.motionY = GameActivityPointerInfo_getY(
        &motionEvent->pointers[ptrIndex]);
    
      if (ev.motionIsOnScreen) {
        // Use screen size as the motion range.
        ev.motionMinX = 0.0f;
        ev.motionMaxX = SceneManager::GetInstance()->GetScreenWidth();
        ev.motionMinY = 0.0f;
        ev.motionMaxY = SceneManager::GetInstance()->GetScreenHeight();
      }
    
      handle_event(&ev);
    }
    
  2. 완료되면 방금 처리한 이벤트의 큐를 삭제해야 합니다.

    android_app_clear_motion_events(mApp);