// // AniFastSwipeGestureRecognizer.cpp // SteveMaggieCpp // // Created by Katarzyna Kalinowska-Górska on 19.05.2017. // // #include #include "AniFastSwipeGestureRecognizer.h" #include "AniMathUtils.h" #include "AniScalingUtils.h" /*Detect fast swipe with the finger in one of the four basic directions */ AniFastSwipeGestureRecognizer::AniFastSwipeGestureRecognizer() : AniGestureRecognizer({cocos2d::EventListener::Type::TOUCH_ONE_BY_ONE}) { _onFastSwipeDetected = [](AniGestureRecognizerDirection directionX, AniGestureRecognizerDirection directionY, cocos2d::Point startLocation, cocos2d::Point endLocation, float speedX, float speedY){ // cocos2d::log("AniFastSwipeGestureRecognizer: onFastSwipeDetected with direction "+direction); }; } void AniFastSwipeGestureRecognizer::setOnFastSwipeDetectedCallback(std::function callback) { _onFastSwipeDetected = callback; } AniFastSwipeGestureRecognizer::~AniFastSwipeGestureRecognizer(){ } /////////////////////////////////////////////////////////////////////////// // internal /////////////////////////////////////////////////////////////////////////// // touch handlers bool AniFastSwipeGestureRecognizer::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event) { _startTime = cocos2d::utils::getTimeInMilliseconds()/1000.0; _startLocation = touch->getLocation(); return true; } void AniFastSwipeGestureRecognizer::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event) { auto currentTime = cocos2d::utils::getTimeInMilliseconds()/1000.0; auto timeDiff = (currentTime - _startTime); auto newLocation = touch->getLocation(); auto dX = newLocation.x - _startLocation.x; auto dY = newLocation.y - _startLocation.y; auto minDelta = m_minBaseDeltaToActivate*AniScalingUtils::scaleAspectFitToDesignIpadProSize(); if(std::abs(dX) < minDelta && std::abs(dY) < minDelta){ // cocos2d::log("returning because dx = %f, dy = %f vs minD = %f\n", dX, dY, minDelta); return; } auto xVel = dX / timeDiff; auto yVel = dY / timeDiff; auto absXSpeed = std::abs(xVel); auto absYSpeed = std::abs(yVel); if(absXSpeed >= m_minBaseSwipeSpeedToActivate*AniScalingUtils::scaleAspectFitToDesignIpadProSize() || absYSpeed >= m_minBaseSwipeSpeedToActivate*AniScalingUtils::scaleAspectFitToDesignIpadProSize()){ auto directionX = AniGestureRecognizerDirection::NONE; auto directionY = AniGestureRecognizerDirection::NONE; auto minSwipeSpeedForDirection = m_min_swipe_speed*AniScalingUtils::scaleAspectFitToDesignIpadProSize(); if(absXSpeed >= minSwipeSpeedForDirection){ directionX = AniMathUtils::signum(xVel) < 0 ? AniGestureRecognizerDirection::LEFT : AniGestureRecognizerDirection::RIGHT; } if(absYSpeed >= minSwipeSpeedForDirection){ directionY = AniMathUtils::signum(yVel) < 0 ? AniGestureRecognizerDirection::DOWN : AniGestureRecognizerDirection::UP; } _onFastSwipeDetected(directionX, directionY, _startLocation, newLocation, absXSpeed, absYSpeed); } }