//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> private CLegacyInputCollection() { IntPtr hWnd = Process.GetCurrentProcess().Handle; DeviceList srcList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly); List <CLegacyInput> dstList = new List <CLegacyInput>(srcList.Count); foreach (DeviceInstance item in srcList) { // TODO : なんかもうちょっとまともな区別方法ないの? if (!(Regex.IsMatch(item.ProductName, "Xbox ?360", RegexOptions.IgnoreCase))) { CLegacyInput input = new CLegacyInput(item.InstanceGuid, hWnd); if (input.device != null) { dstList.Add(input); } } } inputList = dstList.AsReadOnly(); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>ボタン入力を検出します。</summary> /// <remarks> /// 注意: このメソッドを呼び出すと、自動的に登録されているクラスに対して /// <c>update()</c>が実行されます。レガシ ゲームパッドが高位入力管理クラスにて /// アクティブの状態でこのメソッドを呼び出すと、高位入力側の判定が /// 1フレーム分欠落します。 /// </remarks> /// /// <param name="gameTime">前フレームが開始してからの経過時間。</param> /// <returns> /// ボタン入力が検出されたデバイスの管理クラス。検出しなかった場合、<c>null</c>。 /// </returns> public CLegacyInput detectInput(GameTime gameTime) { CLegacyInput result = null; int threshold = (int)CInterpolate.lerpClampLinear(0, CLegacyInput.RANGE, this.threshold, 1); for (int i = inputList.Count; --i >= 0 && result == null;) { CLegacyInput input = inputList[i]; input.update(gameTime); JoystickState state = input.nowInputState; if (state.Equals(input.prevInputState) && ( Array.Exists <byte>(state.GetButtons(), b => b != 0) || Math.Abs(state.X) >= threshold || Math.Abs(state.Y) >= threshold || Math.Abs(state.Z) >= threshold)) { result = input; } } return(result); }