//* ────────────-_______________________* //* 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( Converter <ushort, string> 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("音響処理の初期化完了。"); }
//* -----------------------------------------------------------------------* /// <summary> /// <para>オブジェクトが別の状態へ移行する時に呼び出されます。</para> /// <para>このメソッドは、遷移先の<c>setup</c>よりも先に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を終了したオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="nextState">オブジェクトが次に適用する状態。</param> public override void teardown(CEntity entity, CGame privateMembers, IState nextState) { CGame.instance.Window.Title += " " + CGame.version; CLogger.add(CStateCapsXNA.instance.report); CLogger.add("全ての初期化が完了しました。ゲームを起動します..."); aiInitializer.Dispose(); }
//* ────________________________________* //* 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()); }
//* ────────────-_______________________* //* 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="game">ゲーム コンポーネントをアタッチするゲーム。</param> public CGuideWrapper(Game game) { if (instance != null) { throw new InvalidOperationException( string.Format(Resources.CLASS_ERR_SINGLETON, typeof(CGuideWrapper).FullName)); } instance = this; this.game = game; try { gsc = new GamerServicesComponent(game); game.Components.Add(gsc); isAvaliableUseGamerService = true; } catch (Exception e) { CLogger.add(Resources.LIVE_WARN_FAILED); CLogger.add(e); removeGamerServiceComponent(); } #if WINDOWS iconset[(int)MessageBoxIcon.None] = System.Windows.Forms.MessageBoxIcon.None; iconset[(int)MessageBoxIcon.Error] = System.Windows.Forms.MessageBoxIcon.Exclamation; iconset[(int)MessageBoxIcon.Warning] = System.Windows.Forms.MessageBoxIcon.Information; iconset[(int)MessageBoxIcon.Alert] = System.Windows.Forms.MessageBoxIcon.Stop; #endif }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置へ格納します。</summary> /// <remarks> /// XBOX360版では生のXML、Windows版ではDeflate圧縮されたXMLが格納されます。 /// </remarks> /// /// <param name="path">設定データ ファイルへのパス</param> /// <returns>正常に保存できた場合、<c>true</c></returns> private bool save(string path) { bool result = false; if (path != null) { Stream stream = null; try { stream = File.Open(path, FileMode.Create, FileAccess.Write); #if WINDOWS if (m_compress) { stream = new DeflateStream(stream, CompressionMode.Compress); } #endif (new XmlSerializer(typeof(_T), new XmlRootAttribute())).Serialize(stream, data); } catch (Exception e) { CLogger.add(e); } finally { if (stream != null) { stream.Close(); } } } return(result); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を適用されたオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> public override void setup(IEntity entity, object privateMembers) { #if TRACE CLogger.add(sceneName + "シーンを開始します。"); #endif localCoRoutineManager.initialize(); base.setup(entity, privateMembers); }
//* -----------------------------------------------------------------------* /// <summary>メッセージボックスを表示します。</summary> /// /// <param name="strText">表示したいメッセージ文字列</param> public static void show(string strText) { CLogger.add(strText); #if WINDOWS MessageBox.Show(strText, titleBar, MessageBoxButtons.OK, MessageBoxIcon.Hand); #else CStateGuideHelper.instance.reserveMessage(endMessageBox, strText); #endif }
//* -----------------------------------------------------------------------* /// <summary> /// <para>オブジェクトが別の状態へ移行する時に呼び出されます。</para> /// <para>このメソッドは、遷移先の<c>setup</c>よりも先に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を終了したオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="nextState">オブジェクトが次に適用する状態。</param> public override void teardown(CEntity entity, CGame privateMembers, IState nextState) { taskManager.Dispose(); taskManager.nextState = CStateDefault.instance; GC.Collect(); #if TRACE CLogger.add(sceneName + "シーンを終了しました。"); #endif }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { CLogger.add("レガシ ゲームパッドの解放をしています..."); foreach (CLegacyInput device in DEVICES) { device.Dispose(); } DEVICES.Clear(); CLogger.add("レガシ ゲームパッドの解放完了。"); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を適用されたオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> public override void setup(CEntity entity, CGame privateMembers) { CLogger.add(Resources.SCENE_INITIALIZE); entity.allowSameState = true; CGame.instance.Content.RootDirectory = Resources.DIR_CONTENT; CStateCapsXNA xnastate = CStateCapsXNA.instance; xnastate.nextState = CAIInupt.instance; aiInitializer.nextState = xnastate; aiInitializer.changedState += onInitializerChanged; }
//* -----------------------------------------------------------------------* /// <summary> /// <para>オブジェクトが別の状態へ移行する時に呼び出されます。</para> /// <para>このメソッドは、遷移先の<c>setup</c>よりも先に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を終了したオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="nextState">オブジェクトが次に適用する状態。</param> public override void teardown(IEntity entity, object privateMembers, IState nextState) { localCoRoutineManager.Dispose(); phaseManager.reset(); localGameComponentManager.Dispose(); GC.Collect(); base.teardown(entity, privateMembers, nextState); #if TRACE CLogger.add(sceneName + "シーンを終了しました。"); #endif }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置から読み出します。</summary> /// <remarks> /// XBOX360版では生のXML、Windows版ではDeflate圧縮されたXMLから読み出します。 /// </remarks> /// /// <param name="path">設定データ ファイルへのパス</param> private void load(string path) { bool readed = false; if (path != null && File.Exists(path)) { Stream stream = null; try { #if WINDOWS if (m_compress) { stream = new DeflateStream( File.Open(path, FileMode.Open, FileAccess.Read), CompressionMode.Decompress); } else #endif { stream = File.Open(path, FileMode.Open, FileAccess.Read); } data = (_T)((new XmlSerializer(typeof(_T), new XmlRootAttribute())).Deserialize(stream)); if (data != null) { readed = true; CLogger.add(string.Format("{0}を{1}へ読み込みました。", fileName, typeName)); } } catch (Exception e) { CLogger.add("設定データに互換性がありません。解決するためにデータをリセットします。"); CLogger.add(e); } if (stream != null) { stream.Close(); } } else { CLogger.add(string.Format("指定した補助記憶装置に{0}が存在しません。", fileName)); } if (!readed) { resetData(); readed = save(); } CLogger.add(data.ToString()); if (loaded != null) { loaded(this, readed); } }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// アセット名に対応したリソースをコンテンツマネージャ経由で読み出します。 /// </summary> /// /// <param name="bForce">リソース本体が<c>null</c>でなくても強制的に再読み込みするかどうか</param> /// <param name="mgrContent">コンテンツマネージャ</param> public bool load(bool bForce, ContentManager mgrContent) { bool bNull = (resource == null); bool bResult = (asset != null && (bForce || bNull)); if (bResult) { resource = mgrContent.Load <_T>(asset); CLogger.add("コンテンツ " + asset + " を読込しました。"); } return(bResult); }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置から読み出します。</summary> /// <remarks> /// XBOX360版では生のXML、Windows版ではDeflate圧縮されたXMLから読み出します。 /// </remarks> /// /// <param name="path">設定データ ファイルへのパス</param> private void load(string path) { bool readed = false; if (path != null && File.Exists(path)) { Stream stream = null; try { #if WINDOWS if (m_compress) { stream = new DeflateStream( File.Open(path, FileMode.Open, FileAccess.Read), CompressionMode.Decompress); } else #endif { stream = File.Open(path, FileMode.Open, FileAccess.Read); } data = (_T)((new XmlSerializer(typeof(_T), new XmlRootAttribute())).Deserialize(stream)); if (data != null) { readed = true; CLogger.add(string.Format(Resources.IO_INFO_LOADED, fileName, typeName)); } } catch (Exception e) { CLogger.add(Resources.IO_WARN_XML_COLLISION); CLogger.add(e); } if (stream != null) { stream.Close(); } } else { CLogger.add(string.Format(Resources.IO_WARN_NOT_FOUND, fileName)); } if (!readed) { resetData(); readed = save(); } CLogger.add(data.ToString()); if (loaded != null) { loaded(this, readed); } }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置から読み出します。</summary> /// <remarks> /// <para> /// XBOX360版では読み出すデバイスを選択するダイアログが出現します。 /// 一方、Windows版では無条件にカレントフォルダが選択されます。 /// </para> /// <para> /// また、XBOX360版ではアプリケーションとは非同期にダイアログが /// 表示されるので、出現中もアプリケーションは停止せず進行を続けます。 /// </para> /// </remarks> public void load() { CLogger.add("ゲーム 設定データを読込しています..."); #if WINDOWS __load(FILE); #else if ((device == null || !device.IsConnected) && !Guide.IsVisible) { device = null; CGuideManager.reserveSelectDevice(load); } #endif }
//* -----------------------------------------------------------------------* /// <summary>起動前の各種検証をします。</summary> /// /// <returns>起動検証に成功した場合、<c>true</c></returns> public bool validate() { bool bResult = true; try { complete(); string strErrorMessage = errorMessage; CMessageBox.titleBar = title; if (strErrorMessage.Length != 0) { throw new ArgumentOutOfRangeException( strErrorMessage, "初期設定データの一部に不正な値を検出しました。"); } CLogger.outFile = fileIOConfigure.fileLog; CLogger.add(ToString()); using (CValidateEnvironment envValidator = new CValidateEnvironment()) { CLogger.add(envValidator.ToString()); if (!envValidator.AVALIABLE) { throw new PlatformNotSupportedException(envValidator.ERROR_MESSAGE); } } using (CValidateDirectX dxValidator = new CValidateDirectX()) { CLogger.add(dxValidator.ToString()); if (!dxValidator.isAvaliablePS11) { throw new PlatformNotSupportedException("ビデオチップがピクセルシェーダ1.1に対応していません。"); } } #if WINDOWS mutex = new Mutex(false, codename); if (!mutex.WaitOne(0, false)) { throw new ApplicationException("多重起動されました。" + Environment.NewLine + "このアプリケーションは多重起動に対応しておりません。"); } #endif } catch (Exception e) { CMessageBox.show( "起動時の環境検証に失敗しました。非対応のハードウェアまたはOSを使用しているか、" + Environment.NewLine + "あるいはいくつかのランタイム ライブラリが不足している可能性があります。" + Environment.NewLine + Environment.NewLine + e.ToString()); bResult = false; } isAllAvaliable = bResult; return(bResult); }
//* -----------------------------------------------------------------------* /// <summary>ゲームを初期化します。</summary> protected override void Initialize() { try { // ここで初めてゲーマー サービスの初期化をするっぽい base.Initialize(); } catch (GamerServicesNotAvailableException e) { CLogger.add(nineball.Properties.Resources.WARN_GAMER_SERVICE); CLogger.add(e); CGuideWrapper.instance.removeGamerServiceComponent(); } }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>XBOX360ガイドを開始します。</summary> public override bool start() { bool bResult = false; if (!Guide.IsVisible) { try { Guide.BeginShowStorageDeviceSelector(callback, null); bResult = true; } catch (Exception e) { CLogger.add(e); } } return(bResult); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>XBOX360ガイドを開始します。</summary> public override bool start() { bool bResult = false; if (!Guide.IsVisible) { try { Guide.BeginShowMessageBox(PlayerIndex.One, "エラーが発生しました。", MESSAGE, BUTTONS, 0, MessageBoxIcon.Error, callback, null); bResult = true; } catch (Exception e) { CLogger.add(e); } } return(bResult); }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置へ格納します。</summary> /// /// <returns>保存に成功した場合、true</returns> public bool save() { CLogger.add(string.Format("{0}を{1}へ保存しています...。", typeName, fileName)); bool result = false; if (CIOInfo.instance.deviceReady) { result = save(CIOInfo.instance.getPath(fileName)); } CLogger.add(string.Format("{0}を{1}へ保存{2}。", typeName, fileName, result ? "完了" : "に失敗")); if (saved != null) { saved(this, result); } return(result); }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置へ格納します。</summary> /// /// <returns>保存に成功した場合、true</returns> public bool save() { CLogger.add(string.Format(Resources.IO_INFO_SAVING, typeName, fileName)); bool result = false; if (CIOInfo.instance.deviceReady) { result = save(CIOInfo.instance.getPath(fileName)); } CLogger.add(string.Format(Resources.IO_INFO_SAVED, typeName, fileName, result ? Resources.SUCCEEDED : Resources.FAILED)); if (saved != null) { saved(this, result); } return(result); }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置から読み出します。</summary> /// <remarks> /// XBOX360版では生のXML、Windows版ではDeflate圧縮されたXMLから読み出します。 /// </remarks> /// /// <param name="strPath">設定データ ファイルへのパス</param> private void __load(string strPath) { bool bReaded = false; if (strPath != null && File.Exists(strPath)) { Stream stream = null; try { #if WINDOWS stream = new DeflateStream( File.Open(strPath, FileMode.Open, FileAccess.Read), CompressionMode.Decompress); #else stream = File.Open(strPath, FileMode.Open, FileAccess.Read); #endif data = ( _T )((new XmlSerializer(typeof(_T))).Deserialize(stream)); if (data != null) { bReaded = true; } } catch (Exception e) { CLogger.add("設定データに互換性がありません。解決するためにデータをリセットします。"); CLogger.add(e); } if (stream != null) { stream.Close(); } } else { CLogger.add("指定した補助記憶装置に設定データが存在しません。"); } if (!bReaded) { resetData(); save(); } CLogger.add(data.ToString()); if (loaded != null) { loaded(this, EventArgs.Empty); } }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>ゲームを初期化します。</summary> protected override void Initialize() { CStateCapsXNA xnastate = CStateCapsXNA.instance; xnastate.nextState = CStateInitialize.instance; CStarter.scene.nextState = xnastate; #if !DEBUG CLogger.outFile = Resources.FILE_BOOTLOG; CLogger.add(xnastate.report); #endif CStarter.startNineball(this, graphicDeviceManager); inputManager.ButtonsNum = 1; inputManager.inputDevice = EInputDevice.XBOX360 | EInputDevice.Keyboard; inputManager.keyboardAssign = new Keys[] { Keys.Space }; inputManager.xbox360Assign = new Buttons[] { Buttons.A }; inputManager.xbox360AxisAssign = EAxisXBOX360.DPad; new CGameComponent(this, inputManager, true); base.Initialize(); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理をします。</summary> /// /// <param name="gameTime">前フレームからの経過時間</param> protected override void Update(GameTime gameTime) { #if WINDOWS bool bUpdate = IsActive; #else CGuideManager.update(); bool bUpdate = IsActive && !Guide.IsVisible; #endif if (bUpdate) { if (input != null) { input.update(); } if (!sceneManager.update(gameTime)) { CLogger.add("ゲームの終了処理を開始します。"); isExit = true; Content.Unload(); if (input != null) { input.Dispose(); input = null; } if (audio != null) { audio.Dispose(); audio = null; } if (spriteDraw != null) { spriteDraw.Dispose(); spriteDraw = null; } Exit(); } } if (audio != null) { audio.update(); } base.Update(gameTime); }
//* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { #if XBOX360 try { device = null; if (container != null) { container.Dispose(); container = null; } } catch (Exception e) { CLogger.add(string.Format(Resources.GENERAL_ERR_RELEASE, "I/O")); CLogger.add(e); } GC.SuppressFinalize(this); #endif }
//* -----------------------------------------------------------------------* /// <summary>ロード処理</summary> protected override void LoadContent() { CLogger.add("ゲームリソースを読込しています..."); SStarter <_T> .SXACTInitializeData xact = INITIALIZE_DATA.XACTConfigure; if (xact) { audio = new CAudio(xact.index2assert, xact.loopSEInterval, xact.fileXGS, xact.fileXSB, xact.fileXWBSE, xact.fileXWBBGM); } RESOURCE_MANAGER_TEXTURE.reload(true, Content); RESOURCE_MANAGER_FONT.reload(true, Content); if (spriteDraw != null) { spriteDraw.Dispose(); } spriteDraw = new CSprite(GraphicsDevice); GC.Collect(); base.LoadContent(); CLogger.add("ゲームリソースの読込完了。"); }
//* -----------------------------------------------------------------------* /// <summary> /// アンマネージ リソースの解放およびリセットに関連付けられている /// アプリケーション定義のタスクを実行します。 /// </summary> public void Dispose() { #if XBOX360 try { device = null; if (container != null) { container.Dispose(); container = null; } } catch (Exception e) { CLogger.add("ゲーム 設定データI/Oクラスの解放時に例外が発生しました。"); CLogger.add(e); } GC.SuppressFinalize(this); #endif }
//* -----------------------------------------------------------------------* /// <summary>ロード処理</summary> protected override void LoadContent() { CLogger.add("ゲームリソースを読込しています..."); SStarter <_T> .SXACTInitializeData xact = initializeData.XACTConfigure; if (xact) { audio = new CAudio(xact.index2assert, xact.loopSEInterval, xact.fileXGS, xact.fileXSB, xact.fileXWBSE, xact.fileXWBBGM); } textureResourceManager.reload(true, Content); fontResourceManager.reload(true, Content); if (spriteDraw != null) { spriteDraw.Dispose(); } spriteDraw = new CSprite(GraphicsDevice); GC.Collect(); base.LoadContent(); CLogger.add("ゲームリソースの読込完了。"); }
//* -----------------------------------------------------------------------* /// <summary>設定データを補助記憶装置から読み出します。</summary> /// <remarks> /// XBOX360版ではアプリケーションとは非同期にダイアログが /// 表示されるので、出現中もアプリケーションは停止せず進行を続けます。 /// </remarks> public void load() { CLogger.add(string.Format(Resources.IO_INFO_LOADING, fileName, typeName)); CIOInfo info = CIOInfo.instance; if (info.deviceReady) { load(info.getPath(fileName)); } else { if (CGuideWrapper.instance == null) { Guide.BeginShowStorageDeviceSelector(onSelectedDevice, this); } else { CGuideWrapper.instance.BeginShowStorageDeviceSelector(onSelectedDevice, this); } } }