最近想把小时候玩过的经典的RPG游戏用cocos2d_x给实现出来,于是遇到了方向键响应操作的问题,在cocos里面 目前仅仅支持ESC键和F1,F2功能键,于是我增加了四个方向键的响应,具体操作如下:
1、winproc响应
在windowProc里面添加对应四个方向键的消息响应 代码:
case WM_KEYDOWN: if (wParam == VK_F1 || wParam == VK_F2) { CCDirector* pDirector = CCDirector::sharedDirector(); if (GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0) pDirector->getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked); } else if (wParam == VK_ESCAPE) { CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked); } else if (wParam == VK_LEFT) { CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(KTypeLeftDown); } else if (wParam == VK_RIGHT) { CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(KTypeRightDown); } else if (wParam == VK_UP) { CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(KTypeUpDown); } else if (wParam == VK_DOWN) { CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(KTypeDownDown); }
2、事件分发
在上面的响应回调函数中我们看到了这个函数getKeypadDispatcher(),这个是获取键盘的事件分发器,dispatchKeypadMSG(KTypeUpDown)这个函数是分发器将事件分发给响应的委托对象去处理,我们进入这个函数瞧瞧,关键代码如下:
if (m_pDelegates->count() > 0) { CCObject* pObj = NULL; CCARRAY_FOREACH(m_pDelegates, pObj) { CC_BREAK_IF(!pObj); pHandler = (CCKeypadHandler*)pObj; pDelegate = pHandler->getDelegate(); switch (nMsgType) { case kTypeBackClicked: pDelegate->keyBackClicked(); break; case kTypeMenuClicked: pDelegate->keyMenuClicked(); break; case KTypeDownDown: pDelegate->keyDownDown(); break; case KTypeUpDown: pDelegate->keyUpDown(); break; case KTypeRightDown: pDelegate->keyRightDown(); break; case KTypeLeftDown: pDelegate->keyLeftDown(); break; default: break; } } }
3、重写实现函数
这段代码是循环已经注册过的委托对象,找到当前响应层的委托对象执行相应的事件操作,我们知道CCLayer类是继承了CCKeypadDelegate类的因此,我们在CCLayer层的子类中重写了四个响应函数这样就可以实现我们想要的内容了。