给quick-cocos2d-x增加windows下模拟器右键,步骤如下
1.修改LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam),增加右键按下和抬起事件,大体参照左键的抬起和按下,具体代码如下所示:
case WM_RBUTTONDOWN:
#if(_MSC_VER >= 1600)
// Don't process message generated by Windows Touch
if (m_bSupportTouch && (s_pfGetMessageExtraInfoFunction() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) break;
#endif /* #if(_MSC_VER >= 1600) */
if (m_pDelegate && MK_RBUTTON == wParam)
{
POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)};
CCPoint pt(point.x, point.y);
pt.x /= m_fFrameZoomFactor;
pt.y /= m_fFrameZoomFactor;
CCPoint tmp = ccp(pt.x, m_obScreenSize.height - pt.y);
if (m_obViewPortRect.equals(CCRectZero) || m_obViewPortRect.containsPoint(tmp))
{
m_bCaptured = true;
SetCapture(m_hWnd);
int id = 0;
handleRTouchesBegin(1, &id, &pt.x, &pt.y);
}
}
break;
2.修改CCEGLViewProtocol,添加右键的handle,代码如下
void CCEGLViewProtocol::handleRTouchesBegin(int num, int ids[], float xs[], float ys[])
{
CCSet set;
for (int i = 0; i < num; ++i)
{
int id = ids[i];
float x = xs[i];
float y = ys[i];
CCInteger* pIndex = (CCInteger*)s_TouchesIntergerDict.objectForKey(id);
int nUnusedIndex = 0;
// it is a new touch
if (pIndex == NULL)
{
nUnusedIndex = getUnUsedIndex();
// The touches is more than MAX_TOUCHES ?
if (nUnusedIndex == -1) {
CCLOG("The touches is more than MAX_TOUCHES, nUnusedIndex = %d", nUnusedIndex);
continue;
}
CCTouch* pTouch = s_pTouches[nUnusedIndex] = new CCTouch();
pTouch->setTouchInfo(nUnusedIndex, (x - m_obViewPortRect.origin.x) / m_fScaleX,
(y - m_obViewPortRect.origin.y) / m_fScaleY);
//CCLOG("x = %f y = %f", pTouch->getLocationInView().x, pTouch->getLocationInView().y);
CCInteger* pInterObj = new CCInteger(nUnusedIndex);
s_TouchesIntergerDict.setObject(pInterObj, id);
set.addObject(pTouch);
pInterObj->release();
}
}
if (set.count() == 0)
{
CCLOG("touchesBegan: count = 0");
return;
}
m_pDelegate->touchesRBegan(&set, NULL);
}
3.ccTouchDispatcher中添加分发事件,代码如下
void CCTouchDispatcher::touchesRBegan(CCSet *touches, CCEvent *pEvent)
{
if (m_bDispatchEvents)
{
this->touches(touches, pEvent, CCRTOUCHBEGAN);
}
}
4.修改ccTouchDispatcher的touch,添加右键
if (uIndex == CCTOUCHBEGAN)
{
bClaimed = pHandler->getDelegate()->ccTouchBegan(pTouch, pEvent);
if (bClaimed)
{
pHandler->getClaimedTouches()->addObject(pTouch);
}
} else if(uIndex == CCRTOUCHBEGAN){
bClaimed = pHandler->getDelegate()->ccRTouchBegan(pTouch, pEvent);
if (bClaimed)
{
pHandler->getClaimedTouches()->addObject(pTouch);
}
}else
if (pHandler->getClaimedTouches()->containsObject(pTouch))
{
// moved ended canceled
bClaimed = true;
switch (sHelper.m_type)
{
case CCTOUCHMOVED:
pHandler->getDelegate()->ccTouchMoved(pTouch, pEvent);
break;
case CCTOUCHENDED:
pHandler->getDelegate()->ccTouchEnded(pTouch, pEvent);
pHandler->getClaimedTouches()->removeObject(pTouch);
break;
case CCTOUCHCANCELLED:
pHandler->getDelegate()->ccTouchCancelled(pTouch, pEvent);
pHandler->getClaimedTouches()->removeObject(pTouch);
break;
case CCRTOUCHENDED:
pHandler->getDelegate()->ccRTouchEnded(pTouch, pEvent);
pHandler->getClaimedTouches()->removeObject(pTouch);
break;
}
}
5.修改添加CCTouchDelegate右键事件:
virtual int ccRTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {
CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return 0;};
virtual void ccRTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
6,.为ccnode添加右键事件
int CCNode::ccRTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
if (kScriptTypeNone != m_eScriptType)
{
return excuteScriptTouchHandler(CCRTOUCHBEGAN, pTouch);
}
CC_UNUSED_PARAM(pTouch);
CC_UNUSED_PARAM(pEvent);
CCAssert(false, "Layer#ccTouchBegan override me");
printf("the kCCTouchBegan is %d\n\n", kCCTouchBegan);
return kCCTouchBegan;
}
7.千万别忘了在ccScene中重写右键事件,因为ccScene的作用是分发触摸。
int CCScene::ccRTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
// remove all touch targets
m_touchTargets->removeAllObjects();
// check touch targets
const CCPoint p = pTouch->getLocation();
CCObject *node;
CCNode *touchNode = NULL;
CCNode *checkVisibleNode = NULL;
bool visible = true;
sortAllTouchableNodes(m_touchableNodes);
CCARRAY_FOREACH(m_touchableNodes, node)
{
checkVisibleNode = touchNode = dynamic_cast(node);
// check node is visible
visible = true;
do
{
visible = visible && checkVisibleNode->isVisible();
checkVisibleNode = checkVisibleNode->getParent();
} while (checkVisibleNode && visible);
if (!visible) continue;
const CCRect boundingBox = touchNode->getCascadeBoundingBox();
if (touchNode->isRunning() && boundingBox.containsPoint(p))
{
touchNode->retain();
int ret = touchNode->ccRTouchBegan(pTouch, pEvent);
if (ret == kCCTouchBegan || ret == kCCTouchBeganNoSwallows)
{
m_touchTargets->addObject(touchNode);
if (ret == kCCTouchBegan)
{
touchNode->release();
break;
}
}
touchNode->release();
}
}
sortAllTouchableNodes(m_touchTargets);
return kCCTouchBegan;
}*>
8.添加传递给lua的事件int CCLuaEngine::executeNodeTouchEvent(CCNode* pNode, int eventType, CCTouch *pTouch)
{
CCTouchScriptHandlerEntry* pScriptHandlerEntry = pNode->getScriptTouchHandlerEntry();
if (!pScriptHandlerEntry){
return 0;
}
int nHandler = pScriptHandlerEntry->getHandler();
if (!nHandler){
return 0;
}
switch (eventType)
{
case CCTOUCHBEGAN:
m_stack->pushString("began");
break;
case CCTOUCHMOVED:
m_stack->pushString("moved");
break;
case CCTOUCHENDED:
m_stack->pushString("ended");
break;
case CCTOUCHCANCELLED:
m_stack->pushString("cancelled");
break;
case CCRTOUCHBEGAN:
m_stack->pushString("rbegan");
break;
case CCRTOUCHENDED:
m_stack->pushString("rended");
break;
default:
return 0;
}
const CCPoint pt = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
const CCPoint prev = CCDirector::sharedDirector()->convertToGL(pTouch->getPreviousLocationInView());
m_stack->pushFloat(pt.x);
m_stack->pushFloat(pt.y);
m_stack->pushFloat(prev.x);
m_stack->pushFloat(prev.y);
int ret = m_stack->executeFunctionByHandler(nHandler, 5);
m_stack->clean();
return ret;
}