using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; namespace Utility { public enum RumbleType { VERYLOW, LOW, MEDIUM, HIGH, VERYHIGH, } public class RumbleManager { #region Subclasses private class Rumble { #region Variables public float left; public float right; public float timer; #endregion #region System public Rumble(float left, float right, float timer) { this.left = left; this.right = right; this.timer = timer; } #endregion } #endregion #region Variables PlayerIndex index; LinkedList rumbleList; #endregion #region System public RumbleManager(PlayerIndex index) { this.index = index; rumbleList = new LinkedList(); } public void Update(GameTime gameTime) { float left = 0.0f; float right = 0.0f; LinkedListNode node; LinkedListNode next = rumbleList.First; for (node = next; next != null; node = next) { Rumble rumble = node.Value; left += rumble.left; right += rumble.right; rumble.timer = rumble.timer - (float)gameTime.ElapsedGameTime.TotalSeconds; next = node.Next; if (rumble.timer < 0) { rumbleList.Remove(node); } } left = Math.Min(1.0f, left); right = Math.Min(1.0f, right); GamePad.SetVibration(index, left, right); } #endregion #region Methods public void AddRumble(float left, float right, float numSeconds) { rumbleList.AddFirst(new Rumble(left, right, numSeconds)); } public void AddRumble(RumbleType type) { switch( type ) { case RumbleType.VERYLOW: rumbleList.AddFirst(new Rumble(.1f, .1f, .1f ) ); break; case RumbleType.LOW: rumbleList.AddFirst( new Rumble( .25f, .25f, .25f ) ); break; case RumbleType.MEDIUM: rumbleList.AddFirst(new Rumble(.5f, .5f, .5f)); break; case RumbleType.HIGH: rumbleList.AddFirst(new Rumble(.75f, .75f, .75f)); break; case RumbleType.VERYHIGH: rumbleList.AddFirst(new Rumble(1.0f, 1.0f, 1.0f)); break; } } #endregion } }