31 using Microsoft.Xna.Framework.Input;
34 using System.Collections.Generic;
44 internal static KeyboardTextBuffer Buffer =
new KeyboardTextBuffer();
59 return ToMaybeChar( k ).HasValue;
72 Enum.TryParse<
Key>( c.ToString(),
true, out result );
85 char? ch = ToMaybeChar( k );
86 if ( !ch.HasValue )
throw new ArgumentException( k.ToString() +
" has no character attached to it." );
90 private static char? ToMaybeChar(
Key k )
92 if ( k ==
Key.Space )
return ' ';
94 string keyStr = k.ToString();
95 if ( keyStr.Length == 1 )
return char.ToLower( keyStr[0] );
96 if ( keyStr.Length == 2 && keyStr[0] ==
'D' )
return keyStr[1];
97 if ( keyStr.Length == 7 && keyStr.StartsWith(
"NumPad" ) )
return keyStr[6];
99 if ( k ==
Key.OemQuotes )
return 'ä';
100 if ( k ==
Key.OemTilde )
return 'ö';
101 if ( k ==
Key.OemPlus || k ==
Key.Add )
return '+';
102 if ( k ==
Key.Subtract )
return '-';
103 if ( k ==
Key.Multiply )
return '*';
104 if ( k ==
Key.Divide )
return '/';
105 if ( k ==
Key.Aring )
return 'Ã¥';
106 if ( k ==
Key.LessOrGreater )
return '<';
111 private static Keys ToXnaKeys(
Key k )
120 return KeyTriggered( listener );
125 List<Key> keys = KeysTriggered( listener.State );
126 return keys.Count > 0;
129 return base.IsTriggered( listener );
132 private bool KeyTriggered(
Listener listener )
134 Keys k = ToXnaKeys( listener.Key );
136 switch ( listener.State )
142 return ( oldState.IsKeyDown( k ) && newState.IsKeyUp( k ) );
145 return ( oldState.IsKeyUp( k ) && newState.IsKeyDown( k ) );
148 return ( newState.IsKeyUp( k ) );
151 return ( newState.IsKeyDown( k ) );
157 internal List<Key> KeysTriggered(
ButtonState state )
159 List<Keys> pressedBefore =
new List<Keys>( oldState.GetPressedKeys() );
160 List<Keys> pressedNow =
new List<Keys>( newState.GetPressedKeys() );
161 List<Key> triggered =
new List<Key>();
166 for (
int i = 0; i < pressedBefore.Count; i++ )
168 if ( !pressedNow.Contains( pressedBefore[i] ) )
169 triggered.Add( (
Key)pressedBefore[i] );
174 for (
int i = 0; i < pressedNow.Count; i++ )
176 if ( !pressedBefore.Contains( pressedNow[i] ) )
177 triggered.Add( (
Key)pressedNow[i] );
182 throw new NotImplementedException(
"Not implemented" );
185 for (
int i = 0; i < pressedNow.Count; i++ )
187 triggered.Add( (
Key)pressedNow[i] );
195 internal override bool IsBufferEmpty()
197 return ( newState.GetPressedKeys().Length == 0 );
205 base.Enable( listener => ( listener.Key == k ) );
213 base.Disable( listener => ( listener.Key == k ) );
216 internal override KeyboardState GetCurrentState()
228 Keys key = ToXnaKeys( k );
229 bool down = newState.IsKeyDown( key );
230 bool lastdown = oldState.IsKeyDown( key );
232 if ( lastdown && down )
234 if ( !lastdown && down )
236 if ( lastdown && !down )
250 return newState.IsKeyDown( Keys.LeftShift ) || newState.IsKeyDown( Keys.RightShift );
261 return newState.IsKeyDown( Keys.LeftControl ) || newState.IsKeyDown( Keys.RightControl );
272 return newState.IsKeyDown( Keys.LeftAlt ) || newState.IsKeyDown( Keys.RightAlt );
275 internal override string GetControlText(
Listener listener )
277 if ( listener.Key ==
Key.Add )
return "NumPad+";
278 if ( listener.Key ==
Key.Subtract )
return "NumPad-";
279 if ( listener.Key ==
Key.Multiply )
return "NumPad*";
280 if ( listener.Key ==
Key.Divide )
return "NumPad/";
281 if ( listener.Key ==
Key.OemQuotes )
return "Ä";
282 if ( listener.Key ==
Key.OemTilde )
return "Ö";
283 if ( listener.Key ==
Key.Left )
return "Left arrow";
284 if ( listener.Key ==
Key.Right )
return "Right arrow";
285 if ( listener.Key ==
Key.Up )
return "Up arrow";
286 if ( listener.Key ==
Key.Down )
return "Down arrow";
288 return listener.Key.ToString();
319 public Listener Listen<T1, T2, T3>(
Key k,
ButtonState state,
Handler<T1, T2, T3> handler, String helpText, T1 p1, T2 p2, T3 p3 )
328 public Listener Listen<T1, T2, T3, T4>(
Key k,
ButtonState state,
Handler<T1, T2, T3, T4> handler, String helpText, T1 p1, T2 p2, T3 p3, T4 p4 )
330 Listener l =
new SimpleListener<T1, T2, T3, T4>(
this,
ListeningType.KeyboardKey, helpText, handler, p1, p2, p3, p4 );
339 public void ListenWSAD(
ButtonState state, Handler<Vector> handler, String helpText )
361 public void ListenWSAD<T1>(
ButtonState state, Handler<Vector, T1> handler, String helpText, T1 p1 )
379 public void ListenWSAD<T1, T2>(
ButtonState state, Handler<Vector, T1, T2> handler, String helpText, T1 p1, T2 p2 )
397 public void ListenWSAD<T1, T2, T3>(
ButtonState state, Handler<Vector, T1, T2, T3> handler, String helpText, T1 p1, T2 p2, T3 p3 )
399 Listen(
Key.W, state, handler, helpText,
Vector.
UnitY, p1, p2, p3 );
400 Listen(
Key.S, state, handler, helpText, -
Vector.
UnitY, p1, p2, p3 );
401 Listen(
Key.A, state, handler, helpText, -
Vector.
UnitX, p1, p2, p3 );
402 Listen(
Key.D, state, handler, helpText,
Vector.
UnitX, p1, p2, p3 );
407 public void ListenArrows(
ButtonState state, Handler<Vector> handler, String helpText )
429 public void ListenArrows<T1>(
ButtonState state, Handler<Vector, T1> handler, String helpText, T1 p1 )
447 public void ListenArrows<T1, T2>(
ButtonState state, Handler<Vector, T1, T2> handler, String helpText, T1 p1, T2 p2 )
450 Listen(
Key.Down, state, handler, helpText, -
Vector.
UnitY, p1, p2 );
451 Listen(
Key.Left, state, handler, helpText, -
Vector.
UnitX, p1, p2 );
452 Listen(
Key.Right, state, handler, helpText,
Vector.
UnitX, p1, p2 );
465 public void ListenArrows<T1, T2, T3>(
ButtonState state, Handler<Vector, T1, T2, T3> handler, String helpText, T1 p1, T2 p2, T3 p3 )
467 Listen(
Key.Up, state, handler, helpText,
Vector.
UnitY, p1, p2, p3 );
468 Listen(
Key.Down, state, handler, helpText, -
Vector.
UnitY, p1, p2, p3 );
469 Listen(
Key.Left, state, handler, helpText, -
Vector.
UnitX, p1, p2, p3 );
470 Listen(
Key.Right, state, handler, helpText,
Vector.
UnitX, p1, p2, p3 );
507 public Listener ListenAll<T1, T2, T3, T4>(
ButtonState state,
MultiKeyHandler<T1, T2, T3, T4> handler, String helpText, T1 p1, T2 p2, T3 p3, T4 p4 )
525 Listener l =
new MultiKeyListener(
this, null, delegate( List<Key> keys ) {
foreach ( var k
in keys ) handler( k, p1 ); } );
533 Listener l =
new MultiKeyListener(
this, null, delegate( List<Key> keys ) {
foreach ( var k
in keys ) handler( k, p1, p2 ); } );
539 public Listener ListenAll<T1, T2, T3>(
ButtonState state, Action<Key, T1, T2, T3> handler, T1 p1, T2 p2, T3 p3 )
541 Listener l =
new MultiKeyListener(
this, null, delegate( List<Key> keys ) {
foreach ( var k
in keys ) handler( k, p1, p2, p3 ); } );
delegate void MultiKeyHandler< T1 >(List< Key > keys, T1 p1)
Ohjaintapahtumankäsittelijä yhdellä parametrilla.
void Disable(Key k)
Poistaa napin k käytöstä.
static readonly Vector UnitX
Vaakasuuntainen yksikkövektori (pituus 1, suunta oikealle).
static Key FromChar(char c)
Palauttaa näppäimen merkille c. Jos merkille ei ole näppäintä, palautetaan Key.None.
delegate void MultiKeyHandler< T1, T2, T3, T4 >(List< Key > keys, T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
ButtonState GetKeyState(Key k)
Palauttaa annetun näppäimen tilan (ks. ButtonState).
static bool IsChar(Key k)
Tarkistaa, liittyykö näppäimeen k merkkiä.
static char ToChar(Key k)
Palauttaa merkin, joka liittyy näppäimeen k. Jos näppäimeen ei liity merkkiä, tapahtuu poikkeus Argum...
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
ButtonState
Napin (minkä tahansa) asento.
delegate void MultiKeyHandler< T1, T2 >(List< Key > keys, T1 p1, T2 p2)
Ohjaintapahtumankäsittelijä kahdella parametrilla.
bool IsShiftDown()
Tarkistaa, onko kumpikaan shift-näppäimistä painettuna.
Näppäimistö peliohjaimena.
delegate void Handler< T1, T2, T3 >(T1 p1, T2 p2, T3 p3)
Ohjaintapahtumankäsittelijä kolmella parametrilla.
void Enable(Key k)
Ottaa käytöstä poistetun napin k takaisin käyttöön.
delegate void Handler< T1 >(T1 p1)
Ohjaintapahtumankäsittelijä yhdellä parametrilla.
Listener ListenAll(ButtonState state, Action< Key > handler)
delegate void MultiKeyHandler(List< Key > keys)
Ohjaintapahtumankäsittelijä ilman parametreja.
Listener Listen(Key k, ButtonState state, Handler handler, String helpText)
delegate void MultiKeyHandler< T1, T2, T3 >(List< Key > keys, T1 p1, T2 p2, T3 p3)
Ohjaintapahtumankäsittelijä kolmella parametrilla.
delegate void Handler()
Ohjaintapahtumankäsittelijä ilman parametreja.
delegate void Handler< T1, T2 >(T1 p1, T2 p2)
Ohjaintapahtumankäsittelijä kahdella parametrilla.
Listener ListenAll(ButtonState state, MultiKeyHandler handler, String helpText)
override bool IsTriggered(Listener listener)
delegate void Handler< T1, T2, T3, T4 >(T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
bool IsCtrlDown()
Tarkistaa, onko kumpikaan ctrl-näppäimistä painettuna.
Yleinen peliohjainluokka.
bool IsAltDown()
Tarkistaa, onko kumpikaan alt-näppäimistä painettuna.