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