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; } }
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; } }
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; } }
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; }
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(); }