当前位置:编程学习 > wap >>

Cocos2d-x 2.0 按键加速处理深入分析

 大家好,我们经常会玩赛车游戏,当我们按下一个按键时,如果只能匀速运动是令人烦燥的。在游戏中用到加速度,利用加速度对于物体进行更真实的控制是必不可少的技能。今天我们来学习一下Cocos2d-x中如何利用按键来处理速度的累加。
 
    我们知道在WIN32编程中,一个键按下时所对应的窗口会收到WM_KEYDOWN消息,如果按下的键输入的是字符,窗口接着会收到WM_CHAR消息,而当按键抬起时对应的窗口会收到WM_KEYUP消息。在HelloWorld深入分析一节中,我们知道在CCEGLView类中有窗口消息的处理函数WindowProc,所以要进行按键的处理,就需要在接受按键消息时调用相应的函数。我们来看一下它在接受到WM_KEYDOWN,WM_CHAR和WM_KEYUP时做了什么。
[cpp]  
LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{  
    …  
case WM_KEYDOWN:  
        if (wParam == VK_F1 || wParam == VK_F2)  
        {  
            CCDirector* pDirector = CCDirector::sharedDirector();  
            //当SHIFT键被按下时,根据是否按下的是F1来决定软键盘收到的消息是响应回退还是主菜单。  
            if (GetKeyState(VK_LSHIFT) < 0 ||  GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0)  
                pDirector->getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked);  
        }  
        //如果按键消息响应函数有效则调用函数指针m_lpfnAccelerometerKeyHook所指的函数。   
        if ( m_lpfnAccelerometerKeyHook!=NULL )  
        {  
            (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );  
        }  
        break;  
    case WM_KEYUP:  
        //如果按键消息响应函数有效则调用函数指针m_lpfnAccelerometerKeyHook所指的函数。  
        if ( m_lpfnAccelerometerKeyHook!=NULL )  
        {  
            (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );  
        }  
        break;  
    case WM_CHAR:  
        {  
            //如果输入的字符是控制符则进行相关处理。  
            if (wParam < 0x20)  
            {  
                if (VK_BACK == wParam)  
                {  
                    CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();  
                }  
                else if (VK_RETURN == wParam)  
                {  
                    CCIMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1);  
                }  
                else if (VK_TAB == wParam)  
                {  
                    // tab input  
                }  
                else if (VK_ESCAPE == wParam)  
                {  
                    // ESC input  
                    CCDirector::sharedDirector()->end();  
                }  
            }  
            else if (wParam < 128)  
            {  
                //如果是ASCII码,则响应文字输入。  
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1);  
            }  
            else  
            {   //大于128的使用宽字符,所以这里将其转化为多字节字符串来输入文本。  
                char szUtf8[8] = {0};  
                int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL);  
                CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen);  
            }  
            //如果按键消息响应函数有效则调用函数指针m_lpfnAccelerometerKeyHook所指的函数。  
            if ( m_lpfnAccelerometerKeyHook!=NULL )  
            {  
               (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam );  
            }  
        }  
        break;  
…  
}  
 
 
    可以看到,CCEGLView类中有一个成员函数指针m_lpfnAccelerometerKeyHook,它将具体的实际的按键处理交给了外部函数。
 
那么,是谁?在哪里去设置函数指针指向的函数呢?我们保留疑问,继续学习。
 
        我们打开CCLayer.h,我们来看一下CCLayer的声明:
 
class   CC_DLL CCLayer :public CCNode, public CCTouchDelegate,public   CCAccelerometerDelegate,public CCKeypadDelegate
 
         在这一行里,我们可以清楚的知道CCLayer的本质是什么,它是具有输入功能的节点。
CCAccelerometerDelegate是加速键消息处理接口类,可以接收到加速键产生的速度信息并进行处理,我们打开源码
CCAccelerometerDelegate.h来看一下:
[cpp]  
//这个结构用于记录当前时刻的X,Y,Z三个方向的速度信息。  
typedef struct   
{  
    double x;  
    double y;  
    double z;  
    double timestamp;  
}   
CCAcceleration;  
  
//类CCAccelerometerDelegate  
class CC_DLL CCAccelerometerDelegate  
{  
public:  
    //接受CCAcceleration消息处理的虚函数。  
  &
补充:移动开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,