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); }
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); }
/// 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); }
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(); } }
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); } } }
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); }
/// 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(); } }
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; }
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); }
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); }
protected override GestureRecognitionState OnRecognize(TapGesture gesture, TouchManager.IFingerList touches) { return(IsMultiTap ? RecognizeMultiTap(gesture, touches) : RecognizeSingleTap(gesture, touches)); }
protected override void OnBegin(TapGesture gesture, TouchManager.IFingerList touches) { gesture.Position = touches.GetAveragePosition(); gesture.StartPosition = gesture.Position; gesture.LastTapTime = Time.time; }
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); }
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); }
protected abstract void OnBegin(T gesture, TouchManager.IFingerList touches);
protected override void OnBegin(LongPressGesture gesture, TouchManager.IFingerList touches) { gesture.Position = touches.GetAveragePosition(); gesture.StartPosition = gesture.Position; }
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; } }
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); }
protected abstract GestureRecognitionState OnRecognize(T gesture, TouchManager.IFingerList touches);