30 using System.Collections.Generic;
32 using Microsoft.Xna.Framework;
33 using Microsoft.Xna.Framework.Input;
36 using XnaGamePad = Microsoft.Xna.Framework.Input.GamePad;
45 internal class Vibration
47 public PlayerIndex player {
get;
private set; }
48 public double leftMotor {
get;
private set; }
49 public double rightMotor {
get;
private set; }
50 public double leftAccel {
get;
set; }
51 public double rightAccel {
get;
set; }
52 public Lifespan lifetime {
get;
set; }
54 public Vibration( PlayerIndex p,
double lmotor,
double rmotor,
double laccel,
double raccel, Lifespan ltime )
64 public void Update(
Time time )
66 if ( lifetime.IsExpired )
81 public static void UpdateAll(
Time time, List<Vibration> vibrations )
83 for (
int i = 0; i < vibrations.Count; i++ )
85 vibrations[i].Update( time );
89 public static void Execute( PlayerIndex p, List<Vibration> vibrations )
95 for (
int i = 0; i < vibrations.Count; i++ )
98 if ( vibrations[i].player == p )
100 lmotort += vibrations[i].leftMotor;
101 rmotort += vibrations[i].rightMotor;
106 lmotort =
AdvanceMath.MathHelper.Clamp( (
float)lmotort, 0, 1 );
107 rmotort =
AdvanceMath.MathHelper.Clamp( (
float)rmotort, 0, 1 );
110 XnaGamePad.SetVibration( p, (
float)lmotort, (
float)rmotort );
114 private List<Vibration> vibrations;
116 private PlayerIndex playerIndex;
121 public bool IsConnected
123 get {
return newState.IsConnected; }
130 public Vector LeftThumbDirection
134 Vector2 v = newState.ThumbSticks.Left;
135 return new Vector( v.X, v.Y );
143 public Vector RightThumbDirection
147 Vector2 v = newState.ThumbSticks.Right;
148 return new Vector( v.X, v.Y );
156 public double LeftTriggerState
158 get {
return newState.Triggers.Left; }
165 public double RightTriggerState
167 get {
return newState.Triggers.Right; }
170 internal GamePad( PlayerIndex player )
174 vibrations =
new List<Vibration>();
175 playerIndex = player;
183 base.Enable( listener => ( listener.Button == button ) );
191 base.Enable( listener => ( listener.AnalogControl == control ) );
199 base.Disable( listener => ( listener.Button == button ) );
207 base.Disable( listener => ( listener.AnalogControl == control ) );
213 return IsButtonTriggered( listener );
215 return base.IsTriggered( listener );
220 if ( listener.Type ==
ListeningType.ControllerAnalogMovement )
221 return IsMovementTriggered( listener, out state );
223 return base.IsAnalogTriggered( listener, out state );
226 private bool IsButtonTriggered(
Listener listener )
228 Buttons b = ToXnaButtons( listener.Button );
230 switch ( listener.State )
235 return oldState.IsButtonDown( b ) && newState.IsButtonUp( b );
237 return oldState.IsButtonUp( b ) && newState.IsButtonDown( b );
239 return newState.IsButtonUp( b );
241 return newState.IsButtonDown( b );
249 switch ( listener.AnalogControl )
254 Vector2 current = newState.ThumbSticks.Left;
255 if ( current.Length() > listener.AnalogTrigger )
257 Vector2 previous = oldState.ThumbSticks.Left;
258 double change = ( current - previous ).Length();
259 analogState =
new AnalogState( 0.0, change,
new Vector( current.X, current.Y ) );
266 Vector2 current = newState.ThumbSticks.Right;
267 if ( current.Length() > listener.AnalogTrigger )
269 Vector2 previous = oldState.ThumbSticks.Right;
270 double change = ( current - previous ).Length();
271 analogState =
new AnalogState( 0.0, change,
new Vector( current.X, current.Y ) );
278 double currentState = newState.Triggers.Left;
279 if ( currentState > listener.AnalogTrigger )
281 double change = currentState - oldState.Triggers.Left;
289 double currentState = newState.Triggers.Right;
290 if ( currentState > listener.AnalogTrigger )
292 double change = currentState - oldState.Triggers.Right;
306 internal override GamePadState GetCurrentState()
318 Buttons buttons = ToXnaButtons( b );
319 bool down = newState.IsButtonDown( buttons );
320 bool lastdown = oldState.IsButtonDown( buttons );
322 if ( lastdown && down )
324 if ( !lastdown && down )
326 if ( lastdown && !down )
332 private static Buttons ToXnaButtons(
Button b )
337 internal override bool IsBufferEmpty()
340 return AnyButtonDown();
343 internal override void Update()
348 Vibration.UpdateAll(
Game.
Time, vibrations );
349 Vibration.Execute( playerIndex, vibrations );
351 for (
int i = 0; i < vibrations.Count; i++ )
353 if ( vibrations[i].lifetime.IsExpired )
355 vibrations.RemoveAt( i );
363 internal override string GetControlText(
Listener listener )
365 switch ( listener.Type )
368 return listener.Button.ToString();
370 return listener.AnalogControl.ToString();
372 Debug.Assert(
false,
"Bad listener type for gamepad" );
381 internal bool AnyButtonDown()
390 bool buttondown =
false;
392 for (
int i = 0; i < buttons.Length; i++ )
394 buttondown |= ( (GamePadState)newState ).IsButtonDown( ToXnaButtons( buttons[i] ) );
408 public void Vibrate(
double leftMotor,
double rightMotor,
double leftAcceleration,
double rightAcceleration,
double time )
410 vibrations.Add(
new Vibration( playerIndex, leftMotor, rightMotor, leftAcceleration, rightAcceleration,
new Lifespan( (
float)time ) ) );
413 #region Listen with no parameters 427 l.AnalogControl = control;
428 l.AnalogTrigger = trigger;
435 #region Listen with 1 parameter 449 l.AnalogControl = control;
450 l.AnalogTrigger = trigger;
457 #region Listen with 2 parameters 471 l.AnalogControl = control;
472 l.AnalogTrigger = trigger;
479 #region Listen with 3 parameters 481 public Listener Listen<T1, T2, T3>(
Button button,
ButtonState state,
Handler<T1, T2, T3> handler,
string helpText, T1 p1, T2 p2, T3 p3 )
490 public Listener ListenAnalog<T1, T2, T3>(
AnalogControl control,
double trigger,
AnalogHandler<T1, T2, T3> handler,
string helpText, T1 p1, T2 p2, T3 p3 )
493 l.AnalogControl = control;
494 l.AnalogTrigger = trigger;
501 #region Listen with 4 parameters 503 public Listener Listen<T1, T2, T3, T4>(
Button button,
ButtonState state,
Handler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4 )
505 Listener l =
new SimpleListener<T1, T2, T3, T4>(
this,
ListeningType.ControllerButton, helpText, handler, p1, p2, p3, p4 );
512 public Listener ListenAnalog<T1, T2, T3, T4>(
AnalogControl control,
double trigger,
AnalogHandler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4 )
514 Listener l =
new AnalogListener<T1, T2, T3, T4>(
this,
ListeningType.ControllerAnalogMovement, helpText, handler, p1, p2, p3, p4 );
515 l.AnalogControl = control;
516 l.AnalogTrigger = trigger;
override bool IsAnalogTriggered(Listener listener, out AnalogState state)
void Enable(AnalogControl control)
Ottaa käytöstä poistetun analogiohjaimen takaisin käyttöön.
void Vibrate(double leftMotor, double rightMotor, double leftAcceleration, double rightAcceleration, double time)
Täristää peliohjainta.
Listener Listen(Button button, ButtonState state, Handler handler, string helpText)
delegate void AnalogHandler< T1, T2 >(AnalogState analogState, T1 p1, T2 p2)
Ohjaintapahtumankäsittelijä kahdella parametrilla.
ButtonState
Napin (minkä tahansa) asento.
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
static readonly Vector Zero
Nollavektori.
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
ButtonState GetButtonState(Button b)
Palauttaa annetun napin tilan (ks. ButtonState).
delegate void Handler< T1, T2, T3 >(T1 p1, T2 p2, T3 p3)
Ohjaintapahtumankäsittelijä kolmella parametrilla.
Peliluokka reaaliaikaisille peleille.
delegate void AnalogHandler(AnalogState analogState)
Ohjaintapahtumankäsittelijä ilman parametreja.
delegate void Handler< T1 >(T1 p1)
Ohjaintapahtumankäsittelijä yhdellä parametrilla.
Parametrit analogisen ohjauksen (hiiren tai ohjaustikun) tapahtumalle.
override bool IsTriggered(Listener listener)
delegate void Handler()
Ohjaintapahtumankäsittelijä ilman parametreja.
Listener ListenAnalog(AnalogControl control, double trigger, AnalogHandler handler, string helpText)
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
delegate void Handler< T1, T2 >(T1 p1, T2 p2)
Ohjaintapahtumankäsittelijä kahdella parametrilla.
delegate void AnalogHandler< T1, T2, T3 >(AnalogState analogState, T1 p1, T2 p2, T3 p3)
Ohjaintapahtumankäsittelijä kolmella parametrilla.
void Enable(Button button)
Ottaa käytöstä poistetun napin takaisin käyttöön.
delegate void Handler< T1, T2, T3, T4 >(T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
void Disable(AnalogControl control)
Poistaa analogiohjaimen (tikku tai nappi) käytöstä.
delegate void AnalogHandler< T1 >(AnalogState analogState, T1 p1)
Ohjaintapahtumankäsittelijä yhdellä parametrilla.
AnalogControl
Analoginen ohjain. Tämä voi olla joko painike, jota voi painaa eri voimakkuuksilla (padiohjaimen liip...
delegate void AnalogHandler< T1, T2, T3, T4 >(AnalogState analogState, T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
Yleinen peliohjainluokka.
void Disable(Button button)
Poistaa napin käytöstä.