WP XNA 6: Wygodne zarządzanie wibracją (VibrationProvider)

Telefony z Windows Phone wyposażone są w wibrację, z której możemy korzystać zarówno w grach jak i normalnych aplikacjach.

Podstawowe API kontrolera wibracji (VibrateController) pozwana na pojedynczą wibrację, która trwa określony czas. Problem pojawia się gdy chcemy „zagrać” sekwencję wibracji o różnych czasach trwania, z różnymi przerwami. Poniżej przedstawiam klasę VibrationProvider.

Ten wpis jest częścią cyklu o moich przygodach w tworzeniu gier XNA dla Windows Phone.

using Microsoft.Devices;

public class VibrationProvider
{
	public static void Vibrate(TimeSpan duration)
	{
		if (Settings.VibrationEnabled)
		{
			var vc = VibrateController.Default;
			vc.Start(duration);
		}
	}

	public static void Vibrate(params double[] intervals)
	{
		if (Settings.VibrationEnabled)
		{
			var vibrateJob = new ThreadStart(() => _vibrate(intervals));
			var vibrateThread = new Thread(vibrateJob);
			vibrateThread.Start();
		}
	}

	private static void _vibrate(params double[] intervals)
	{
		if (Settings.VibrationEnabled)
		{
			var vc = VibrateController.Default;

			var vibrateOn = false;
			foreach (var interval in intervals)
			{
				var i = TimeSpan.FromSeconds(interval);

				if (!vibrateOn) vc.Start(i);
				Thread.Sleep(i);

				vibrateOn = !vibrateOn;
			}
		}
	}
}

Pierwsza metoda to klasyczna-pojedyncza wibracja, gdzie w parametrze podajemy czas trwania wibracji.

Druga metoda przyjmuje tablicę double. Są to naprzemiennie czas trwania wibracji i przerwa. Czyli nieparzyste wartości to długość wibrowania, parzyste to przerwa w wibracji, a czas podajemy w sekundach.

Metody dodatkowo sprawdzają globalne ustawienia aplikacji (Settings) czy użytkownik ma włączoną czy wyłączoną wibrację (Settings.VibrationEnabled).

Teraz gdy przykładowo gracz traci życie, gramy odpowiedni dźwięk oraz sekwencję wibracyjną:

SoundProvider.Play(SoundProvider.LifeLost);
VibrationProvider.Vibrate(0.2, 0.1, 0.2, 0.1, 0.4);

Powyższy kod powoduje iż telefon zawibruje króko 2x i raz trochę dłużej.

Zachęcam do komentowania. Wszelkie uwagi, pytania, wasze rozwiązania czy znalezione u mnie błędy bardzo mile widziane 🙂

Reklamy

7 thoughts on “WP XNA 6: Wygodne zarządzanie wibracją (VibrationProvider)

  1. Pingback: WP XNA 0: Wstęp | Wojciech Poniatowski [PL]

  2. Klasa w sumie fajna, ale te ‚parzyste/nieparzyste’ to taki średni pomysł ;p

    class VibrationSequence
    {
    private List sequence = new List();
    public VibrationSequence Vibrate(double interval) { sequence.Add( () => vibrate(interval) ); return this; }
    //podobnie pause

    public void Start();
    }

    i użycie
    var seq = new VibrationSequence();
    seq.Vibrate(100).Pause(200).Vibrate(300).Start();

    Jakbyś się uparł to mógłbyś rozwinąć to o np. odpalenie dźwięku po którejś wibracji 😉
    ale głównie chodzi o czytelność bez znajomości jakiejś notki w dokumentacji o tym, że parzyste to pausy 😉

  3. Pingback: dotnetomaniak.pl

  4. Pingback: WP XNA 7: Bardzo wygodna wibracja (VibrationSequence) | Wojciech Poniatowski [PL]

  5. Pingback: Wojciech Poniatowski [PL]

Możliwość komentowania jest wyłączona.