/// <summary> /// Function to enumerate and update the active controllers list. /// </summary> private void UpdateActiveControllers() { IReadOnlyList <IGorgonGamingDeviceInfo> controllers = _driver.EnumerateGamingDevices(true); // Enumerate the active controllers. We'll only take 3 of the 4 available xbox controllers, and only if they have the correct capabilities. _controllers = controllers.Where(item => (item.Capabilities & GamingDeviceCapabilityFlags.SupportsThrottle) == GamingDeviceCapabilityFlags.SupportsThrottle && (item.Capabilities & GamingDeviceCapabilityFlags.SupportsSecondaryXAxis) == GamingDeviceCapabilityFlags.SupportsSecondaryXAxis && (item.Capabilities & GamingDeviceCapabilityFlags.SupportsSecondaryYAxis) == GamingDeviceCapabilityFlags.SupportsSecondaryYAxis && (item.Capabilities & GamingDeviceCapabilityFlags.SupportsVibration) == GamingDeviceCapabilityFlags.SupportsVibration && (item.Capabilities & GamingDeviceCapabilityFlags.SupportsRudder) == GamingDeviceCapabilityFlags.SupportsRudder) .Take(3) .Select(item => _driver.CreateGamingDevice(item)).ToArray(); for (int i = 0; i < _controllers.Count; i++) { if (!_controllers[i].IsConnected) { continue; } // Start at a random spot. _stickPosition[i] = new Point(GorgonRandom.RandomInt32(64, panelDisplay.ClientSize.Width - 64), GorgonRandom.RandomInt32(64, panelDisplay.ClientSize.Height - 64)); // Turn off spray for all controllers. _sprayStates[i] = new SprayCan(_controllers[i], i); } }
/// <summary> /// Function to draw a spray on the screen. /// </summary> /// <param name="device">Controller to use for the spray.</param> /// <param name="index">Index of the controller.</param> private void DrawSpray(IGorgonGamingDevice device, int index) { SprayCan state = _sprayStates[index]; // Update the origin of the spray. state.Origin = _stickPosition[index]; GorgonRange throttleRange = device.Info.AxisInfo[GamingDeviceAxis.RightTrigger].Range; // Find out if we're spraying. if (device.Axis[GamingDeviceAxis.RightTrigger].Value > throttleRange.Minimum) { if ((!state.IsActive) && (!state.NeedReset)) { // Convert the throttle value to a unit value. float throttleUnit = ((float)(device.Axis[GamingDeviceAxis.RightTrigger].Value - throttleRange.Minimum) / throttleRange.Range); // Set up the spray state. state.Position = state.Origin; state.Amount = throttleRange.Range / 2.0f; state.Time = throttleUnit * 10.0f; state.VibrationAmount = device.Info.VibrationMotorRanges[1].Maximum; state.SprayAlpha = (throttleUnit * 239.0f) + 16; state.IsActive = true; } } else { state.IsActive = false; } if (!state.IsActive) { return; } // Update the state spray effect. state.Update(); _surface.DrawPoint(Point.Round(state.Position), state.SprayColor, state.SprayPointSize); }