للتعامل مع أحداث الإدخال باللمس، يُرجى قراءة الصفيف
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);