2 using System.Collections.Generic;
6 using Microsoft.Xna.Framework;
10 using Microsoft.Devices.Sensors;
11 using XNAaccelerometer = Microsoft.Devices.Sensors.Accelerometer;
117 private double deltaX;
118 private double deltaY;
119 private double deltaZ;
124 private Vector3 memoryState = Vector3.Zero;
136 return new Vector(newState.X, newState.Y);
138 return new Vector(newState.X, newState.Y - newState.Z);
140 return new Vector(newState.X, -newState.Z);
142 return new Vector(newState.X, newState.Y);
152 get {
return newState; }
165 private double _defaultSensitivity;
169 public double DefaultSensitivity {
get {
return _defaultSensitivity; } }
171 private double _defaultAnalogSensitivity;
175 public double DefaultAnalogSensitivity {
get {
return _defaultAnalogSensitivity; } }
180 public Boolean GesturesEnabled {
get;
set; }
185 public int TimeBetweenTaps {
get;
set; }
190 public int TimeBetweenShakes {
get;
set; }
194 private bool accMeterStarted;
195 private XNAaccelerometer accelerometer;
202 accelerometer =
new XNAaccelerometer();
203 accelerometer.ReadingChanged +=
new EventHandler<AccelerometerReadingEventArgs>(accelerometer_ReadingChanged);
206 _defaultSensitivity = 0.2;
207 _defaultAnalogSensitivity = 0.01;
208 GesturesEnabled =
true;
209 TimeBetweenTaps = 300;
210 TimeBetweenShakes = 500;
211 accMeterStarted =
false;
221 if (!accMeterStarted)
223 accelerometer.Start();
224 accMeterStarted =
true;
235 accelerometer.Stop();
236 accMeterStarted =
false;
256 SetDefaultSensitivity(sensitivity,
ListeningType.Accelerometer);
265 SetDefaultSensitivity((
double)sensitivity / 100,
ListeningType.Accelerometer);
274 SetDefaultSensitivity(sensitivity,
ListeningType.ControllerAnalogMovement);
283 SetDefaultSensitivity((
double)sensitivity / 100,
ListeningType.ControllerAnalogMovement);
286 private void SetDefaultSensitivity(
double sens,
ListeningType type)
291 _defaultAnalogSensitivity = sens;
294 _defaultSensitivity = sens;
301 internal override bool IsBufferEmpty()
311 base.Enable( listener => ( listener.Type ==
ListeningType.ControllerAnalogMovement ) );
319 base.Disable( listener => ( listener.Type ==
ListeningType.ControllerAnalogMovement ) );
328 base.Enable( listener => ( listener.AccelerometerDirection == direction ) );
337 base.Disable( listener => ( listener.AccelerometerDirection == direction ) );
340 internal override string GetControlText(
Listener listener)
343 Debug.Assert(
false,
"Bad listener type for accelerometer");
344 return "Accelerometer";
349 private void accelerometer_ReadingChanged(
object sender, AccelerometerReadingEventArgs e)
353 case WP7.DisplayOrientation.Landscape:
354 memoryState.X = -(float)e.Y;
355 memoryState.Y = (
float)e.X;
356 memoryState.Z = (float)e.Z;
358 case WP7.DisplayOrientation.LandscapeLeft:
359 memoryState.X = -(
float)e.Y;
360 memoryState.Y = (float)e.X;
361 memoryState.Z = (
float)e.Z;
363 case WP7.DisplayOrientation.LandscapeRight:
364 memoryState.X = -(float)e.Y;
365 memoryState.Y = -(
float)e.X;
366 memoryState.Z = (float)e.Z;
368 case WP7.DisplayOrientation.Portrait:
369 memoryState.X = (
float)e.X;
370 memoryState.Y = (float)e.Y;
371 memoryState.Z = (
float)e.Z;
374 memoryState.X = (float)e.X;
375 memoryState.Y = (
float)e.Y;
376 memoryState.Z = (float)e.Z;
381 internal override void Update()
383 if ( !accMeterStarted )
391 internal override Vector3 GetCurrentState()
398 deltaY = Math.Abs( newState.Y - oldState.Y );
399 deltaX = Math.Abs( newState.X - oldState.X );
400 deltaZ = Math.Abs( newState.Z - oldState.Z );
405 protected override bool IsTriggered(
Listener listener )
408 return IsAccTriggered( listener, Reading );
410 return base.IsTriggered( listener );
415 if ( listener.Type ==
ListeningType.ControllerAnalogMovement )
416 return IsAccTriggeredAnalog( listener, out state, Reading );
418 return base.IsAnalogTriggered( listener, out state );
423 double sensitivity = l.AccelerometerSensitivity;
424 switch (l.AccelerometerDirection)
427 return Math.Abs(reading.
X) > sensitivity || Math.Abs(reading.
Y) > sensitivity;
429 return reading.
X < -sensitivity;
431 return reading.
X > sensitivity;
433 return reading.
Y > sensitivity;
435 return reading.
Y < -sensitivity;
437 return GestureTrickered(l, 3);
439 return GestureTrickered(l, 1);
447 if (reading.
Magnitude > l.AccelerometerSensitivity)
458 private bool GestureTrickered(
Listener listener,
int minGestureCount)
460 if (!GesturesEnabled)
return false;
461 if (IsSamplingTimeOver(listener) && listener.AccelerometerGestureCount >= minGestureCount)
463 SetLastGesture(listener);
466 else if (TimeToGetSample(listener))
468 bool gestureDetected;
469 switch (listener.AccelerometerDirection)
472 gestureDetected = Shaked(listener.AccelerometerSensitivity);
475 gestureDetected = Tapped(listener.AccelerometerSensitivity);
478 gestureDetected =
false;
481 HandleSampling(gestureDetected, listener);
486 private bool Shaked(
double trigger)
488 double threshold = (trigger + 1) * 2;
489 return deltaX + deltaY > threshold ||
490 deltaX + deltaZ > threshold ||
491 deltaY + deltaZ > threshold;
494 private bool Tapped(
double trigger)
496 double threshold = trigger + 0.2;
498 ( deltaX > threshold ||
499 deltaY > threshold ||
500 deltaZ > threshold );
503 private void HandleSampling(
bool gestureDetected,
Listener listener)
505 if (listener.AccelerometerGestureCount == 0 && gestureDetected)
509 listener.AccelerometerGestureCount += gestureDetected ? 1 : 0;
512 private bool TimeToGetSample(
Listener listener)
514 switch (listener.AccelerometerDirection)
525 private bool IsSamplingTimeOver(
Listener listener)
527 switch (listener.AccelerometerDirection)
530 return Game.
Time.
SinceStartOfGame.TotalMilliseconds > listener.AccelerometerGestureSamplingStartTime + TimeBetweenShakes / 5;
532 return Game.
Time.
SinceStartOfGame.TotalMilliseconds > listener.AccelerometerGestureSamplingStartTime + TimeBetweenTaps / 10;
538 private void SetLastGesture(
Listener listener)
540 listener.AccelerometerGestureCount = 0;
548 #region Listen with no parameters 552 this.Listen(direction, DefaultSensitivity, handler, helpText);
557 this.ListenAnalog(DefaultAnalogSensitivity, handler, helpText);
562 this.Listen(direction, (
int)sensitivity / 100, handler, helpText);
567 this.ListenAnalog((
int)sensitivity / 100, handler, helpText);
574 l.AccelerometerDirection = direction;
575 l.AccelerometerSensitivity = trigger;
585 l.AccelerometerSensitivity = trigger;
593 #region Listen with 1 parameter 597 this.Listen(direction, DefaultSensitivity, handler, helpText, p1);
602 this.ListenAnalog(DefaultAnalogSensitivity, handler, helpText, p1);
607 this.Listen(direction, (
double)sensitivity / 100, handler, helpText, p1);
612 this.ListenAnalog((
double)sensitivity / 100, handler, helpText, p1);
619 l.AccelerometerDirection = direction;
620 l.AccelerometerSensitivity = trigger;
630 l.AccelerometerSensitivity = trigger;
638 #region Listen with 2 parameters 642 this.Listen(direction, DefaultSensitivity, handler, helpText, p1, p2);
647 this.ListenAnalog(DefaultAnalogSensitivity, handler, helpText, p1, p2);
652 this.Listen(direction, (
double)sensitivity / 100, handler, helpText, p1, p2);
657 this.ListenAnalog((
double)sensitivity / 100, handler, helpText, p1, p2);
664 l.AccelerometerDirection = direction;
665 l.AccelerometerSensitivity = trigger;
675 l.AccelerometerSensitivity = trigger;
683 #region Listen with 3 parameters 687 this.Listen(direction, DefaultSensitivity, handler, helpText, p1, p2, p3);
692 this.ListenAnalog(DefaultAnalogSensitivity, handler, helpText, p1, p2, p3);
695 public void Listen<T1, T2, T3>(
AccelerometerDirection direction,
AccelerometerSensitivity sensitivity,
Handler<T1, T2, T3> handler,
string helpText, T1 p1, T2 p2, T3 p3)
697 this.Listen(direction, (
double)sensitivity / 100, handler, helpText, p1, p2, p3);
702 this.ListenAnalog((
double)sensitivity / 100, handler, helpText, p1, p2, p3);
705 public void Listen<T1, T2, T3>(
AccelerometerDirection direction,
double trigger,
Handler<T1, T2, T3> handler,
string helpText, T1 p1, T2 p2, T3 p3)
709 l.AccelerometerDirection = direction;
710 l.AccelerometerSensitivity = trigger;
720 l.AccelerometerSensitivity = trigger;
728 #region Listen with 4 parameters 730 public void Listen<T1, T2, T3, T4>(
AccelerometerDirection direction,
Handler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
732 this.Listen(direction, DefaultSensitivity, handler, helpText, p1, p2, p3, p4);
735 public void ListenAnalog<T1, T2, T3, T4>(
AnalogHandler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
737 this.ListenAnalog(DefaultAnalogSensitivity, handler, helpText, p1, p2, p3, p4);
740 public void Listen<T1, T2, T3, T4>(
AccelerometerDirection direction,
AccelerometerSensitivity sensitivity,
Handler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
742 this.Listen(direction, (
double)sensitivity / 100, handler, helpText, p1, p2, p3, p4);
745 public void ListenAnalog<T1, T2, T3, T4>(
AccelerometerSensitivity sensitivity,
AnalogHandler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
747 this.ListenAnalog((
double)sensitivity / 100, handler, helpText, p1, p2, p3, p4);
750 public void Listen<T1, T2, T3, T4>(
AccelerometerDirection direction,
double trigger,
Handler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
753 Listener l =
new SimpleListener<T1, T2, T3, T4>(
this,
ListeningType.Accelerometer, helpText, handler, p1, p2, p3, p4 );
754 l.AccelerometerDirection = direction;
755 l.AccelerometerSensitivity = trigger;
761 public void ListenAnalog<T1, T2, T3, T4>(
double trigger,
AnalogHandler<T1, T2, T3, T4> handler,
string helpText, T1 p1, T2 p2, T3 p3, T4 p4)
764 Listener l =
new AnalogListener<T1, T2, T3, T4>(
this,
ListeningType.ControllerAnalogMovement, helpText, handler, p1, p2, p3, p4 );
765 l.AccelerometerSensitivity = trigger;
AccelerometerDirection
Suunta/ele joka tunnistetaan.
double Magnitude
Vektorin pituus.
Puhelin on 45-asteen kulmassa.
Kallistus/ele tunnistetaan nopeasti.
void SetDefaultAnalogSensitivity(AccelerometerSensitivity sensitivity)
Asettaa vakioherkkyydeksi (analoginen) annetun arvon.
Puhelin on vaakatasossa näyttö ylöspäin.
override void UpdateState()
DisplayOrientation
Puhelimen näytön asemointi.
void SetDefaultSensitivity(AccelerometerSensitivity sensitivity)
Asettaa vakioherkkyydeksi annetun arvon.
TimeSpan SinceStartOfGame
Aika joka on kulunut pelin alusta.
void Listen(AccelerometerDirection direction, AccelerometerSensitivity sensitivity, Handler handler, string helpText)
void Listen(AccelerometerDirection direction, double trigger, Handler handler, string helpText)
delegate void AnalogHandler< T1, T2 >(AnalogState analogState, T1 p1, T2 p2)
Ohjaintapahtumankäsittelijä kahdella parametrilla.
Puhelimen kiihtyvyysanturi.
void ListenAnalog(AccelerometerSensitivity sensitivity, AnalogHandler handler, string helpText)
delegate void Handler< T1, T2, T3 >(T1 p1, T2 p2, T3 p3)
Ohjaintapahtumankäsittelijä kolmella parametrilla.
Puhelimen "nopea liike"-ele, esim. näpäytys tai tärähdys.
Peliluokka reaaliaikaisille peleille.
void Disable(AccelerometerDirection direction)
Poistaa kiihtyvyyskontrollin k käytöstä.
static void SingleShot(double seconds, Action onTimeout)
Kutsuu aliohjelmaa onTimeout annetun ajan kuluttua. Ajastin luodaan automaattisesti.
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.
void EnableAnalog()
Ottaa käytöstä poistetun kiihtyvyyskontrollin analogikontrollit k takaisin käyttöön.
Kallistus/ele tunnistetaan melko myöhään.
void PauseForDuration(double seconds)
Pysäyttää kiihtyvyysanturin annetuksi ajaksi.
void DisableAnalog()
Poistaa kiihtyvyysanturin analogikontrollit k käytöstä.
AccelerometerSensitivity
Herkkyys jolla kallistus/ele halutaan tunnistaa.
delegate void Handler()
Ohjaintapahtumankäsittelijä ilman parametreja.
Puhelin on pystysuorassa.
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
void SetDefaultSensitivity(double sensitivity)
Asettaa vakioherkkyydeksi annetun arvon.
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(AccelerometerDirection direction)
Ottaa käytöstä poistetun kiihtyvyyskontrollin k takaisin käyttöön.
void ListenAnalog(double trigger, AnalogHandler handler, string helpText)
Kallistus/ele tunnistetaan melko nopeasti.
Kallistus/ele tunnistetaan myöhään.
void Listen(AccelerometerDirection direction, Handler handler, string helpText)
kallistetaan mihin tahansa suuntaan.
delegate void Handler< T1, T2, T3, T4 >(T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
delegate void AnalogHandler< T1 >(AnalogState analogState, T1 p1)
Ohjaintapahtumankäsittelijä yhdellä parametrilla.
delegate void AnalogHandler< T1, T2, T3, T4 >(AnalogState analogState, T1 p1, T2 p2, T3 p3, T4 p4)
Ohjaintapahtumankäsittelijä neljällä parametrilla.
AccelerometerCalibration
Kalibrointi puhelimen kallistuksen nollakohdalle. (Asento missä puhelinta ei ole kallistettu yhtään) ...
void ListenAnalog(AnalogHandler handler, string helpText)
void Stop()
Pysäyttää kiihtyvyysanturin.
void SetDefaultAnalogSensitivity(double sensitivity)
Asettaa vakioherkkyydeksi (analoginen) annetun arvon.
Yleinen peliohjainluokka.