Jypeli  9
The simple game programming library
VirtualKeyboard.cs
Siirry tämän tiedoston dokumentaatioon.
2 using Microsoft.Xna.Framework.Graphics;
3 using Microsoft.Xna.Framework.Input;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
10 using XnaRectangle = Microsoft.Xna.Framework.Rectangle;
12 using XnaMouse = Microsoft.Xna.Framework.Input.Mouse;
13 using XnaTouchPanel = Microsoft.Xna.Framework.Input.Touch.TouchPanel;
14 using XnaButtonState = Microsoft.Xna.Framework.Input.ButtonState;
15 using Microsoft.Xna.Framework.Input.Touch;
16 
18 {
25  class VirtualKeyboard : DrawableGameComponent
26  {
27  internal const int KEY_PADDING = 5;
28 
29  private static readonly VirtualKeyInfo[][] keyLines = new VirtualKeyInfo[][]
30  {
31  new VirtualKeyInfo[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", new VirtualKeyInfo("<=", "", 1.0, VirtualKeyType.Backspace)},
32  new VirtualKeyInfo[] {"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "Å"},
33  new VirtualKeyInfo[] {"A", "S", "D", "F", "G", "H", "J", "K", "L", "Ö", "Ä"},
34  new VirtualKeyInfo[] {"Z", "X", "C", "V", "B", "N", "M", ".", ",", "-", "*"},
35  new VirtualKeyInfo[] {new VirtualKeyInfo("Space", " ", 7), new VirtualKeyInfo("= >", "", 4, VirtualKeyType.Enter)},
36  };
37 
38  public VirtualKeyboard(Game jypeliGame) : base(jypeliGame)
39  {
40  this.game = jypeliGame;
41  }
42 
43  public event EventHandler<VirtualKeyboardInputEventArgs> InputEntered;
44  public event EventHandler EnterPressed;
45  public event EventHandler BackspacePressed;
46 
47  private Game game;
48  private SpriteBatch spriteBatch;
49 
50  private List<VirtualKey> keys;
51 
52  private int Y;
53  private int X = 0;
54  private int Width;
55  private int Height;
56 
57  private Texture2D whitePixelTexture;
58 
60 
61  public override void Initialize()
62  {
63  base.Initialize();
64 
65  keys = new List<VirtualKey>();
66  Width = Game.GraphicsDevice.Viewport.Width;
67  Height = Game.GraphicsDevice.Viewport.Height / 2;
68 
69  Y = Game.GraphicsDevice.Viewport.Height - Height;
70 
71  int highestKeyCount = GetKeyCountOnSingleLine();
72 
73  int baseKeyWidth = (Width - KEY_PADDING * (1 + highestKeyCount)) / highestKeyCount;
74  int keyHeight = ((Height - KEY_PADDING) / keyLines.Length) - KEY_PADDING;
75 
76  // Create keys
77  for (int y = 0; y < keyLines.Length; y++)
78  {
79  int yCoord = KEY_PADDING + y * (keyHeight + KEY_PADDING);
80  int xCoord = KEY_PADDING;
81 
82  for (int x = 0; x < keyLines[y].Length; x++)
83  {
84  VirtualKeyInfo keyInfo = keyLines[y][x];
85 
86  var virtualKey = new VirtualKey(game, keyInfo.DisplayString, keyInfo.Value,
87  xCoord, yCoord, (int)(baseKeyWidth * keyInfo.WidthMultiplier), keyHeight,
88  new Font(60), keyInfo.KeyType);
89  xCoord += virtualKey.Width;
90  xCoord += KEY_PADDING;
91 
92  keys.Add(virtualKey);
93  }
94  }
95 
96  spriteBatch = new SpriteBatch(GraphicsDevice);
97  whitePixelTexture = XnaRenderer.CreateTexture(GraphicsDevice, Color.White, 1, 1);
98  }
99 
101  {
102  int highestKeyCount = int.MinValue;
103 
104  foreach (VirtualKeyInfo[] line in keyLines)
105  {
106  if (highestKeyCount < line.Length)
107  highestKeyCount = line.Length;
108  }
109 
110  return highestKeyCount;
111  }
112 
116  public void Hide()
117  {
118  Visible = false;
119  Enabled = false;
120  }
121 
125  public void Show()
126  {
127  Visible = true;
128  Enabled = true;
129  }
130 
135  private void HandleKeyPress(VirtualKey key)
136  {
137  switch (key.Type)
138  {
139  case VirtualKeyType.Enter:
140  EnterPressed?.Invoke(this, EventArgs.Empty);
141  break;
142  case VirtualKeyType.Backspace:
143  BackspacePressed?.Invoke(this, EventArgs.Empty);
144  break;
145  case VirtualKeyType.Normal:
146  default:
147  InputEntered?.Invoke(this, new VirtualKeyboardInputEventArgs(key.Value));
148  break;
149  }
150 
151  key.Pressed();
152  }
153 
154  public override void Update(GameTime gameTime)
155  {
156  bool checkForKeyPress;
157 
158 #if NETCOREAPP
159  MouseState mouseState = XnaMouse.GetState();
160 
161  checkForKeyPress = prevMouseState.LeftButton == XnaButtonState.Pressed &&
162  mouseState.LeftButton == XnaButtonState.Released;
163 #endif
164 
165 #if ANDROID
166  TouchCollection touchCollection = XnaTouchPanel.GetState();
167  checkForKeyPress = touchCollection.Count > 0 && touchCollection[0].State == TouchLocationState.Released;
168  // TODO multi-touch support?
169  Vector2 touchPos = touchCollection.Count > 0 ? touchCollection[0].Position : Vector2.Zero;
170 #endif
171 
172  foreach (VirtualKey key in keys)
173  {
174  if (checkForKeyPress)
175  {
176 #if WINDOWS
177  if (mouseState.Y > Y + key.Y && mouseState.Y < Y + key.Y + key.Height &&
178  mouseState.X > X + key.X && mouseState.X < X + key.X + key.Width)
179  {
180  HandleKeyPress(key);
181  checkForKeyPress = false;
182  }
183 #endif
184 
185 #if ANDROID
186  if (touchPos.Y > Y + key.Y && touchPos.Y < Y + key.Y + key.Height &&
187  touchPos.X > X + key.X && touchPos.X < X + key.X + key.Width)
188  {
189  HandleKeyPress(key);
190  checkForKeyPress = false;
191  }
192 #endif
193  }
194 
195  key.Update(gameTime);
196  }
197 
198 #if WINDOWS
199  prevMouseState = mouseState;
200 #endif
201 
202  base.Update(gameTime);
203  }
204 
205  public override void Draw(GameTime gameTime)
206  {
207  spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied,
208  null, null, null, null, null);
210  new XnaRectangle(X, Y, Width, Height), XnaColor.White);
211  foreach (VirtualKey key in keys)
212  {
214  }
215  spriteBatch.End();
216 
217  base.Draw(gameTime);
218  }
219  }
220 
224  internal class VirtualKey
225  {
226  private static XnaColor backgroundColorIdle = XnaColor.Gray;
227  private static XnaColor textColorIdle = XnaColor.White;
228  private static XnaColor backgroundColorPressed = XnaColor.White;
229  private static XnaColor textColorPressed = XnaColor.Red;
230 
231  private const float HIGHLIGHT_TIME_ON_PRESS = 0.125f;
232 
233  public VirtualKey(XnaGame game, string text)
234  {
235  UIText = text;
236  }
237 
238  public VirtualKey(XnaGame game, string text, string value,
239  int x, int y, int width, int height, Font font, VirtualKeyType type) : this(game, text)
240  {
241  X = x;
242  Y = y;
243  Width = width;
244  Height = height;
245  Font = font;
246  Value = value;
247  Type = type;
248  }
249 
253  public VirtualKeyType Type { get; private set; }
254 
258  public string Value { get; private set; }
259 
263  public string UIText { get; private set; }
264 
265  public int X { get; set; }
266  public int Y { get; set; }
267  public int Width { get; set; }
268  public int Height { get; set; }
269  public Font Font { get; set; }
270 
271  private double highlightTime;
272 
275 
279  public void Pressed()
280  {
284  }
285 
290  public void Update(GameTime gameTime)
291  {
292  if (highlightTime > 0.0)
293  {
294  highlightTime -= gameTime.ElapsedGameTime.TotalSeconds;
295  if (highlightTime < 0.0)
296  {
299  }
300  }
301  }
302 
306  public void Draw(Texture2D whitePixelTexture, SpriteBatch sb, int xOffset, int yOffset)
307  {
308  var drawRectangle = new XnaRectangle(xOffset + X, yOffset + Y, Width, Height);
309  XnaRenderer.FillRectangle(whitePixelTexture, sb, drawRectangle, backgroundColor);
310  XnaRenderer.DrawRectangle(whitePixelTexture, sb, drawRectangle, 2, new XnaColor(196, 196, 196, 255));
312  new Vector2(xOffset + X + VirtualKeyboard.KEY_PADDING, yOffset + Y + VirtualKeyboard.KEY_PADDING), textColor);
313  }
314  }
315 
319  internal static class XnaRenderer
320  {
321  public static void FillRectangle(Texture2D whitePixelTexture, SpriteBatch sb, XnaRectangle rect, XnaColor color)
322  {
323  sb.Draw(whitePixelTexture, rect, color);
324  }
325 
326  public static Texture2D CreateTexture(GraphicsDevice gd, Color color, int width, int height)
327  {
328  Texture2D texture = new Texture2D(gd, width, height, false, SurfaceFormat.Color);
329 
330  Color[] colorArray = new Color[width * height];
331 
332  for (int i = 0; i < colorArray.Length; i++)
333  colorArray[i] = color;
334 
335  texture.SetData(colorArray);
336 
337  return texture;
338  }
339 
340  public static void DrawStringWithShadow(SpriteBatch sb, string text, SpriteFont font, Vector2 location, XnaColor color)
341  {
342  sb.DrawString(font, text, new Vector2(location.X + 1f, location.Y + 1f), XnaColor.Black);
343  sb.DrawString(font, text, location, color);
344  }
345 
346  public static void DrawRectangle(Texture2D whitePixelTexture, SpriteBatch sb, XnaRectangle rect, int thickness, XnaColor color)
347  {
348  sb.Draw(whitePixelTexture, new XnaRectangle(rect.X, rect.Y, rect.Width, thickness), color);
349  sb.Draw(whitePixelTexture, new XnaRectangle(rect.X, rect.Y + thickness, thickness, rect.Height - thickness), color);
350  sb.Draw(whitePixelTexture, new XnaRectangle(rect.X + rect.Width - thickness, rect.Y, thickness, rect.Height), color);
351  sb.Draw(whitePixelTexture, new XnaRectangle(rect.X, rect.Y + rect.Height - thickness, rect.Width, thickness), color);
352  }
353  }
354 
355 
359  internal enum VirtualKeyType
360  {
364  Normal,
365 
369  Enter,
370 
374  Backspace
375  }
376 
377 
381  internal struct VirtualKeyInfo
382  {
383  public VirtualKeyInfo(string displayString, string value, double widthMultiplier = 1.0, VirtualKeyType keyType = VirtualKeyType.Normal) : this()
384  {
385  DisplayString = displayString;
386  WidthMultiplier = widthMultiplier;
387  KeyType = keyType;
388  Value = value;
389  }
390 
391  public static implicit operator VirtualKeyInfo(char c)
392  {
393  return new VirtualKeyInfo(c.ToString(), c.ToString());
394  }
395 
396  public static implicit operator VirtualKeyInfo(string s)
397  {
398  return new VirtualKeyInfo(s, s);
399  }
400 
401  public string DisplayString { get; private set; }
402  public double WidthMultiplier { get; private set; }
403  public VirtualKeyType KeyType { get; private set; }
404  public string Value { get; private set; }
405  }
406 
407 
411  internal class VirtualKeyboardInputEventArgs : EventArgs
412  {
413  public VirtualKeyboardInputEventArgs(string text)
414  {
415  Text = text;
416  }
417 
421  public string Text { get; private set; }
422  }
423 }
Jypeli.Controls.Keyboard.VirtualKey.backgroundColorIdle
static XnaColor backgroundColorIdle
Definition: VirtualKeyboard.cs:226
Jypeli.Controls.Keyboard.VirtualKey.Y
int Y
Definition: VirtualKeyboard.cs:266
Jypeli.Controls.Keyboard.VirtualKeyboard.EnterPressed
EventHandler EnterPressed
Definition: VirtualKeyboard.cs:44
Jypeli.Controls.Keyboard.XnaRenderer.FillRectangle
static void FillRectangle(Texture2D whitePixelTexture, SpriteBatch sb, XnaRectangle rect, XnaColor color)
Definition: VirtualKeyboard.cs:321
Jypeli.Controls.Keyboard.VirtualKeyboard.Hide
void Hide()
Piilottaa virtuaalisen näppäimistön.
Definition: VirtualKeyboard.cs:116
Microsoft.Xna
Definition: JypeliContentManager.cs:6
Jypeli.Controls.Keyboard.VirtualKeyInfo.VirtualKeyInfo
VirtualKeyInfo(string displayString, string value, double widthMultiplier=1.0, VirtualKeyType keyType=VirtualKeyType.Normal)
Definition: VirtualKeyboard.cs:383
Jypeli.Controls.Keyboard.VirtualKeyInfo.DisplayString
string DisplayString
Definition: VirtualKeyboard.cs:401
XnaButtonState
Microsoft.Xna.Framework.Input.ButtonState XnaButtonState
Definition: VirtualKeyboard.cs:14
Jypeli.Controls.Keyboard.VirtualKey.backgroundColor
XnaColor backgroundColor
Definition: VirtualKeyboard.cs:273
Jypeli.Controls.Keyboard.VirtualKeyboard.keyLines
static readonly VirtualKeyInfo[][] keyLines
Definition: VirtualKeyboard.cs:29
Jypeli.Controls.Keyboard.VirtualKeyboard.HandleKeyPress
void HandleKeyPress(VirtualKey key)
Käsittelee näppäimen painalluksen.
Definition: VirtualKeyboard.cs:135
Jypeli.Controls.Keyboard.VirtualKeyboardInputEventArgs.Text
string Text
Syötetty teksti.
Definition: VirtualKeyboard.cs:421
Jypeli.Controls.Keyboard.XnaRenderer
Sisältää näppäimistön piitämiseen käytettyjä metodeja.
Definition: VirtualKeyboard.cs:320
Jypeli.Controls.Keyboard.VirtualKeyInfo.WidthMultiplier
double WidthMultiplier
Definition: VirtualKeyboard.cs:402
Jypeli.Controls.Keyboard.VirtualKeyboard
Virtuaalinen näppäimistö. Tarkoitettu ensisijaisesti mobiilialustoille, joiden oman virtuaalinäppäimi...
Definition: VirtualKeyboard.cs:26
Jypeli.Controls.Keyboard.VirtualKeyInfo.KeyType
VirtualKeyType KeyType
Definition: VirtualKeyboard.cs:403
Jypeli.Controls.Keyboard.VirtualKey.textColorIdle
static XnaColor textColorIdle
Definition: VirtualKeyboard.cs:227
Jypeli.Controls.Keyboard.XnaRenderer.DrawStringWithShadow
static void DrawStringWithShadow(SpriteBatch sb, string text, SpriteFont font, Vector2 location, XnaColor color)
Definition: VirtualKeyboard.cs:340
Jypeli.Controls.Keyboard.VirtualKey.Draw
void Draw(Texture2D whitePixelTexture, SpriteBatch sb, int xOffset, int yOffset)
Piirtää näppäimen.
Definition: VirtualKeyboard.cs:306
Jypeli.Controls.Keyboard.VirtualKeyType.Normal
@ Normal
Näppäin syöttää tekstiä kuin "tavallinen" näppäin.
Microsoft
Definition: JypeliContentManager.cs:6
Microsoft.Xna.Framework
Definition: JypeliContentManager.cs:6
XnaGame
Microsoft.Xna.Framework.Game XnaGame
Definition: VirtualKeyboard.cs:9
Jypeli.Controls.Keyboard.VirtualKeyType
VirtualKeyType
Näppäimen tyyppi.
Definition: VirtualKeyboard.cs:360
Jypeli.Controls.Keyboard.VirtualKeyboard.spriteBatch
SpriteBatch spriteBatch
Definition: VirtualKeyboard.cs:48
Jypeli.Controls.Keyboard.VirtualKey.Type
VirtualKeyType Type
Näppäimen tyyppi.
Definition: VirtualKeyboard.cs:253
Jypeli.Font.XnaFont
SpriteFont XnaFont
Definition: Font.cs:90
Jypeli.Controls.Keyboard.VirtualKeyboard.X
int X
Definition: VirtualKeyboard.cs:53
Jypeli.Controls.Keyboard.VirtualKeyboard.whitePixelTexture
Texture2D whitePixelTexture
Definition: VirtualKeyboard.cs:57
Jypeli.XnaTouchPanel
Microsoft.Xna.Framework.Input.Touch.TouchPanel XnaTouchPanel
Definition: TouchPanel.cs:8
Jypeli.Controls.Keyboard.VirtualKey.Value
string Value
Teksti, joka syötetään näppäintä painettaessa.
Definition: VirtualKeyboard.cs:258
Jypeli.Controls.Keyboard.XnaRenderer.DrawRectangle
static void DrawRectangle(Texture2D whitePixelTexture, SpriteBatch sb, XnaRectangle rect, int thickness, XnaColor color)
Definition: VirtualKeyboard.cs:346
Jypeli.Controls.Keyboard.VirtualKeyboard.GetKeyCountOnSingleLine
int GetKeyCountOnSingleLine()
Definition: VirtualKeyboard.cs:100
Jypeli.Controls.Keyboard.VirtualKey
Yksittäinen näppäin virtuaalisessa näppäimistössä.
Definition: VirtualKeyboard.cs:225
Jypeli.XnaButtonState
Microsoft.Xna.Framework.Input.ButtonState XnaButtonState
Definition: Mouse.cs:40
XnaColor
Microsoft.Xna.Framework.Color XnaColor
Definition: VirtualKeyboard.cs:11
Jypeli.XnaMouse
Microsoft.Xna.Framework.Input.Mouse XnaMouse
Definition: Mouse.cs:38
Jypeli.Controls.Keyboard.VirtualKeyboard.Show
void Show()
Avaa virtuaalisen näppäimistön.
Definition: VirtualKeyboard.cs:125
Jypeli.Controls.Keyboard.VirtualKeyboard.Update
override void Update(GameTime gameTime)
Definition: VirtualKeyboard.cs:154
Jypeli.Controls.Keyboard.VirtualKey.Update
void Update(GameTime gameTime)
Päivittää näppäimen tilaa.
Definition: VirtualKeyboard.cs:290
Jypeli.Controls.Keyboard.VirtualKey.Pressed
void Pressed()
Kutsutaan, kun näppäintä on painettu.
Definition: VirtualKeyboard.cs:279
Jypeli.Controls.Keyboard.VirtualKeyInfo.Value
string Value
Definition: VirtualKeyboard.cs:404
Jypeli.Controls.Keyboard.VirtualKey.backgroundColorPressed
static XnaColor backgroundColorPressed
Definition: VirtualKeyboard.cs:228
Jypeli.Controls.Keyboard.VirtualKeyboard.keys
List< VirtualKey > keys
Definition: VirtualKeyboard.cs:50
Jypeli.Controls.Keyboard.VirtualKey.UIText
string UIText
Käyttöliittymässä näppäimen kohdalla näytetty teksti.
Definition: VirtualKeyboard.cs:263
Jypeli.Controls.Keyboard.VirtualKey.textColorPressed
static XnaColor textColorPressed
Definition: VirtualKeyboard.cs:229
Jypeli.Controls.Keyboard.VirtualKey.Width
int Width
Definition: VirtualKeyboard.cs:267
Jypeli.MouseState
Microsoft.Xna.Framework.Input.MouseState MouseState
Definition: Mouse.cs:39
Jypeli.Controls.Keyboard.VirtualKeyboard.InputEntered
EventHandler< VirtualKeyboardInputEventArgs > InputEntered
Definition: VirtualKeyboard.cs:43
Jypeli.Controls.Keyboard.VirtualKeyboard.Initialize
override void Initialize()
Definition: VirtualKeyboard.cs:61
Jypeli.Controls.Keyboard.VirtualKeyboard.game
Game game
Definition: VirtualKeyboard.cs:47
Jypeli.Controls.Keyboard.VirtualKeyboard.Width
int Width
Definition: VirtualKeyboard.cs:54
Jypeli.Color
Väri.
Definition: Color.cs:13
Jypeli.Controls.Keyboard.VirtualKeyboard.Draw
override void Draw(GameTime gameTime)
Definition: VirtualKeyboard.cs:205
Jypeli.Controls.Keyboard.VirtualKeyboardInputEventArgs
Tavallisen näppäimen (ei Enter tai Backspace) painalluksesta syntyvän tapahtuman tiedot.
Definition: VirtualKeyboard.cs:412
Jypeli.Controls.Keyboard.VirtualKey.X
int X
Definition: VirtualKeyboard.cs:265
Jypeli.Controls.Keyboard.VirtualKeyboard.Y
int Y
Definition: VirtualKeyboard.cs:52
Jypeli.Controls.Keyboard.VirtualKeyboardInputEventArgs.VirtualKeyboardInputEventArgs
VirtualKeyboardInputEventArgs(string text)
Definition: VirtualKeyboard.cs:413
Jypeli.Controls.Keyboard.VirtualKeyboard.VirtualKeyboard
VirtualKeyboard(Game jypeliGame)
Definition: VirtualKeyboard.cs:38
Jypeli.Controls.Keyboard.VirtualKey.VirtualKey
VirtualKey(XnaGame game, string text, string value, int x, int y, int width, int height, Font font, VirtualKeyType type)
Definition: VirtualKeyboard.cs:238
System
Definition: CFFauxAttributes.cs:29
XnaTouchPanel
Microsoft.Xna.Framework.Input.Touch.TouchPanel XnaTouchPanel
Definition: VirtualKeyboard.cs:13
Jypeli.Controls.Keyboard.VirtualKey.Height
int Height
Definition: VirtualKeyboard.cs:268
Jypeli.Controls.Keyboard.VirtualKey.VirtualKey
VirtualKey(XnaGame game, string text)
Definition: VirtualKeyboard.cs:233
Jypeli.Controls.Keyboard.XnaRenderer.CreateTexture
static Texture2D CreateTexture(GraphicsDevice gd, Color color, int width, int height)
Definition: VirtualKeyboard.cs:326
Jypeli.Font
Fontti.
Definition: Font.cs:23
Jypeli.Game.GraphicsDevice
static new GraphicsDevice GraphicsDevice
XNA:n grafiikkakortti.
Definition: Graphics.cs:49
Jypeli.Controls.Keyboard
Definition: VirtualKeyboard.cs:18
Jypeli.Controls.Keyboard.VirtualKey.HIGHLIGHT_TIME_ON_PRESS
const float HIGHLIGHT_TIME_ON_PRESS
Definition: VirtualKeyboard.cs:231
Jypeli.Color.White
static readonly Color White
Valkoinen.
Definition: Color.cs:903
Jypeli.Controls.Keyboard.VirtualKeyboard.Height
int Height
Definition: VirtualKeyboard.cs:55
Jypeli.Controls.Keyboard.VirtualKey.textColor
XnaColor textColor
Definition: VirtualKeyboard.cs:274
Jypeli.Game
Definition: Content.cs:46
Jypeli.Controls.Keyboard.VirtualKeyboard.BackspacePressed
EventHandler BackspacePressed
Definition: VirtualKeyboard.cs:45
Jypeli.Controls.Keyboard.VirtualKeyboard.prevMouseState
MouseState prevMouseState
Definition: VirtualKeyboard.cs:59
Jypeli.Controls.Keyboard.VirtualKeyboard.KEY_PADDING
const int KEY_PADDING
Definition: VirtualKeyboard.cs:27
XnaMouse
Microsoft.Xna.Framework.Input.Mouse XnaMouse
Definition: VirtualKeyboard.cs:12
XnaRectangle
Microsoft.Xna.Framework.Rectangle XnaRectangle
Definition: VirtualKeyboard.cs:10
Jypeli.Controls.Keyboard.VirtualKeyInfo
Tietue, joka sisältää olennaiset tiedot näppäimestä sen luontia varten.
Definition: VirtualKeyboard.cs:382
Jypeli.Controls.Keyboard.VirtualKey.highlightTime
double highlightTime
Definition: VirtualKeyboard.cs:271