SDL2 iOS мультитач вторым пальцем вниз не обнаружен - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над проектом SDL2, который я портировал на iOS. У меня проблемы с получением 2 касаний, чтобы зарегистрироваться, чтобы использовать в качестве управления игрой.

Элементы управления работают следующим образом:

iOS Device
+---------------+
|   F   |   |   |
|-------| L | R |
|   B   |   |   |
+---------------+

F - движение вперед

B - движение назад

L - Поверните налево

R - повернуть направо

Игрок должен иметь возможность двигаться вперед и поворачиваться одновременно - это означает, что я должен обрабатывать два отдельных касания одновременно, которые НЕ являются мультитач-жестом.

Вот пример кода, который делает это в моем проекте.

while (SDL_PollEvent(&event)) {
    printf("event %#010x\n", event.type);
    switch (event.type) {
        case SDL_FINGERDOWN:
        //case SDL_FINGERMOTION:
            if (event.tfinger.x < 0.5) { 
                lastMoveFinger = event.tfinger.fingerId;
                isMoving = true;
                if (event.tfinger.y < 0.5) { 
                    mvForward = true;
                } else { 
                    mvForward = false;
                }
            } else { 
                lastTurnFinger = event.tfinger.fingerId;
                isTurning = true;
                if (event.tfinger.x < 0.75) { 
                    turnRight = false;
                } else { 
                    turnRight = true;
                }
            }
            break;
        case SDL_FINGERUP:
            if (event.tfinger.x < 0.5 || event.tfinger.fingerId == lastMoveFinger) {
                lastMoveFinger = -1;
                isMoving = false;
            } else {
                lastTurnFinger = -1;
                isTurning = false;
            }
            break;
    }
}

Вот что происходит:

  1. Поместите первый палец на экран (удерживайте его)
  2. Событие первого касания зарегистрировано
  3. Поместите второй палец вниз на экран.
  4. Второе касание не зарегистрировано, но запускаются события мультитач (я поймал их с помощью printf).

Одна интересная вещь, которую я обнаружил, заключается в том, что если я обращаюсь SDL_FINGERMOTION, оба касания регистрируются в правильных местах - но это не сработает, потому что не обнаруживает ни одного касания, а вместо этого работает только при перемещении пальцев. Так что кажется, что работает мультитач, но, возможно, я не справляюсь с этим правильно.

Для справки: сенсорные события от SDL_events.h

/* Touch events */
SDL_FINGERDOWN      = 0x700,
SDL_FINGERUP,
SDL_FINGERMOTION,

Вот пример потока событий. Я опустил 1 палец, затем второй, затем поднял первый, затем поднял второй.

event 0x00000401
event 0x00000700 // Finger down
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000402
event 0x00000701 // Finger up

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

1 Ответ

0 голосов
/ 13 сентября 2018

Глядя на исходный код Я вижу, что SDL_SendTouch() должен вызываться для каждого пальца (NSEvent), отправляемого обработчику SDL_uikitview::touchesBegan (подкласс SDL UIView). Я не помню достаточно об UIKit, чтобы комментировать ожидаемое поведение здесь, но вы можете подключить отладчик и посмотреть, получит ли он ожидаемое число NSEvents.

Если число и тип NSEvents не соответствуют ожидаемым, то, похоже, SDL мало что может сделать. Если они соответствуют вашим ожиданиям, это указывает на ошибку в SDL.

В частности, посмотрите на источник для SDL_SendTouch как на другое место для установки точек останова. Есть несколько случаев, когда эта функция может выручить:

   228 SDL_Touch* touch = SDL_GetTouch(id);
   229     if (!touch) {
   230         return -1;
   231     }
   232 
   233     finger = SDL_GetFinger(touch, fingerid);
   234     if (down) {
   235         if (finger) {
   236             /* This finger is already down */
   237             return 0;
   238         }
   239 
   240         if (SDL_AddFinger(touch, fingerid, x, y, pressure) < 0) {
   241             return 0;
   242         }
...