给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"); <span style="white-space:pre"> </span>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<CCNode*>(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; }
时间: 2024-10-10 09:33:10