Example #1
0
    protected virtual bool CanBegin(T gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if ("MouseInput" == TouchManager.Instance.InputProvider.name)
        {
            if (!UnityEngine.Input.GetMouseButton(0))
            {
                return(false);
            }
        }
        if (IsExclusive && TouchManager.Touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if (ArkCrossEngine.TouchType.Regognizer != TouchManager.curTouchState)
        {
            return(false);
        }

        /*
         * if (UICamera.lastHit.collider != null)
         * {
         *  return false;
         * }
         */
        return(true);
    }
Example #2
0
    protected override GestureRecognitionState OnRecognize(CustomGesture gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            if (touches.Count < RequiredFingerCount)
            {
                if (RecognizeCustom(gesture))
                {
                    if (SkillCategory.kNone != gesture.SkillTags)
                    {
                        gesture.HintFlag = HintType.RSucceed;
                    }
                    return(GestureRecognitionState.Recognized);
                }
                gesture.HintFlag = HintType.RFailure;
                return(GestureRecognitionState.Failed);
            }
            gesture.HintFlag = HintType.RFailure;
            return(GestureRecognitionState.Failed);
        }
        /// 超时
        if (IsTimeOut(gesture))
        {
            gesture.HintFlag = HintType.RFailure;
            return(GestureRecognitionState.Failed);
        }
        /// 超出距离
        if (IsExceedDistance(gesture))
        {
            if (RecognizeCustom(gesture))
            {
                if (SkillCategory.kNone != gesture.SkillTags)
                {
                    gesture.HintFlag = HintType.RSucceed;
                }
                return(GestureRecognitionState.Recognized);
            }
            gesture.IsInvalid = true;
            gesture.HintFlag  = HintType.RFailure;
            return(GestureRecognitionState.Failed);
        }
        // 更新手势位置
        gesture.Position = touches.GetAveragePosition();
        UnityEngine.Vector2 lastSamplePos = gesture.RawPoints[gesture.RawPoints.Count - 1].Position;

        float dist = UnityEngine.Vector2.SqrMagnitude(gesture.Position - lastSamplePos);

        if (dist > MinDistanceBetweenSamples * MinDistanceBetweenSamples)
        {
            int strokeId = 0;
            gesture.RawPoints.Add(new Point(strokeId, gesture.Position));
        }

        return(GestureRecognitionState.InProgress);
    }
Example #3
0
    /// tool
    protected bool Young(TouchManager.IFingerList touches)
    {
        TouchManager.Finger oldestTouch = touches.GetOldest();
        if (oldestTouch == null)
        {
            return(false);
        }
        float elapsedTimeSinceFirstTouch = UnityEngine.Time.time - oldestTouch.StarTime;

        return(elapsedTimeSinceFirstTouch < 0.25f);
    }
Example #4
0
 protected override void OnBegin(EasyGesture gesture, TouchManager.IFingerList touches)
 {
     gesture.StartPosition = touches.GetAverageStartPosition();
     gesture.Position      = touches.GetAveragePosition();
     CurActiveSection++;
     //SkillSection[(int)CurActiveSection].ReSet();
     if (Section.First == CurActiveSection)
     {
         SkillSection[(int)CurActiveSection].StartTime = gesture.StartTime;
         SkillSection[(int)CurActiveSection].StartPos  = gesture.StartPosition;
     }
     else
     {
         SkillSection[(int)CurActiveSection].StartTime = Time.time;
         SkillSection[(int)CurActiveSection].StartPos  = touches.GetAveragePosition();
     }
 }
Example #5
0
    void UpdateExclusive()
    {
        T gesture = gestures[0];

        TouchManager.IFingerList touches = TouchManager.Touches;
        if (gesture.State == GestureRecognitionState.Ready)
        {
            if (CanBegin(gesture, touches))
            {
                Begin(gesture, 0, touches);
            }
        }
        UpdateGesture(gesture, touches);
        if ("OnEasyGesture" == gesture.Recognizer.EventMessageName)
        {
            if (touches.Count <= 0)
            {
                Reset(gesture, false);
            }
        }
    }
