Esempio n. 1
0
    void UpdateFingers()
    {
        touches.Clear();

        // update all fingers
        foreach (Finger finger in fingers)
        {
            Vector2     pos   = Vector2.zero;
            FingerPhase phase = GetPhase(finger);

            if (phase != FingerPhase.None)
            {
                pos = GetPosition(finger);
            }

            finger.Update(phase, pos);

            if (finger.IsDown)
            {
                touches.Add(finger);
            }
        }

        // post-update
        foreach (Finger finger in fingers)
        {
            finger.PostUpdate();
        }
    }
Esempio n. 2
0
        internal void Update(bool newDownState, Vector2 newPos)
        {
            // stop ignoring this touch when the finger is no longer touching the screen
            if (filteredOut && !newDownState)
            {
                filteredOut = false;
            }

            // Apply global touch filter on new touches
            if (!IsDown && newDownState && !FingerGestures.instance.ShouldProcessTouch(index, newPos))
            {
                filteredOut  = true;
                newDownState = false;
            }

            // process touch
            prevPhase = phase;

            if (newDownState)
            {
                // new touch? reset finger state
                if (!WasDown)
                {
                    phase = FingerPhase.Begin;

                    pos          = newPos;
                    startPos     = pos;
                    prevPos      = pos;
                    deltaPos     = Vector2.zero;
                    moved        = false;
                    lastMoveTime = 0;

                    startTime             = Time.time;
                    elapsedTimeStationary = 0;
                }
                else
                {
                    prevPos       = pos;
                    pos           = newPos;
                    distFromStart = Vector3.Distance(startPos, pos);
                    deltaPos      = pos - prevPos;

                    if (deltaPos.sqrMagnitude > 0)
                    {
                        lastMoveTime = Time.time;
                        phase        = FingerPhase.Moving;
                    }
                    else if (!IsMoving || ((Time.time - lastMoveTime) > 0.05f))         // allow for a small time buffer after we stopped moving
                    {
                        phase = FingerPhase.Stationary;
                    }

                    if (IsMoving)
                    {
                        // finger moved at least once
                        moved = true;
                    }
                    else
                    {
                        if (!WasStationary)  // begin a new stationary phase
                        {
                            elapsedTimeStationary = 0;
                        }
                        else
                        {
                            elapsedTimeStationary += Time.deltaTime;
                        }
                    }
                }
            }
            else
            {
                phase = FingerPhase.None;
            }
        }
Esempio n. 3
0
        internal void Update(FingerPhase newPhase, Vector2 newPos)
        {
            // validate phase transitions
            if (phase != newPhase)
            {
                // In low framerate situations, it is possible to miss some input updates and thus
                // skip the "Ended" phase
                if (newPhase == FingerPhase.None && phase != FingerPhase.Ended)
                {
                    Debug.LogWarning("Correcting bad FingerPhase transition (FingerPhase.Ended skipped)");
                    Update(FingerPhase.Ended, PreviousPosition);
                    return;
                }

                // cannot get a Moved or Stationary phase without being down first
                if (!down && (newPhase == FingerPhase.Moved || newPhase == FingerPhase.Stationary))
                {
                    Debug.LogWarning("Correcting bad FingerPhase transition (FingerPhase.Began skipped)");
                    Update(FingerPhase.Began, newPos);
                    return;
                }

                if ((down && newPhase == FingerPhase.Began) || (!down && newPhase == FingerPhase.Ended))
                {
                    Debug.LogWarning("Invalid state FingerPhase transition from " + phase + " to " + newPhase + " - Skipping.");
                    return;
                }
            }
            else // same phase as before
            {
                if (newPhase == FingerPhase.Began || newPhase == FingerPhase.Ended)
                {
                    Debug.LogWarning("Duplicated FingerPhase." + newPhase.ToString() + " - skipping.");
                    return;
                }
            }

            if (newPhase != FingerPhase.None)
            {
                if (newPhase == FingerPhase.Ended)
                {
                    // release
                    down = false;
                }
                else
                {
                    if (newPhase == FingerPhase.Began)
                    {
                        // activate
                        down      = true;
                        startPos  = newPos;
                        prevPos   = newPos;
                        startTime = Time.time;
                    }

                    prevPos  = pos;
                    pos      = newPos;
                    deltaPos = pos - prevPos;
                }
            }

            phase = newPhase;
        }
Esempio n. 4
0
        internal void Update(bool newDownState, UnityEngine.Vector2 newPos)
        {
            if (filteredOut && !newDownState)
            {
                filteredOut = false;
            }

            // 过滤
            if (!IsDown && newDownState && !TouchManager.instance.ShouldProcessTouch(index, newPos))
            {
                filteredOut  = true;
                newDownState = false;
            }

            // 处理触摸
            prevPhase = phase;

            if (newDownState)
            {
                // 新的触摸,重置手指状态
                if (!WasDown)
                {
                    phase = FingerPhase.Begin;

                    pos          = newPos;
                    startPos     = pos;
                    prevPos      = pos;
                    deltaPos     = UnityEngine.Vector2.zero;
                    moved        = false;
                    lastMoveTime = 0;

                    startTime             = UnityEngine.Time.time;
                    elapsedTimeStationary = 0;
                    distFromStart         = 0;
                }
                else
                {
                    prevPos       = pos;
                    pos           = newPos;
                    distFromStart = UnityEngine.Vector3.Distance(startPos, pos);
                    deltaPos      = pos - prevPos;

                    if (deltaPos.sqrMagnitude > 0)
                    {
                        lastMoveTime = UnityEngine.Time.time;
                        phase        = FingerPhase.Moving;
                    }
                    else if (!IsMoving || ((UnityEngine.Time.time - lastMoveTime) > 0.05f))
                    {
                        // 停止移动之后有一点缓冲时间
                        phase = FingerPhase.Stationary;
                    }

                    if (IsMoving)
                    {
                        // 手指至少移动一次
                        moved = true;
                    }
                    else
                    {
                        if (!WasStationary)
                        {
                            // 开始以后新的静止状态
                            elapsedTimeStationary = 0;
                        }
                        else
                        {
                            elapsedTimeStationary += UnityEngine.Time.deltaTime;
                        }
                    }
                }
            }
            else
            {
                phase = FingerPhase.None;
            }
        }