void HFViewport::doAutoZoom(const CCPoint& curPosition){ m_doubleClicked = true; this->mTouchMode = TouchMode_ZoomFling; beginZoom(CCPointMake(curPosition.x - 50, curPosition.y), CCPointMake(curPosition.x + 50, curPosition.y)); m_tAutoZoomDistance = curPosition; float curScale = this->m_TargetNode->getScale(); float resolutionScale = getResolutionRate(); //zoom if(curScale < resolutionScale) { //计算指数递减初始值 sum = 1 / (1 - q), q为比值 m_tAutoZoomDelta = (resolutionScale - curScale) / ((1/(1-ZOOM_DEACCEL_RATE))*0.95); } else if (curScale > resolutionScale) { //计算指数递减初始值 sum = 1 / (1 - q), q为比值 m_tAutoZoomDelta = (curScale - resolutionScale) / ((1/(1-ZOOM_DEACCEL_RATE))*0.95); } //scroll CCPoint targetPosition = ccp(0, 0);//CCPoint targetPosition = UIUtil::moveToCenterPostion(this->m_TargetNode->convertToNodeSpace(curPosition)); CCPoint autoCenterDifAll = ccpSub(targetPosition, this->m_TargetNode->getPosition()); //计算指数递减初始值 sum = 1 / (1 - q), q为比值 if (mForceStopScroll || !mMovable) { m_tAutoZoomDistance = CCPointZero; } else { m_tAutoZoomDistance = autoCenterDifAll / ((1/(1-SCROLL_DEACCEL_RATE))*0.9); } this->schedule(schedule_selector(HFViewport::zoomInOut)); }
void EXZoomController::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent){ CCSetIterator iter = pTouches->begin(); for (; iter != pTouches->end(); iter++){ CCTouch* pTouch = (CCTouch*)(*iter); // CCPoint location = pTouch->getLocation(); _touchesDic->setObject(pTouch, CCString::createWithFormat("%d",pTouch->getID())->getCString()); CCLog("touc id %s,",CCString::createWithFormat("%d",pTouch->getID())->getCString()); } bool multitouch = _touchesDic->count() > 1; if (multitouch){ //reset history so auto scroll doesn't happen _timePointStampCounter = 0; endScroll(_firstTouch); CCArray* keys = _touchesDic->allKeys(); CCTouch *touch1 = (CCTouch*)_touchesDic->objectForKey(((CCString*)keys->objectAtIndex(0))->getCString()); CCTouch *touch2 = (CCTouch*)_touchesDic->objectForKey(((CCString*)keys->objectAtIndex(1))->getCString()); CCPoint pt = touch1->getLocationInView(); CCPoint pt2 = touch2->getLocationInView(); beginZoom(pt, pt2); } else { //record the point for determining velocity CCArray* keys = _touchesDic->allKeys(); // ((CCString*)keys->objectAtIndex(0))->getCString() _touchesDic->objectForKey(((CCString*)keys->objectAtIndex(0))->getCString()); CCTouch *touch = (CCTouch*)_touchesDic->objectForKey(((CCString*)keys->objectAtIndex(0))->getCString()); recordScrollPoint(touch); beginScroll(_node->convertToNodeSpace(touch->getLocation())); } }
void HFViewport::onTouchesBegan(const std::vector<Touch*>& pTouches, Event *pEvent) { unscheduleAll(); CC_ASSERT(this->m_TargetNode); //tao.yu 为解决batch不跟随自定义摄像机走的问题,增加此行代码 if (m_TargetNode->getTag() == IMPERIAL_SCENE_TOUCH_LAYER_TAG) { m_TargetNode->setCameraMask((unsigned short)CameraFlag::USER4, true); auto node3d = m_TargetNode->getChildByTag(JUST3D_NODE_TAG); if (node3d) { node3d->setCameraMask((unsigned short)CameraFlag::USER2, true); } } // CC_ASSERT(pTouches); if (mFingerMap.size() >= 2) { isMove = true; return; } if( this->mTouchMode == TouchMode_Fling ) { this->m_TargetNode->stopActionByTag(FLINGACTION_TAG); } this->mTouchMode = TouchMode_None; for ( auto &item: pTouches ) { CCTouch* curTouch = dynamic_cast<CCTouch*>(item); CC_ASSERT(curTouch); if (mFingerMap.size() <= 2) { mFingerMap[curTouch->getID()] = curTouch->getLocation(); } } // // CCSetIterator iter = pTouches->begin(); // // while( iter != pTouches->end() ) // { // CCTouch* curTouch = dynamic_cast<CCTouch*>(*iter); // CC_ASSERT(curTouch); // if (mFingerMap.size() <= 2) { // mFingerMap[curTouch->getID()] = curTouch->getLocation(); // } // iter++; // } switch(mFingerMap.size()) { case 1: { m_bTouchMoved = false; if (this->mTouchMode != TouchMode_ZoomFling) { this->mTouchMode = TouchMode_Scroll; } if (!mForceStopScroll && mMovable && !pTouches.empty()) { CCTouch* objTouch = dynamic_cast<CCTouch*>(*pTouches.begin()); CC_ASSERT(objTouch); // let "beginScroll" fired by first step scroll , make single touch not fire this // beginScroll(objTouch); if (mTouchDelegate) { mTouchDelegate->onSingleTouchBegin(this->m_TargetNode->convertToNodeSpace(objTouch->getLocation())); mTouchDelegate->onSingleTouchBegin(objTouch); } } CCTouch* ptouch =getAnyTouchObject(pTouches); mPreviewPos = ptouch->getLocation(); } break; case 2: if (this->mTouchMode != TouchMode_ZoomFling) { this->mTouchMode = TouchMode_Zoom; } if(!allowZoom){ return; } do { FingerMap::iterator iter = mFingerMap.begin(); CC_BREAK_IF(iter == mFingerMap.end()); CCPoint pos1 = (*iter).second; CC_BREAK_IF(++iter == mFingerMap.end()); CCPoint pos2 = (*iter).second; beginZoom(pos1, pos2); } while(0); isMove = true; break; default: isMove = true; CCLOG("begin:Touch not support with %d fingers", pTouches.size()); } }
void Viewport::onTouchesBegan(const std::vector<Touch*>& pTouches, Event *pEvent) { unscheduleAll(); CC_ASSERT(this->m_TargetNode); // CC_ASSERT(pTouches); if (mFingerMap.size() >= 2) { isMove = true; return; } if( this->mTouchMode == TouchMode_Fling ) { this->m_TargetNode->stopActionByTag(FLINGACTION_TAG); } this->mTouchMode = TouchMode_None; for ( auto &item: pTouches ) { Touch* curTouch = dynamic_cast<Touch*>(item); CC_ASSERT(curTouch); if (mFingerMap.size() <= 2) { mFingerMap[curTouch->getID()] = curTouch->getLocation(); } } switch(mFingerMap.size()) { case 1: { m_bTouchMoved = false; if (this->mTouchMode != TouchMode_ZoomFling) { this->mTouchMode = TouchMode_Scroll; } if (!mForceStopScroll && mMovable) { Touch* objTouch = dynamic_cast<Touch*>(*pTouches.begin()); CC_ASSERT(objTouch); // let "beginScroll" fired by first step scroll , make single touch not fire this // beginScroll(objTouch); if (mTouchBeginHandler) { pushValueToLua(mTouchBeginHandler, objTouch); } } Touch* ptouch =getAnyTouchObject(pTouches); mPreviewPos = ptouch->getLocation(); } break; case 2: if (this->mTouchMode != TouchMode_ZoomFling) { this->mTouchMode = TouchMode_Zoom; } if(!allowZoom){ return; } do { FingerMap::iterator iter = mFingerMap.begin(); CC_BREAK_IF(iter == mFingerMap.end()); Vec2 pos1 = (*iter).second; CC_BREAK_IF(++iter == mFingerMap.end()); Vec2 pos2 = (*iter).second; beginZoom(pos1, pos2); } while(0); isMove = true; break; default: isMove = true; CCLOG("begin:Touch not support with %lu fingers", pTouches.size()); } }