Пример #1
0
    private void UpdateDirectionKeys()
    {
        if (KeyboardEventHandler == null)
        {
            return;
        }

        var keyUp = false;

        foreach (var direction in DirectionExt.Values)
        {
            var keys = directionKeys[direction];

            if (InputExt.IsAnyKeyDown(keys))
            {
                pressedKeys.Add(direction);
            }
            else if (InputExt.IsAnyKeyUp(keys))
            {
                pressedKeys.Remove(direction);
                keyUp = true;
            }
        }

        if (pressedKeys.Count > 0)
        {
            var     movement = pressedKeys.Last;
            PanArgs args;

            if (movement == previousMovement)
            {
                args = new PanArgs(HandyDetector.Gesture.Press, PanArgs.State.Hold, Vector2.zero, Vector2.zero,
                                   Vector2.zero);
            }
            else
            {
                var delta = movement.Reverse().ToVector2();
                args = new PanArgs(HandyDetector.Gesture.Press, PanArgs.State.Move, Vector2.zero, Vector2.zero,
                                   delta * 10);
            }

            KeyboardEventHandler.OnGesturePan(args);

            previousMovement = pressedKeys.Last;
        }
        else if (keyUp)
        {
            var args = new PanArgs(HandyDetector.Gesture.Press, PanArgs.State.Up, Vector2.zero, Vector2.zero,
                                   Vector2.zero);
            KeyboardEventHandler.OnGesturePan(args);

            previousMovement = null;
        }
    }
Пример #2
0
    public void OnGesturePan(PanArgs args)
    {
        switch (args.state)
        {
        case PanArgs.State.Down:
            joystick.TargetPosition = new Vector2(args.position.x, Screen.height - args.position.y);
            joystick.IsHeld         = true;
            break;

        case PanArgs.State.Move:
            float x = args.delta.x;
            float y = args.delta.y;

            joystick.TargetPosition = new Vector2(args.position.x, Screen.height - args.position.y);
            if (Math.Abs(x - y) >= 3.5f)
            {
                nextMovement = Math.Abs(x) > Math.Abs(y) ? new Vector2(x < 0 ? 1 : -1, 0) : new Vector2(0, y < 0 ? 1 : -1);
                joystick.CurrentDirection = nextMovement;

                playerMoving = true;
            }

            if (nextMovement != Vector2.zero && (canMove || nextMovement != movement) && !Moving && CanMove())
            {
                timer.Reset();
                canSwitch = true;
                canMove   = true;

                playerMoving = true;
            }

            break;

        case PanArgs.State.Hold:
            break;

        case PanArgs.State.Interrupt:
        case PanArgs.State.Up:
            canSwitch       = true;
            canMove         = true;
            playerMoving    = false;
            joystick.IsHeld = false;
            nextMovement    = Vector3.zero;
            break;

        default:
            playerMoving    = false;
            joystick.IsHeld = false;
            nextMovement    = Vector3.zero;
            break;
        }
    }
Пример #3
0
    public void OnGesturePan(PanArgs args)
    {
        switch (args.state)
        {
        case PanArgs.State.Down:
            flingTimer = Time.time;
            isHeld     = true;
            break;

        case PanArgs.State.Move:
            targetX -= args.delta.x;
            break;

        case PanArgs.State.Interrupt:
        case PanArgs.State.Up:
            if (Time.time - flingTimer < flingThreshold)
            {
                if (targetX > Screen.width * 0.2f)
                {
                    targetX = Screen.width;
                }
                else if (targetX < -Screen.width * 0.2f)
                {
                    targetX = -Screen.width;
                }
                else
                {
                    targetX = 0;
                }
            }
            else
            {
                targetX = 0;
            }
            isHeld = false;
            break;
        }
    }