Example #6
0
 protected override GestureRecognitionState OnRecognize(LongPressGesture gesture, TouchManager.IFingerList touches)
 {
     if (touches.Count != RequiredFingerCount)
     {
         return(GestureRecognitionState.Failed);
     }
     if (HasTimedOut(gesture))
     {
         return(GestureRecognitionState.Failed);
     }
     if (gesture.ElapsedTime >= Duration)
     {
         return(GestureRecognitionState.Recognized);
     }
     // Æ«Àë³õʼλÖÃÌ«Ô¶
     if (touches.GetAverageDistanceFromStart() > ToPixels(MoveTolerance))
     {
         return(GestureRecognitionState.Failed);
     }
     return(GestureRecognitionState.InProgress);
 }
Example #7
0
 ///
 protected override void OnBegin(CustomGesture gesture, TouchManager.IFingerList touches)
 {
     gesture.StartPosition = touches.GetAverageStartPosition();
     gesture.Position      = touches.GetAveragePosition();
     gesture.RawPoints.Clear();
     gesture.RawPoints.Add(new Point(0, gesture.Position));
     ///
     CurActiveSection++;
     ///
     SkillSection[(int)CurActiveSection].ReSet();
     if (Section.First == CurActiveSection)
     {
         SkillSection[(int)CurActiveSection].StartTime = gesture.StartTime;
         SkillSection[(int)CurActiveSection].StartPos  = gesture.StartPosition;
     }
     else
     {
         SkillSection[(int)CurActiveSection].StartTime = UnityEngine.Time.time;
         SkillSection[(int)CurActiveSection].StartPos  = touches.GetAveragePosition();
     }
 }
Example #8
0
    void Begin(T gesture, int clusterId, TouchManager.IFingerList touches)
    {
        gesture.ClusterId = clusterId;
        gesture.StartTime = UnityEngine.Time.time;

#if UNITY_EDITOR
        if (gesture.Fingers.Count > 0)
        {
            //Debug.LogWarning("Begin Gesture Error");
        }
#endif

        for (int i = 0; i < touches.Count; ++i)
        {
            TouchManager.Finger finger = touches[i];
            gesture.Fingers.Add(finger);
            Acquire(finger);
        }

        OnBegin(gesture, touches);
        gesture.State = GestureRecognitionState.Started;
    }
Example #9
0
    GestureRecognitionState RecognizeSingleTap(TapGesture gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            // 所有手指抬起,触发Recognized事件
            if (touches.Count == 0)
            {
                return(GestureRecognitionState.Recognized);
            }
            return(GestureRecognitionState.Failed);
        }
        if (HasTimedOut(gesture))
        {
            return(GestureRecognitionState.Failed);
        }
        // 手指移动距离
        float sqrDist = Vector3.SqrMagnitude(touches.GetAveragePosition() - gesture.StartPosition);

        if (sqrDist >= ToSqrPixels(MoveTolerance))
        {
            return(GestureRecognitionState.Failed);
        }
        return(GestureRecognitionState.InProgress);
    }
