mirror of https://github.com/axmolengine/axmol.git
Add touch input processing
This commit is contained in:
parent
81318d72ed
commit
fa940ec292
|
@ -219,17 +219,149 @@ static void engine_term_display(struct engine* engine) {
|
||||||
engine->surface = EGL_NO_SURFACE;
|
engine->surface = EGL_NO_SURFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get X, Y positions and ID's for all pointers
|
||||||
|
*/
|
||||||
|
static void getTouchPos(AInputEvent *event, int ids[], float xs[], float ys[]) {
|
||||||
|
int pointerCount = AMotionEvent_getPointerCount(event);
|
||||||
|
for(int i = 0; i < pointerCount; ++i) {
|
||||||
|
ids[i] = AMotionEvent_getPointerId(event, i);
|
||||||
|
xs[i] = AMotionEvent_getX(event, i);
|
||||||
|
ys[i] = AMotionEvent_getY(event, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle Touch Inputs
|
||||||
|
*/
|
||||||
|
static int32_t handle_touch_input(AInputEvent *event) {
|
||||||
|
|
||||||
|
pthread_t thisthread = pthread_self();
|
||||||
|
LOGI("handle_touch_input(%X), pthread_self() = %X", event, thisthread);
|
||||||
|
|
||||||
|
switch(AMotionEvent_getAction(event) &
|
||||||
|
AMOTION_EVENT_ACTION_MASK) {
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_DOWN:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_DOWN");
|
||||||
|
int pointerId = AMotionEvent_getPointerId(event, 0);
|
||||||
|
float xP = AMotionEvent_getX(event,0);
|
||||||
|
float yP = AMotionEvent_getY(event,0);
|
||||||
|
|
||||||
|
LOGI("Event: Action DOWN x=%f y=%f pointerID=%d\n",
|
||||||
|
xP, yP, pointerId);
|
||||||
|
int pId = pointerId;
|
||||||
|
float x = xP;
|
||||||
|
float y = yP;
|
||||||
|
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &pId, &x, &y);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_POINTER_DOWN:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_POINTER_DOWN");
|
||||||
|
int pointerIndex = AMotionEvent_getAction(event) >> AMOTION_EVENT_ACTION_POINTER_INDEX_MASK;
|
||||||
|
int pointerId = AMotionEvent_getPointerId(event, pointerIndex);
|
||||||
|
float xP = AMotionEvent_getX(event,pointerIndex);
|
||||||
|
float yP = AMotionEvent_getY(event,pointerIndex);
|
||||||
|
|
||||||
|
LOGI("Event: Action POINTER DOWN x=%f y=%f pointerID=%d\n",
|
||||||
|
xP, yP, pointerId);
|
||||||
|
int pId = pointerId;
|
||||||
|
float x = xP;
|
||||||
|
float y = yP;
|
||||||
|
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &pId, &x, &y);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_MOVE:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_MOVE");
|
||||||
|
int pointerCount = AMotionEvent_getPointerCount(event);
|
||||||
|
int ids[pointerCount];
|
||||||
|
float xs[pointerCount], ys[pointerCount];
|
||||||
|
getTouchPos(event, ids, xs, ys);
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesMove(pointerCount, ids, xs, ys);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_UP:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_UP");
|
||||||
|
int pointerId = AMotionEvent_getPointerId(event, 0);
|
||||||
|
float xP = AMotionEvent_getX(event,0);
|
||||||
|
float yP = AMotionEvent_getY(event,0);
|
||||||
|
LOGI("Event: Action UP x=%f y=%f pointerID=%d\n",
|
||||||
|
xP, yP, pointerId);
|
||||||
|
int pId = pointerId;
|
||||||
|
float x = xP;
|
||||||
|
float y = yP;
|
||||||
|
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesEnd(1, &pId, &x, &y);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_POINTER_UP:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_POINTER_UP");
|
||||||
|
int pointerIndex = AMotionEvent_getAction(event) >> AMOTION_EVENT_ACTION_POINTER_INDEX_MASK;
|
||||||
|
int pointerId = AMotionEvent_getPointerId(event, pointerIndex);
|
||||||
|
float xP = AMotionEvent_getX(event,pointerIndex);
|
||||||
|
float yP = AMotionEvent_getY(event,pointerIndex);
|
||||||
|
LOGI("Event: Action POINTER UP x=%f y=%f pointerID=%d\n",
|
||||||
|
xP, yP, pointerIndex);
|
||||||
|
int pId = pointerId;
|
||||||
|
float x = xP;
|
||||||
|
float y = yP;
|
||||||
|
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesEnd(1, &pId, &x, &y);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AMOTION_EVENT_ACTION_CANCEL:
|
||||||
|
{
|
||||||
|
LOGI("AMOTION_EVENT_ACTION_CANCEL");
|
||||||
|
int pointerCount = AMotionEvent_getPointerCount(event);
|
||||||
|
int ids[pointerCount];
|
||||||
|
float xs[pointerCount], ys[pointerCount];
|
||||||
|
getTouchPos(event, ids, xs, ys);
|
||||||
|
cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesCancel(pointerCount, ids, xs, ys);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOGI("handle_touch_input() default case.... NOT HANDLE");
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the next input event.
|
* Process the next input event.
|
||||||
*/
|
*/
|
||||||
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
|
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
|
||||||
|
|
||||||
|
pthread_t thisthread = pthread_self();
|
||||||
|
LOGI("engine_handle_input(%X, %X), pthread_self() = %X", app, event, thisthread);
|
||||||
|
|
||||||
struct engine* engine = (struct engine*)app->userData;
|
struct engine* engine = (struct engine*)app->userData;
|
||||||
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
|
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
|
||||||
engine->animating = 1;
|
engine->animating = 1;
|
||||||
engine->state.x = AMotionEvent_getX(event, 0);
|
engine->state.x = AMotionEvent_getX(event, 0);
|
||||||
engine->state.y = AMotionEvent_getY(event, 0);
|
engine->state.y = AMotionEvent_getY(event, 0);
|
||||||
return 1;
|
|
||||||
|
return handle_touch_input(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue