Android NDK处理用户交互事件(2)

/**
 * Just the current frame in the display.
 */
static void engine_draw_frame(struct engine* engine) {
    if (engine->display == NULL) {
        // No display.
        return;
    }

// Just fill the screen with a color.
    glClearColor(((float)engine->state.x)/engine->width, engine->state.angle,
            ((float)engine->state.y)/engine->height, 1);
    glClear(GL_COLOR_BUFFER_BIT);


    glEnableClientState(GL_VERTEX_ARRAY);
    if(g_arVertex.size() >= 2)
    {
        glColor4f(1,1,1,1);
        glVertexPointer(3,GL_FLOAT,0,&g_arVertex[0]);
        glDrawArrays(GL_LINE_STRIP,0,g_arVertex.size());
    }


    eglSwapBuffers(engine->display, engine->surface);
}

/**
 * Tear down the EGL context currently associated with the display.
 */
static void engine_term_display(struct engine* engine) {
    if (engine->display != EGL_NO_DISPLAY) {
        eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
        if (engine->context != EGL_NO_CONTEXT) {
            eglDestroyContext(engine->display, engine->context);
        }
        if (engine->surface != EGL_NO_SURFACE) {
            eglDestroySurface(engine->display, engine->surface);
        }
        eglTerminate(engine->display);
    }
    engine->animating = 0;
    engine->display = EGL_NO_DISPLAY;
    engine->context = EGL_NO_CONTEXT;
    engine->surface = EGL_NO_SURFACE;
}

/**
 * Process the next input event.
 */
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
{
    struct engine* engine = (struct engine*)app->userData;


    int32_t    evtType    =    AInputEvent_getType(event);
    switch(evtType)
    {
    case AINPUT_EVENT_TYPE_KEY:
        break;

case AINPUT_EVENT_TYPE_MOTION:
        {
            switch(AInputEvent_getSource(event))
            {
            case AINPUT_SOURCE_TOUCHSCREEN:
                {
                    int32_t id = AMotionEvent_getAction(event);
                    switch(id)
                    {
                    case AMOTION_EVENT_ACTION_MOVE:
                        {
                            size_t    cnt = AMotionEvent_getPointerCount(event);
                            for( int i = 0 ;i < cnt; ++ i )
                            {
                                float x = AMotionEvent_getX(event,i);
                                float y = AMotionEvent_getY(event,i);
                                char  szBuf[64];
                                LOGI("x = %f  y = %f",x,y);
                                float3 pt;
                                pt.x = x;
                                pt.y = y;
                                pt.z = 0;
                                g_arVertex.push_back(pt);
                            }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/706aa2db62d972e5ef66183277443fa7.html