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消息处理的虚函数。
&
补充:移动开发 , 其他 ,
- 更多wap疑问解答:
- 新人求助QPainter
- 为什么程序都退出了还可以收到推送?如果大多设备都可以推送那运营商怎么办?
- qt 4.7 sqlserver2000 存储过程调用
- 关于ANDROID4.0.1编译问题!
- Android FrameBuffer读屏幕30秒后mmap失败
- 联通粗定位用java程序如何来请求和接受数据
- 为什么QT运行Android平台的程序时,mouseMoveEvent事件响应的间隔时间很长??????????
- android与PC蓝牙通讯
- 指定大小的label 内容可变,如果内容超出label的宽度,将未能显示的部分显示在另一个label上
- Android调试
- android如何通过wifi连接无线打印机
- 运行程序,release目录下产生一个乱码文件夹
- 分享个某机构最新安卓资料,自己验证了
- service启动不起来,掉不了service connection
- 求助:QT5.0 没有QPrinter吗