Я работаю над проектом 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;
}
}
Вот что происходит:
- Поместите первый палец на экран (удерживайте его)
- Событие первого касания зарегистрировано
- Поместите второй палец вниз на экран.
- Второе касание не зарегистрировано, но запускаются события мультитач (я поймал их с помощью
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
Обратите внимание, что есть много движений пальцев - но только один палец вверх и вниз. Если я получу какое-то время спустя, я обновлю это с распечаткой текущего количества пальцев на экране, чтобы проиллюстрировать, что событие нажатия второго пальца никогда не запускается.