public void Update(GameTime gameTime) { #region update ui area _oskShowHide.Update(gameTime.ElapsedGameTime); switch (OskAlignment) { case AlignmentX.Left: _oskOffset = new Vector2(0, Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2)); break; case AlignmentX.Center: _oskOffset = new Vector2(Game.Center.X - _oskLower.Width / 2f, Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2)); break; case AlignmentX.Right: _oskOffset = new Vector2(Game.Width - _oskLower.Width, Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2)); break; } OskArea = new Rectangle((int)_oskOffset.X, (int)_oskOffset.Y, _oskLower.Width, _oskLower.Height); foreach (var b in _oskButtonHits) { b.TimeToLive.Update(gameTime.ElapsedGameTime); } _oskButtonHits.RemoveAll(b => b.TimeToLive.IsComplete); #endregion #region reset states _oskPreviousState.Clear(); _oskPreviousState.AddRange(_oskCurrentState); _oskCurrentState.Clear(); foreach (var k in Keyboard.GetState().GetPressedKeys().Where(k => !_oskCurrentState.Contains(k)) ) { _oskCurrentState.Add(k); } _taps.Clear(); if (Game.UnifiedInput.Action) { _taps.Add(Game.UnifiedInput.Location); } foreach (var t in Game.TouchInput.Touches.Where(t => !_taps.Contains(t))) { _taps.Add(t); } if (_oskVisible) { //bool shift; //var shR = new Rectangle(_oskRects[Keys.LeftShift].X + (int)_oskOffset.X, _oskRects[Keys.LeftShift].Y + (int)_oskOffset.Y, // _oskRects[Keys.LeftShift].Width, _oskRects[Keys.LeftShift].Width); //var shL = new Rectangle(_oskRects[Keys.LeftShift].X + (int)_oskOffset.X, _oskRects[Keys.LeftShift].Y + (int)_oskOffset.Y, // _oskRects[Keys.LeftShift].Width, _oskRects[Keys.LeftShift].Width); //if (_taps.Any(k => shR.Contains(k) || shL.Contains(k))) // { // shift = true; // } foreach (var t in _taps) { var p = new Point((int)t.X, (int)t.Y); foreach (var r in _oskRects) { var or = new Rectangle(r.Value.X + (int)_oskOffset.X, r.Value.Y + (int)_oskOffset.Y, r.Value.Width, r.Value.Height); if (or.Contains(p)) { _oskCurrentState.Add(r.Key); _oskButtonHits.Add(new OskButton { TimeToLive = new Tween(new TimeSpan(0, 0, 0, 1), 1, 0), Rect = new Rectangle(r.Value.X, r.Value.Y, r.Value.Width, r.Value.Height) }); } if ( new Rectangle(_oskExitRect.X + (int)_oskOffset.X, _oskExitRect.Y + (int)_oskOffset.Y, _oskExitRect.Width, _oskExitRect.Width).Contains(p)) { IsOskVisable = false; } } } } #endregion if (TypedKey(Keys.CapsLock)) { _isOskCaps = !_isOskCaps; } Typed.Clear(); foreach (var t in _keys) { if (!TypedKey(t)) { continue; } var l = t.ToString(); if (l.Length == 1) { //if (Released(Keys.LeftShift) && Released(Keys.RightShift)) // l = l.ToLower(); if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) && !_isOskCaps) { l = l.ToUpper(); } else if (_isOskCaps) { l = l.ToUpper(); } else { l = l.ToLower(); } } else { #region Name Numbers if (l.StartsWith(D) & !l.Equals(DecimalStr) & !l.Equals(Divide)) { l = l.Substring(1); if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)) { switch (l) { case Zero: { l = ZeroShift; break; } case One: { l = OneShift; break; } case Two: { l = TwoShift; break; } case Three: { l = ThreeShift; break; } case Four: { l = FourShift; break; } case Five: { l = FiveShift; break; } case Six: { l = SixShift; break; } case Seven: { l = SevenShift; break; } case Eight: { l = EightShift; break; } case Nine: { l = NineShift; break; } } } } #endregion else if (l.StartsWith(NumPad)) { l = l.Substring(6); } else { switch (l) { case OemCommaStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemCommaShift : OemComma; break; } case OemPeriodStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPeriodShift : OemPeriod; break; } case OemQuestionStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemQuestionShift : OemQuestion; break; } case OemSemicolonStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemSemicolonShift : OemSemicolon; break; } case OemQuotesStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemQuotesShift : OemQuotes; break; } case OemOpenBracketsStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemOpenBracketsShift : OemOpenBrackets; break; } case OemCloseBracketsStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemCloseBracketsShift : OemCloseBrackets; break; } case OemPipeStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPipeShift : OemPipe; break; } case OemPlusStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPlusShift : OemPlus; break; } case OemMinusStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemMinusShift : OemMinus; break; } case TabStr: { l = Tab; break; } case MultiplyStr: { l = Multiply; break; } case DivideStr: { l = Divide; break; } case SubtractStr: { l = Subtract; break; } case AddStr: { l = Add; break; } case DecimalStr: { l = Dot; break; } default: { break; } } } } Typed.Add(l); CurrentLine += l; } // Check input for spacebar if (TypedKey(Keys.Space) && CurrentLine != string.Empty && CurrentLine[CurrentLine.Length - 1].ToString() != Space) { CurrentLine += Space; } // Check input for backspace if (TypedKey(Keys.Back) && CurrentLine != string.Empty) { CurrentLine = CurrentLine.Remove(CurrentLine.Length - 1, 1); } // Check input for enter if (TypedKey(Keys.Enter)) { PreviousLine = CurrentLine; CurrentLine = string.Empty; } if (Any()) { Game.UnifiedInput.Hidden = true; } if (_oskCurrentState == _oskPreviousState) { return; } var remove = new List <Procedure <KeyboardInput> >(); foreach (var keyboardListener in _keyboardListeners) { try { keyboardListener(this); } catch { remove.Add(keyboardListener); } } _keyboardListeners.RemoveAll(remove.Contains); }
public void Update() { #region reset states _oskPreviousState.Clear(); _oskPreviousState.AddRange(_oskCurrentState); _oskCurrentState.Clear(); foreach (var k in Enum.GetValues(typeof(Keys))) { if ((Keys)k == Keys.None) { continue; } if (Keyboard.GetState().IsKeyDown((Keys)k) && !_oskCurrentState.Contains((Keys)k)) { _oskCurrentState.Add((Keys)k); } } #endregion Typed.Clear(); foreach (var t in _keys) { if (!TypedKey(t)) { continue; } var l = t.ToString(); if (l == "Tab") { l = "\t"; } else if (l.Length == 1) { //if (Released(Keys.LeftShift) && Released(Keys.RightShift)) // l = l.ToLower(); if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) && IsCapsLock) { l = l.ToUpper(); } else if (IsCapsLock) { l = l.ToUpper(); } else { l = l.ToLower(); } } else { #region Name Numbers if (l.StartsWith(D) & !l.Equals(DecimalStr) & !l.Equals(Divide)) { l = l.Substring(1); if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)) { switch (l) { case Zero: { l = ZeroShift; break; } case One: { l = OneShift; break; } case Two: { l = TwoShift; break; } case Three: { l = ThreeShift; break; } case Four: { l = FourShift; break; } case Five: { l = FiveShift; break; } case Six: { l = SixShift; break; } case Seven: { l = SevenShift; break; } case Eight: { l = EightShift; break; } case Nine: { l = NineShift; break; } } } } #endregion else if (l.StartsWith(NumPad)) { l = l.Substring(6); } else { switch (l) { case OemCommaStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemCommaShift : OemComma; break; } case OemPeriodStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPeriodShift : OemPeriod; break; } case OemQuestionStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemQuestionShift : OemQuestion; break; } case OemSemicolonStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemSemicolonShift : OemSemicolon; break; } case OemQuotesStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemQuotesShift : OemQuotes; break; } case OemOpenBracketsStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemOpenBracketsShift : OemOpenBrackets; break; } case OemCloseBracketsStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemCloseBracketsShift : OemCloseBrackets; break; } case OemPipeStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPipeShift : OemPipe; break; } case OemPlusStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemPlusShift : OemPlus; break; } case OemMinusStr: { l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) ? OemMinusShift : OemMinus; break; } case TabStr: { l = Tab; break; } case MultiplyStr: { l = Multiply; break; } case DivideStr: { l = Divide; break; } case SubtractStr: { l = Subtract; break; } case AddStr: { l = Add; break; } case DecimalStr: { l = Dot; break; } } } } Typed.Add(l); CurrentLine += l; } // Check input for spacebar if (TypedKey(Keys.Space) && CurrentLine != string.Empty && CurrentLine[CurrentLine.Length - 1].ToString() != Space) { CurrentLine += Space; } // Check input for backspace if (TypedKey(Keys.Back) && CurrentLine != string.Empty) { CurrentLine = CurrentLine.Remove(CurrentLine.Length - 1, 1); } // Check input for enter if (TypedKey(Keys.Enter)) { PreviousLine = CurrentLine; CurrentLine = string.Empty; Typed.Add("\n"); } if (_oskCurrentState == _oskPreviousState) { return; } var remove = new List <Action <KeyboardInput> >(); foreach (var keyboardListener in _keyboardListeners) { try { keyboardListener(this); } catch { remove.Add(keyboardListener); } } _keyboardListeners.RemoveAll(remove.Contains); }