Example #10
0
    protected override bool CanBegin(CustomGesture gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if (IsExclusive && TouchManager.Touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if (ArkCrossEngine.TouchType.Regognizer != TouchManager.curTouchState)
        {
            return(false);
        }
        if ((int)CurActiveSection >= SectionNumber - 1)
        {
            return(false);
        }
        if (CurActiveSection != Section.Invalid && gesture.IsInvalid)
        {
            return(false);
        }
        Section MediSection    = (CurActiveSection == Section.Invalid ? Section.First : CurActiveSection + 1);
        float   ActiveDistance = SkillSection[(int)MediSection].ActiveDistance;

        if (ActiveDistance > 0)
        {
            float Distance = 0;
            if (MediSection == Section.First)
            {
                gesture.IsInvalid = false;
                Distance          = touches.GetAverageDistanceFromStart();
            }
            else if (MediSection == Section.Second)
            {
                if (UnityEngine.Vector2.zero == SkillSection[(int)MediSection].StartPos)
                {
                    if (UnityEngine.Vector2.zero == LastInputPos)
                    {
                        LastInputPos = touches.GetAveragePosition();
                        return(false);
                    }
                    Point cp = new Point(0, touches.GetAveragePosition());
                    Point lp = new Point(0, LastInputPos);

                    if (SkillCategory.kSkillA == ActiveSkill)
                    {
                        if (cp.Position.x < lp.Position.x)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillB == ActiveSkill)
                    {
                        if (cp.Position.y > lp.Position.y)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillC == ActiveSkill)
                    {
                        if (cp.Position.x > lp.Position.x)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillD == ActiveSkill)
                    {
                        if (cp.Position.y < lp.Position.y)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    return(false);
                }
                else
                {
                    Distance = UnityEngine.Vector2.Distance(touches.GetAveragePosition(), SkillSection[(int)MediSection].StartPos);
                }
            }
            else if (MediSection == Section.Third)
            {
                if (UnityEngine.Vector2.zero == SkillSection[(int)MediSection].StartPos)
                {
                    if (UnityEngine.Vector2.zero == LastInputPos)
                    {
                        LastInputPos = touches.GetAveragePosition();
                        return(false);
                    }
                    Point cp = new Point(0, touches.GetAveragePosition());
                    Point lp = new Point(0, LastInputPos);

                    if (SkillCategory.kSkillA == ActiveSkill)
                    {
                        if (cp.Position.x > lp.Position.x)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillB == ActiveSkill)
                    {
                        if (cp.Position.y < lp.Position.y)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillC == ActiveSkill)
                    {
                        if (cp.Position.x < lp.Position.x)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }
                    else if (SkillCategory.kSkillD == ActiveSkill)
                    {
                        if (cp.Position.y > lp.Position.y)
                        {
                            SkillSection[(int)MediSection].StartPos = touches.GetAveragePosition();
                        }
                    }

                    return(false);
                }
                else
                {
                    Distance = UnityEngine.Vector2.Distance(touches.GetAveragePosition(), SkillSection[(int)MediSection].StartPos);
                }
            }

            if (Distance < ActiveDistance)
            {
                return(false);
            }
            else
            {
                if (!gesture.IsActive)
                {
                    gesture.HintFlag      = HintType.Hint;
                    gesture.StartPosition = touches.GetAverageStartPosition();
                    RaiseHintEvent(gesture);
                    gesture.IsActive = true;
                }
            }
        }
        return(true);
    }
Example #11
0
 protected override GestureRecognitionState OnRecognize(TapGesture gesture, TouchManager.IFingerList touches)
 {
     return(IsMultiTap ? RecognizeMultiTap(gesture, touches) : RecognizeSingleTap(gesture, touches));
 }
Example #12
0
 protected override void OnBegin(TapGesture gesture, TouchManager.IFingerList touches)
 {
     gesture.Position      = touches.GetAveragePosition();
     gesture.StartPosition = gesture.Position;
     gesture.LastTapTime   = Time.time;
 }
Example #13
0
    GestureRecognitionState RecognizeMultiTap(TapGesture gesture, TouchManager.IFingerList touches)
    {
        gesture.WasDown = gesture.Down;
        gesture.Down    = false;

        if (touches.Count == RequiredFingerCount)
        {
            gesture.Down         = true;
            gesture.LastDownTime = Time.time;
        }
        else if (touches.Count == 0)
        {
            gesture.Down = false;
        }
        else
        {
            if (touches.Count < RequiredFingerCount)
            {
                if (Time.time - gesture.LastDownTime > 0.25f)
                {
                    return(GestureRecognitionState.Failed);
                }
            }
            else
            {
                if (!Young(touches))
                {
                    return(GestureRecognitionState.Failed);
                }
            }
        }

        if (HasTimedOut(gesture))
        {
            return(GestureRecognitionState.Failed);
        }

        if (gesture.Down)
        {
            float sqrDist = Vector3.SqrMagnitude(touches.GetAveragePosition() - gesture.StartPosition);
            if (sqrDist >= ToSqrPixels(MoveTolerance))
            {
                return(GestureRecognitionState.FailAndRetry);
            }
        }

        if (gesture.WasDown != gesture.Down)
        {
            if (!gesture.Down)
            {
                ++gesture.Taps;
                gesture.LastTapTime = Time.time;
                if (gesture.Taps >= RequiredTaps)
                {
                    return(GestureRecognitionState.Recognized);
                }
            }
        }

        return(GestureRecognitionState.InProgress);
    }
Example #14
0
    protected override GestureRecognitionState OnRecognize(EasyGesture gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            if (touches.Count < RequiredFingerCount)
            {
                if (((int)CurActiveSection >= 0) && ((int)CurActiveSection <= SectionNumber - 1))
                {
                    /*
                     * if (RecognizeCustom(gesture)) {
                     * return GestureRecognitionState.Recognized;
                     * }
                     * gesture.HintFlag = HintType.RFailure;
                     * RaiseHintEvent(gesture);
                     * return GestureRecognitionState.Failed;*/
                }
                return(GestureRecognitionState.Failed);
            }
            return(GestureRecognitionState.Failed);
        }
        /// ³¬Ê±

        /*
         * if (IsTimeOut(gesture)) {
         * gesture.HintFlag = HintType.RFailure;
         * return GestureRecognitionState.Failed;
         * }*/
        /// ³¬³ö¾àÀë
        if (IsExceedDistance(gesture))
        {
            if (RecognizeCustom(gesture))
            {
                SkillCategory skill_tags = CaclSkillTag(gesture);
                if (SkillCategory.kSkillQ == skill_tags || SkillCategory.kSkillE == skill_tags)
                {
                    gesture.IsInvalid = true;
                }
                if (0 == SkillSection[(int)CurActiveSection].PathLength)
                {
                    SkillSection[(int)CurActiveSection].PathLength = Vector2.Distance(SkillSection[(int)CurActiveSection].StartPos, touches.GetAveragePosition());
                }
                else
                {
                    SkillSection[(int)CurActiveSection].PathLength += Vector2.Distance(WasInputPos, gesture.Position);
                }
                return(GestureRecognitionState.Recognized);
            }

            gesture.IsInvalid = true;
            return(GestureRecognitionState.Failed);
        }

        if (CurActiveSection > 0)
        {
            CalcSectionStartPos(gesture, touches.GetAveragePosition(), LastInputPos, CurActiveSection, SkillSection[(int)(CurActiveSection - 1)].EndPos);
        }

        gesture.Position = touches.GetAveragePosition();
        if (Vector2.zero == WasInputPos)
        {
            SkillSection[(int)CurActiveSection].PathLength += Vector2.Distance(SkillSection[(int)CurActiveSection].StartPos, gesture.Position);
        }
        else
        {
            SkillSection[(int)CurActiveSection].PathLength += Vector2.Distance(WasInputPos, gesture.Position);
        }
        LastInputPos = gesture.Position;
        WasInputPos  = gesture.Position;
        return(GestureRecognitionState.InProgress);
    }
Example #15
0
 protected abstract void OnBegin(T gesture, TouchManager.IFingerList touches);
Example #16
0
 protected override void OnBegin(LongPressGesture gesture, TouchManager.IFingerList touches)
 {
     gesture.Position      = touches.GetAveragePosition();
     gesture.StartPosition = gesture.Position;
 }
Example #17
0
    protected virtual void UpdateGesture(T gesture, TouchManager.IFingerList touches)
    {
        if (gesture.State == GestureRecognitionState.Ready)
        {
            return;
        }
        if (gesture.State == GestureRecognitionState.Started)
        {
            gesture.State = GestureRecognitionState.InProgress;
        }

        switch (gesture.State)
        {
        case GestureRecognitionState.InProgress:
        {
            GestureRecognitionState newState = OnRecognize(gesture, touches);
            if (newState == GestureRecognitionState.FailAndRetry)
            {
                gesture.State = GestureRecognitionState.Failed;
                int clusterId = gesture.ClusterId;
                Reset(gesture);
                if (CanBegin(gesture, touches))
                {
                    Begin(gesture, clusterId, touches);
                }
            }
            else
            {
                gesture.State = newState;
            }
        }
        break;

        case GestureRecognitionState.Recognized:
        case GestureRecognitionState.Failed:
        {
            if (ResetMode == GestureResetMode.NextFrame || (ResetMode == GestureResetMode.EndOfTouchSequence && touches.Count == 0))
            {
                if ("OnEasyGesture" == gesture.Recognizer.EventMessageName)
                {
                    if (GestureRecognitionState.Failed == gesture.State)
                    {
                        gesture.HintFlag = HintType.RFailure;
                        RaiseHintEvent(gesture);
                    }
                    else
                    {
                        if (SkillCategory.kNone != gesture.SkillTags)
                        {
                            gesture.HintFlag = HintType.RSucceed;
                            RaiseHintEvent(gesture);
                        }
                    }
                }

                if (touches.Count == 0)
                {
                    Reset(gesture, false);
                    Refresh(gesture);
                }
                else
                {
                    Reset(gesture, true);
                }
            }
        }
        break;

        default:
            Debug.LogError("UpdateGesture Failing");
            gesture.State = GestureRecognitionState.Failed;
            break;
        }
    }
Example #18
0
    protected override bool CanBegin(EasyGesture gesture, TouchManager.IFingerList touches)
    {
        if (touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if ("MouseInput" == TouchManager.Instance.InputProvider.name)
        {
            if (!Input.GetMouseButton(0))
            {
                return(false);
            }
        }
        if (IsExclusive && TouchManager.Touches.Count != RequiredFingerCount)
        {
            return(false);
        }
        if (TouchType.Regognizer != TouchManager.curTouchState)
        {
            return(false);
        }
        if ((int)CurActiveSection >= SectionNumber - 1)
        {
            return(false);
        }
        if (CurActiveSection != Section.Invalid && gesture.IsInvalid)
        {
            return(false);
        }

        Section medi_section       = (CurActiveSection == Section.Invalid ? Section.First : CurActiveSection + 1);
        float   hint_distance      = SkillSection[(int)medi_section].HintDistance;
        float   tolerance_distance = SkillSection[(int)medi_section].ToleranceDistance;

        if (tolerance_distance > 0)
        {
            float cur_distance = 0;
            if (medi_section == Section.First)
            {
                gesture.IsInvalid = false;
                cur_distance      = touches.GetAverageDistanceFromStart();
            }
            else if (medi_section == Section.Second || medi_section == Section.Third)
            {
                if (Vector2.zero == SkillSection[(int)medi_section].StartPos)
                {
                    if (Vector2.zero == LastInputPos)
                    {
                        LastInputPos = touches.GetAveragePosition();
                        return(false);
                    }
                    Vector2 cp = touches.GetAveragePosition();
                    Vector2 lp = LastInputPos;
                    SkillSection[(int)medi_section].StartPos = CalcSectionStartPos(gesture, cp, lp, medi_section, SkillSection[(int)(medi_section - 1)].EndPos);
                    LastInputPos = cp;
                    ///
                    if (Vector2.zero != WasInputPos)
                    {
                        SkillSection[(int)CurActiveSection].PathLength += Vector2.Distance(WasInputPos, cp);
                    }
                    else
                    {
                        SkillSection[(int)CurActiveSection].PathLength += Vector2.Distance(SkillSection[(int)(medi_section - 1)].EndPos, cp);
                    }
                    WasInputPos = cp;
                    return(false);
                }
                else
                {
                    cur_distance = Vector2.Distance(touches.GetAveragePosition(), SkillSection[(int)medi_section].StartPos);
                }
            }

            if (cur_distance < hint_distance)
            {
                return(false);
            }
            else
            {
                if (!gesture.IsHint)
                {
                    gesture.HintFlag      = HintType.Hint;
                    gesture.StartPosition = touches.GetAverageStartPosition();
                    RaiseHintEvent(gesture);
                    gesture.IsHint = true;
                }
            }
            if (cur_distance < tolerance_distance && EasySectionArg.SkillMode.Normal == SkillSection[(int)medi_section].skillmode)
            {
                return(false);
            }
            else
            {
                if (!gesture.IsActive)
                {
                    gesture.IsActive = true;
                }
            }
        }
        return(true);
    }
Example #19
0
 protected abstract GestureRecognitionState OnRecognize(T gesture, TouchManager.IFingerList touches);