//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// <remarks> /// 接続されているデバイスを認識し、初期化します。XBOX360コントローラを /// 自動的に識別し、初期化の対象から外します。 /// </remarks> /// /// <param name="__hWnd">ウィンドウハンドル</param> public CLegacyInputManager(IntPtr __hWnd) { CLogger.add("レガシ ゲームパッドの初期化をしています..."); bool bFailed = false; DeviceList pads = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly); foreach (DeviceInstance pad in pads) { if (!(Regex.IsMatch(pad.ProductName, "Xbox ?360", RegexOptions.IgnoreCase))) { CLegacyInput device = new CLegacyInput(pad.InstanceGuid, __hWnd); if (device.isDisposed) { bFailed = true; } else { DEVICES.Add(device); } DEVICES.Add(device); } } if (bFailed) { CLogger.add( "いくつかのレガシ ゲームパッドにおいて初期化が失敗しました。\r\n" + "最新のDirectXがインストールされていない可能性があります。\r\n" + "このランタイムは、下記のWebサイトで入手することが出来ます。\r\n\r\n" + "(日本語) http://www.microsoft.com/japan/windows/DirectX/"); } CLogger.add("レガシ ゲームパッドの初期化完了。"); }
//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// /// <param name="index2assert">インデックスをアセット名に変換するためのコールバック用デリゲート。</param> /// <param name="loopSEInterval">効果音を繰り返し再生する際の間隔。</param> /// <param name="fileXGS">XACTサウンドエンジン ファイル名。</param> /// <param name="fileXSB">XACT再生キュー ファイル名。</param> /// <param name="fileXWBSE">XACT波形バンク(効果音) ファイル名。</param> /// <param name="fileXWBBGM">XACT波形バンク(BGM) ファイル名。</param> public CAudio( CallbackIndex2Asset index2assert, ushort loopSEInterval, string fileXGS, string fileXSB, string fileXWBSE, string fileXWBBGM ) { CLogger.add("音響処理の初期化をしています..."); LOOPSE_INTERVAL = loopSEInterval; try { INDEX2ASERT = index2assert; engine = new AudioEngine(fileXGS); waveBankSE = new WaveBank(engine, fileXWBSE); waveBankBGM = new WaveBank(engine, fileXWBBGM, 0, 32767); soundBank = new SoundBank(engine, fileXSB); MICROTHREAD_MANAGER.add(threadPlaySE()); MICROTHREAD_MANAGER.add(threadGC()); } catch (Exception e) { Dispose(); CLogger.add( "音響処理の初期化に失敗しましたので、サウンドを切り離します。" + Environment.NewLine + e.ToString()); CLogger.add( "Microsoft .NET Framework 1.1 がインストールされていない可能性があります。" + Environment.NewLine + "このゲームを実行するためにはMicrosoft .NET Framework 2.0 SP1または" + Environment.NewLine + "3.5 以降が必要ですが、音響処理の実行には 1.1 も別途必要となります。" + Environment.NewLine + "このランタイムは、下記のWebサイトで入手することが出来ます。" + Environment.NewLine + Environment.NewLine + "(日本語) http://www.microsoft.com/japan/msdn/netframework/" + Environment.NewLine + Environment.NewLine + "あるいは、最新のDirectXをインストールされていない可能性があります。" + Environment.NewLine + "このランタイムは、下記のWebサイトで入手することが出来ます。" + Environment.NewLine + Environment.NewLine + "(日本語) http://www.microsoft.com/japan/windows/DirectX/"); } CLogger.add("音響処理の初期化完了。"); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { try { foreach (EffectObject eo in FORCE_PATTERNS.Values) { eo.Dispose(); } FORCE_PATTERNS.Clear(); } catch (Exception e) { CLogger.add("レガシ ゲームパッドの解放に失敗しました。"); CLogger.add(e); } if (device != null) { try { device.Unacquire(); device.Dispose(); } catch (Exception e) { CLogger.add("レガシ ゲームパッドの解放に失敗しました。"); CLogger.add(e); } device = null; } exception = new ObjectDisposedException(GetType().ToString()); }
//* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// /// <param name="hWnd">ウィンドウハンドル</param> /// <param name="buttons">十字キーを除くボタンの数。</param> /// <param name="keyLoopStart">連続入力となるまでのフレーム時間間隔。</param> /// <param name="keyLoopInterval">押しっぱなしで連続入力となるフレーム時間間隔。</param> /// <param name="connected">接続されているXBOX360コントローラ一覧</param> public CInput(IntPtr hWnd, byte buttons, ushort keyLoopStart, ushort keyLoopInterval, PlayerIndex[] connected) { CLogger.add("入力処理・XBOX360コントローラの初期化をしています..."); int nButtons = buttons; int nFullButtons = nButtons + 4; CONNECTED = CMisc.getUnique <PlayerIndex>(connected); if (!isUseXBOX360GamePad) { CLogger.add("XBOX360コントローラを使用しません。"); } #if WINDOWS try { legacyManager = new CLegacyInputManager(hWnd); } catch (FileNotFoundException e) { CLogger.add( "Managed DirectXの初期化に失敗しました。\r\n" + "最新版のDirectX(update June 2008)がインストールされているか再確認してください。"); CLogger.add(e.ToString()); } assignLegacy = new int[nButtons]; if (legacy == null) { CLogger.add("レガシ ゲームパッドを使用しません。"); } #endif assignXBOX360 = new Buttons[nButtons]; assignKeyboard = new Keys[nFullButtons]; BUTTON_STATE = new SButtonState[nFullButtons]; for (int i = 0; i < nFullButtons; i++) { BUTTON_STATE[i] = new SButtonState(keyLoopStart, keyLoopInterval); } MICROTHREAD_MANAGER.add(threadStateReflesh()); CLogger.add("入力処理・XBOX360コントローラの初期化完了。"); }
//* -----------------------------------------------------------------------* /// <summary>メッセージボックスを表示します。</summary> /// /// <param name="strText">表示したいメッセージ文字列</param> public static void show(String strText) { CLogger.add(strText); #if WINDOWS MessageBox.Show(strText, titleBar, MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand); #else CGuideManager.reserveMessage(endMessageBox, strText); #endif }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { CLogger.add("レガシ ゲームパッドの解放をしています..."); foreach (CLegacyInput device in DEVICES) { device.Dispose(); } DEVICES.Clear(); CLogger.add("レガシ ゲームパッドの解放完了。"); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { CLogger.add("音響リソースの解放をしています..."); string strErr = ""; try { if (cueBGM != null) { cueBGM.Dispose(); } } catch (Exception e) { strErr += e.ToString() + "\r\n"; } try { if (soundBank != null) { soundBank.Dispose(); } } catch (Exception e) { strErr += e.ToString() + "\r\n"; } try { if (waveBankBGM != null) { waveBankBGM.Dispose(); } } catch (Exception e) { strErr += e.ToString() + "\r\n"; } try { if (waveBankSE != null) { waveBankSE.Dispose(); } } catch (Exception e) { strErr += e.ToString() + "\r\n"; } try { if (engine != null) { engine.Dispose(); } } catch (Exception e) { strErr += e.ToString() + "\r\n"; } if (strErr.Length > 0) { CLogger.add( "音響処理の解放に失敗しました。" + Environment.NewLine + "完全に終了しないうちにウィンドウを非アクティブにするとこの現象が起きやすいです。" + Environment.NewLine + Environment.NewLine + strErr); } soundBank = null; cueBGM = null; waveBankBGM = null; waveBankSE = null; engine = null; CLogger.add("音響リソースの解放完了。"); }
//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// /// <param name="guid">デバイスのインスタンスGUID</param> /// <param name="hWnd">ウィンドウ ハンドル</param> public CLegacyInput(Guid guid, IntPtr hWnd) { try { device = new Device(guid); CLogger.add("◎◎ レガシ ゲームパッド情報\r\n" + ToString()); CooperativeLevelFlags coLevel = CooperativeLevelFlags.NoWindowsKey | CooperativeLevelFlags.Background; device.SetDataFormat(DeviceDataFormat.Joystick); try { device.Properties.AutoCenter = false; } catch (Exception e) { CLogger.add("ゲームパッドのオート・センター機能のOFFに出来ませんでした。"); CLogger.add("このゲームパッドではフォース フィードバックは使用できません。"); CLogger.add(e); hWnd = IntPtr.Zero; } if (hWnd == IntPtr.Zero) { device.SetCooperativeLevel(null, CooperativeLevelFlags.NonExclusive | coLevel); } else { try { device.SetCooperativeLevel(hWnd, CooperativeLevelFlags.Exclusive | coLevel); } catch (Exception e) { CLogger.add("アプリケーションによるレガシ ゲームパッドの独占に失敗しました。"); CLogger.add("(共有モードで再設定を試みます。このモードではフォースフィードバックの使用は出来ません。)"); CLogger.add(e); hWnd = IntPtr.Zero; device.SetCooperativeLevel(null, CooperativeLevelFlags.NonExclusive | coLevel); } } device.Properties.AxisModeAbsolute = true; int[] anAxis = null; foreach (DeviceObjectInstance doi in device.Objects) { if ((doi.ObjectId & ( int )DeviceObjectTypeFlags.Axis) != 0) { device.Properties.SetRange( ParameterHow.ById, doi.ObjectId, new InputRange(-1000, 1000)); } if ((doi.Flags & ( int )ObjectInstanceFlags.Actuator) != 0) { int[] __anAxis; if (anAxis == null) { anAxis = new int[1]; } else { __anAxis = new int[anAxis.Length + 1]; anAxis.CopyTo(__anAxis, 0); anAxis = __anAxis; } anAxis[anAxis.Length - 1] = doi.Offset; if (anAxis.Length == 2) { break; } } } try { if (hWnd == IntPtr.Zero) { throw new UnsupportedException("共有モードではフォースフィードバックは使用は出来ません。"); } FORCE_PATTERNS.Add(EForcePreset.Square, createEffect(anAxis, 5000, 583333)); FORCE_PATTERNS.Add(EForcePreset.Short, createEffect(anAxis, 5000, 0, 100000)); FORCE_PATTERNS.Add(EForcePreset.Mild, createEffect(anAxis, 5000, 0, 1000000)); FORCE_PATTERNS.Add(EForcePreset.Hard, createEffect(anAxis, 10000, 0, 2000000)); } catch (Exception e) { CLogger.add("フォース フィードバックの作成に失敗しました。"); CLogger.add(e); } device.Acquire(); } catch (Exception e) { CLogger.add("レガシ ゲームパッドの初期化に失敗しました。"); CLogger.add(e); exception = e; Dispose(); } }