首页 > 其他 > 详细

cocos2dx:模拟touch事件

时间:2014-02-27 02:12:58      阅读:537      评论:0      收藏:0      [点我收藏+]

     最近终于开始学习cocos2d-x引擎了,Cocos2d-x作为一个手机游戏引擎,屏幕触摸事件(touch)的处理一定时非常重要的。上个礼拜,我就开始琢磨,如何在telnet终端通过CCConsole命令模拟touch事件? 要在引擎里模拟touch事件,就先要弄清楚引擎是如何处理touch事件的。就以往的经验,touch事件的处理是比较复杂的,所以千万不能先看代码或者查资料,要先想清楚。

    触摸事件是通过触摸屏传感器产生中断传给CPU,CPU再调用驱动的中断处理程序传给OS,OS再通过touch事件回调接口传给应用处理的。引擎的位置显然在应用层。那我们的目标就是OS的回调接口,以Android为例,应用入口在android_main(),回调接口也是在这里指定的:

void android_main(struct android_app* state) {


    // Make sure glue isn‘t stripped.
    app_dummy();
    

    memset(&engine, 0, sizeof(engine));
    state->userData = &engine;
    state->onAppCmd = engine_handle_cmd;
    state->onInputEvent = engine_handle_input;
    state->inputPollSource.process = process_input;
    engine.app = state;

....

}


input事件的处理函数就是engin_handle_input:


static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {


    pthread_t thisthread = pthread_self();
    LOG_EVENTS_DEBUG("engine_handle_input(%X, %X), pthread_self() = %X", app, event, thisthread);


    struct engine* engine = (struct engine*)app->userData;


    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
        engine->animating = 1;
        engine->state.x = AMotionEvent_getX(event, 0);
        engine->state.y = AMotionEvent_getY(event, 0);


        return handle_touch_input(event);
    }
    else
        return handle_key_input(event);


    return 0;
}


input事件分两种类型,touch input 和 key input,我们关心的是touch事件,处理函数为handle_touch_input():


static int32_t handle_touch_input(AInputEvent *event) {


    pthread_t thisthread = pthread_self();
    LOG_EVENTS_DEBUG("handle_touch_input(%X), pthread_self() = %X", event, thisthread);


    switch(AMotionEvent_getAction(event) &
           AMOTION_EVENT_ACTION_MASK) {


    case AMOTION_EVENT_ACTION_DOWN:
        {
            LOG_EVENTS_DEBUG("AMOTION_EVENT_ACTION_DOWN");
            int pointerId = AMotionEvent_getPointerId(event, 0);
            float xP = AMotionEvent_getX(event,0);
            float yP = AMotionEvent_getY(event,0);


            LOG_EVENTS_DEBUG("Event: Action DOWN x=%f y=%f pointerID=%d\n",
                 xP, yP, pointerId);
            float x = xP;
            float y = yP;


            cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &pointerId, &x, &y);
            return 1;
        }
        break;

.....
   
    }
}

为节省篇幅,只列出touch begin的代码,其他的类似。

这样,就很清楚了,要模拟屏幕touch事件,只要通过:

cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin/handleTouchesEnd/handleTouchesMove

这几个接口就可以实现了。

这样,就可以在telnet终端里输入

>touch tap 300 600

>touch swipe 800 600 800 300

来模拟touch事件了

代码可以看这里:

https://github.com/cocos2d/cocos2d-x/pull/5462


cocos2dx:模拟touch事件,布布扣,bubuko.com

cocos2dx:模拟touch事件

原文:http://blog.csdn.net/u012973744/article/details/19938605

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!