Пример #4
0
        private static void OnPan(object sender, PanArgs args)
        {
            float deltaX, deltaY;

            Clutter.Event evnt = null;

            if (args.IsInterpolated)
            {
                ((PanAction)sender).GetInterpolatedDelta(out deltaX, out deltaY);
            }
            else
            {
                ((GestureAction)sender).GetMotionDelta(0, out deltaX, out deltaY);
                evnt = ((GestureAction)sender).GetLastEvent(0);
            }

            Console.WriteLine(String.Format("[{0}] panning dx:{1:0.##} dy:{2:0.##}",
                                            evnt == null ? "INTERPOLATED" : evnt.Type() == Clutter.EventType.Motion ? "MOTION" :
                                            evnt.Type() == Clutter.EventType.TouchUpdate ? "TOUCH UPDATE" :
                                            "?", deltaX, deltaY));

            args.RetVal = true;
        }
Пример #5
0
    void Start()
    {
        defaultThreshold = moveThreshold;

        Grouping.GroupManager.main.group["Main Menu"].Add(this, new Grouping.GroupDelegator(null, GameMenuEnter, GameMenuExit));
        Grouping.GroupManager.main.group["Level Select"].Add(this, new Grouping.GroupDelegator(null, GameMenuEnter, GameMenuExit));

        _idle = _activeState = new InputState(this);
        InputState deadState  = new InputState(this);
        InputState downState  = new InputState(this);
        InputState panState   = new InputState(this);
        InputState longState  = new InputState(this);
        InputState slideState = new InputState(this);

        deadState.Up        += Reset;
        deadState.Interrupt += Reset;

        _idle.Down += delegate {
            _startPos = _device.pos1;
            _objects  = GetAllObjects(_device.pos1);
            var args1 = new PressArgs(Gesture.Press, _startPos);
            _target   = DoGesture <IPress, PressArgs>(_objects, (t, a) => t.OnGesturePress(a), args1);
            _prevType = Gesture.Press;
            downState.Activate();
        };

        downState.Up += delegate {
            if (downState.time < longTime)
            {
                TapArgs args = new TapArgs(Gesture.Tap, _startPos);
                if (_target != null)
                {
                    ITap tap = _target as ITap;
                    if (IsEnabled(tap as Behaviour))
                    {
                        _prevType = Gesture.Tap;
                        tap.OnGestureTap(args);
                    }
                }
                else
                {
                    _prevType = Gesture.Tap;
                    DoGesture <ITap, TapArgs>(_objects, (t, a) => t.OnGestureTap(a), args);
                }
            }
            Reset();
        };

        downState.Moved += delegate {
            slideState.Activate();
        };

        downState.Hold += delegate {
            if (downState.time > longTime)
            {
                LongPressArgs largs = new LongPressArgs(Gesture.Press, LongPressArgs.State.Down, downState.startPos);
                PanArgs       pArgs = new PanArgs(Gesture.Press, PanArgs.State.Down, downState.startPos, downState.startPos, Vector2.zero);
                IPan          pan;
                ILongPress    lpress;
                if (_target != null)
                {
                    lpress = _target as ILongPress;
                    bool handled = false;
                    if (IsEnabled(lpress as Behaviour))
                    {
                        lpress.OnGestureLongPress(largs);
                        handled   = largs.handled;
                        _prevType = Gesture.LongPress;
                        longState.Activate();
                    }
                    if (!handled)
                    {
                        pan = _target as IPan;
                        if (IsEnabled(pan as Behaviour))
                        {
                            pan.OnGesturePan(pArgs);
                            if (pArgs.handled)
                            {
                                panState.Activate();
                            }
                            else
                            {
                                deadState.Activate();
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in _objects)
                    {
                        bool flag     = false;
                        var  lpresses = item.GetComponents(typeof(ILongPress));
                        foreach (var component in lpresses)
                        {
                            lpress = component as ILongPress;
                            if (IsEnabled(lpress as Behaviour))
                            {
                                lpress.OnGestureLongPress(largs);
                                if (largs.handled)
                                {
                                    _target   = lpress;
                                    _prevType = Gesture.LongPress;
                                    longState.Activate();
                                    flag = true;
                                    break;
                                }
                            }
                        }
                        if (flag)
                        {
                            break;
                        }
                        var pans = item.GetComponents(typeof(IPan));
                        foreach (var component in pans)
                        {
                            pan = component as IPan;
                            pan = component as IPan;
                            if (IsEnabled(pan as Behaviour))
                            {
                                pan.OnGesturePan(pArgs);
                                if (pArgs.handled)
                                {
                                    _target   = pan;
                                    _prevType = Gesture.Pan;
                                    panState.Activate();
                                    flag = true;
                                    break;
                                }
                            }
                        }
                        if (flag)
                        {
                            break;
                        }
                    }
                }
                if (_target == null)
                {
                    deadState.Activate();
                }
            }
        };

        slideState.Enter += delegate {
            FlingArgs sArgs = new FlingArgs(Gesture.Press, FlingArgs.State.Start, slideState.startPos, slideState.startPos);
            PanArgs   pArgs = new PanArgs(Gesture.Press, PanArgs.State.Down, slideState.startPos, slideState.startPos, Vector2.zero);
            IPan      pan;
            IFling    fling;
            if (_target != null)
            {
                fling = _target as IFling;
                bool handled = false;
                if (IsEnabled(fling as Behaviour))
                {
                    fling.OnGestureFling(sArgs);
                    handled = sArgs.handled;
                    if (handled)
                    {
                        //Stay in slide state!
                        _prevType = Gesture.Fling;
                    }
                }
                if (!handled)
                {
                    pan = _target as IPan;
                    if (IsEnabled(pan as Behaviour))
                    {
                        pan.OnGesturePan(pArgs);
                        if (pArgs.handled)
                        {
                            _prevType = Gesture.Pan;
                            //Change state!
                            panState.Activate();
                        }
                    }
                }
            }
            else
            {
                foreach (var item in _objects)
                {
                    var  flings = item.GetComponents(typeof(IFling));
                    bool flag   = false;
                    foreach (var component in flings)
                    {
                        fling = component as IFling;
                        if (IsEnabled(fling as Behaviour))
                        {
                            fling.OnGestureFling(sArgs);
                            if (sArgs.handled)
                            {
                                //Stay in slide state!
                                _target   = fling;
                                _prevType = Gesture.Fling;
                                flag      = true;
                                break;
                            }
                        }
                    }
                    if (flag)
                    {
                        break;
                    }
                    var pans = item.GetComponents(typeof(IPan));
                    foreach (var component in pans)
                    {
                        pan = component as IPan;
                        if (IsEnabled(pan as Behaviour))
                        {
                            pan.OnGesturePan(pArgs);
                            if (pArgs.handled)
                            {
                                //Change state!
                                _target   = pan;
                                _prevType = Gesture.Pan;
                                panState.Activate();
                                flag = true;
                                break;
                            }
                        }
                    }
                    if (flag)
                    {
                        break;
                    }
                }
            }
            if (_target == null)
            {
                deadState.Activate();
            }
        };

        slideState.Up += delegate {
            if (slideState.time <= flingTime)
            {
                FlingArgs sArgs = new FlingArgs(_prevType, FlingArgs.State.End, slideState.startPos, _device.pos1);
                IFling    f     = _target as IFling;
                if (IsEnabled(f as Behaviour))
                {
                    f.OnGestureFling(sArgs);
                }
            }

            Reset();
        };

        slideState.Hold += delegate {
            if (slideState.time > flingTime)
            {
                FlingArgs sArgs = new FlingArgs(Gesture.Press, FlingArgs.State.Interrupt, slideState.startPos, _device.pos1);
                IFling    f     = _target as IFling;
                if (IsEnabled(f as Behaviour))
                {
                    f.OnGestureFling(sArgs);
                }
                IPan p       = _target as IPan;
                bool handled = false;
                if (IsEnabled(p as Behaviour))
                {
                    PanArgs pArgs = new PanArgs(Gesture.Fling, PanArgs.State.Down, _device.pos1, _device.pos1, Vector2.zero);
                    p.OnGesturePan(pArgs);
                    handled = pArgs.handled;
                }
                if (!handled)
                {
                    deadState.Activate();
                }
                else
                {
                    panState.Activate();
                }
            }
        };

        slideState.Interrupt += delegate {
            if (slideState.time <= flingTime)
            {
                FlingArgs sArgs = new FlingArgs(Gesture.Fling, FlingArgs.State.Interrupt, slideState.startPos, _device.pos1);
                IFling    f     = _target as IFling;
                if (f != null)
                {
                    f.OnGestureFling(sArgs);
                }
            }

            Reset();
        };

        longState.Hold += delegate {
            ILongPress lpress = _target as ILongPress;
            if (IsEnabled(lpress as Behaviour))
            {
                LongPressArgs args = new LongPressArgs(Gesture.Press, LongPressArgs.State.Hold, longState.startPos);
                lpress.OnGestureLongPress(args);
            }
        };

        longState.Up += delegate {
            ILongPress lpress = _target as ILongPress;
            if (IsEnabled(lpress as Behaviour))
            {
                LongPressArgs args = new LongPressArgs(Gesture.Press, LongPressArgs.State.Up, longState.startPos);
                lpress.OnGestureLongPress(args);
            }

            Reset();
        };

        longState.Interrupt += delegate {
            ILongPress lpress = _target as ILongPress;
            if (lpress != null)
            {
                LongPressArgs args = new LongPressArgs(Gesture.Press, LongPressArgs.State.Interrupt, longState.startPos);
                lpress.OnGestureLongPress(args);
            }

            Reset();
        };

        longState.Moved += delegate {
            ILongPress lpress = _target as ILongPress;
            if (lpress != null && IsEnabled(lpress as Behaviour))
            {
                LongPressArgs args = new LongPressArgs(Gesture.Press, LongPressArgs.State.Interrupt, longState.startPos);
                lpress.OnGestureLongPress(args);
                if (!args.handled)
                {
                    deadState.Activate();
                }
                else
                {
                    IPan pan = _target as IPan;
                    if (IsEnabled(pan as Behaviour))
                    {
                        PanArgs pArgs = new PanArgs(Gesture.LongPress, PanArgs.State.Down, _device.pos1, _device.pos1, Vector2.zero);
                        pan.OnGesturePan(pArgs);
                        if (pArgs.handled)
                        {
                            panState.Activate();
                        }
                        else
                        {
                            deadState.Activate();
                        }
                    }
                }
            }
        };

        panState.Hold += delegate {
            if (!moved())
            {
                IPan pan = _target as IPan;
                if (IsEnabled(pan as Behaviour))
                {
                    PanArgs pArgs = new PanArgs(Gesture.Pan, PanArgs.State.Hold, panState.startPos, _device.pos1, Vector2.zero);
                    pan.OnGesturePan(pArgs);
                }
            }
        };

        panState.Moved += delegate {
            IPan pan = _target as IPan;
            if (IsEnabled(pan as Behaviour))
            {
                PanArgs pArgs = new PanArgs(Gesture.Pan, PanArgs.State.Move, panState.startPos, _device.pos1, _deltaMove);
                pan.OnGesturePan(pArgs);
            }
        };

        panState.Up += delegate {
            IPan pan = _target as IPan;
            if (IsEnabled(pan as Behaviour))
            {
                PanArgs pArgs = new PanArgs(Gesture.Pan, PanArgs.State.Up, panState.startPos, _device.pos1, Vector2.zero);
                pan.OnGesturePan(pArgs);
            }
            Reset();
        };

        panState.Interrupt += delegate {
            IPan pan = _target as IPan;
            if (pan != null)
            {
                PanArgs pArgs = new PanArgs(Gesture.Pan, PanArgs.State.Interrupt, panState.startPos, _device.pos1, Vector2.zero);
                pan.OnGesturePan(pArgs);
            }

            Reset();
        };
        Reset();
    }