WP XNA 7: Bardzo wygodna wibracja (VibrationSequence)

Temat wibracji był już przeze mnie raz poruszany, ale po bardzo cennym komentarzu nilphilus’a postanowiłem zmienić mojego VibrationProvider‚a. Kolega zasugerował, że zdecydowanie lepszym podejściem będzie zastosowanie fluent API i tak powstał VibrationSequence (nazwa w sumie robocza, ale na razie niech tak pozostanie).

VibrationSequence

Nowa klasa zdecydowanie poprawiła czytelność kodu (przykład użycia poniżej):

var seq = new VibrationSequence();
seq.Vibrate(200).Pause(100).Vibrate(500).Start();

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

Aby „zawibrować” jakąś sekwencje tworzymy instancję VibrationSequence, a następnie wywołujemy ciąg metod Vibrate oraz Pause przekazująć za każdym razem czas trwania danej operacji (w milisekundach). Na koniec wywołujemy metodę Start aby uruchomić wibrację.

Poniżej cała klasa VibrationSequence

public class VibrationSequence
{
	public List<VibrationSequenceItem> Sequence { get; set; }

	public VibrationSequence()
	{
		Sequence = new List<VibrationSequenceItem>();
	}

	public VibrationSequence Vibrate(double time)
	{
		return Vibrate(TimeSpan.FromMilliseconds(time));
	}

	public VibrationSequence Vibrate(TimeSpan time)
	{
		Sequence.Add(new VibrationSequenceItem(time, VibrationSequenceItemType.Vibrate));
		return this;
	}

	public VibrationSequence Pause(double time)
	{
		return Pause(TimeSpan.FromMilliseconds(time));
	}

	public VibrationSequence Pause(TimeSpan time)
	{
		Sequence.Add(new VibrationSequenceItem(time, VibrationSequenceItemType.Pause));
		return this;
	}

	public void Start()
	{
		if(Settings.VibrationEnabled)
			Execute(Sequence.ToArray());
	}

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

	private static void Execute(params VibrationSequenceItem[] sequence)
	{
		var vibrateJob = new ThreadStart(() => ExecuteTask(sequence));
		var vibrateThread = new Thread(vibrateJob);
		vibrateThread.Start();
	}

	private static void ExecuteTask(params VibrationSequenceItem[] sequence)
	{
		var vibrator = VibrateController.Default;

		foreach (var sequenceItem in sequence)
		{
			if (sequenceItem.Type == VibrationSequenceItemType.Vibrate)
				vibrator.Start(sequenceItem.Time);

			Thread.Sleep(sequenceItem.Time);
		}
	}
}

VibrationSequenceItem

Sekwencja składa się z elementów, dlatego prowadziłem dodatkową klasę VibrationSequenceItem. Element zna tylko czas trwania oraz typ (pauza czy vibracja).

public class VibrationSequenceItem
{
	public TimeSpan Time { get; set; }
	public VibrationSequenceItemType Type { get; set; }

	public VibrationSequenceItem(TimeSpan time, VibrationSequenceItemType type)
	{
		Time = time;
		Type = type;
	}
}

VibrationSequenceItemType

Ostatnim ogniwem jest typ wyliczeniowy VibrationSequenceItemType, który potrzebują elementy sekwencji by określić czy dany element oznacza wibrację, czy przerwę w wibracji.

public enum VibrationSequenceItemType
{
	Vibrate,
	Pause
}

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

Advertisements

One thought on “WP XNA 7: Bardzo wygodna wibracja (VibrationSequence)

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

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