こびとスタジオさんのブログで「ストレージ機器を選択するブレードが開けないバグ」についての情報があったのですが、私も Tips 用にストレージのプログラムを作っていたまま、Xbox 360 で一度もテストしていなかったので(^^;)ちょっと試してみました。
とりあえず実装が簡単そうな「StorageDevice.ShowStorageDeviceGuide」メソッドを使ってみました。
protected override void Update(GameTime gameTime)
{
KeyboardState keyboardState = Keyboard.GetState();
GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);
if (gamePadState.Buttons.Back == ButtonState.Pressed)
{
this.Exit();
}
if (gamePadState.Buttons.A == ButtonState.Pressed ||
keyboardState.IsKeyDown(Keys.A))
{
StorageDevice storageDevice = StorageDevice.ShowStorageDeviceGuide();
}
base.Update(gameTime);
}
Xbox360 で実行すると「StorageDevice.ShowStorageDeviceGuide」メソッドを呼び出したところでパッタリ止まってしまいますね(^^;)。
一応メインスレッドでフレームのカウントを取っているのですが、こちらもカウントが止まっているのでメインスレッドもダメっぽいです。もちろんコントローラーの操作も受け付けません。
仕方ないので Visual C# のデバッグを終了させるとプログラムが強制終了する瞬間、ブレードが一瞬だけ見えるんですよね。なんか裏に隠れちゃっているのかな?
こんな感じにカウントを取っている
画面が固まった後、プログラム強制終了間際にブレードが表示される。原因不明…
で、今度は非同期でブレードを表示するプログラムで試してみました。
private IAsyncResult asyncResult = null;
protected override void Update(GameTime gameTime)
{
KeyboardState keyboardState = Keyboard.GetState();
GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);
if (gamePadState.Buttons.Back == ButtonState.Pressed)
{
this.Exit();
}
if (this.asyncResult == null &&
gamePadState.Buttons.A == ButtonState.Pressed ||
keyboardState.IsKeyDown(Keys.A))
{
this.asyncResult = StorageDevice.BeginShowStorageDeviceGuide(null, null);
}
if (this.asyncResult != null && this.asyncResult.IsCompleted)
{
StorageDevice device = StorageDevice.EndShowStorageDeviceGuide(this.asyncResult);
this.asyncResult = null;
}
base.Update(gameTime);
}
こびとスタジオさんのとは違ってコールバックメソッドは使っていません。これを実行すると今度は正常にストレージの選択ができるみたいです。ただ、ストレージの選択で、「戻る」ボタンを押しても StorageDevice が正常に取得できるのは少し気になりますが(^^;)。
あと、2番目のプログラムの場合、ブレードを開いている間でもメインのスレッドは非同期で処理されているので(フレームカウントで確認済み)なんらかの対処はしないといけないみたいですね。メインプログラムをフラグで処理しないようにするか ヘルプのサンプルのように Tick メソッドでぐるぐる回して待機する方法になるのかな?