オノデラの研究日記 in わんくま

思いついたネタを気ままに書いていくブログ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  209  : 記事  5  : コメント  5961  : トラックバック  40

ニュース

プロフィール

  • ●おのでら
    宮城県在住
    主に業務向けソフトを製作

Twitter

ニュース

主なリンク

XNA 関連リンク

アイテム

ゲーマーカード

その他

記事カテゴリ

書庫

日記カテゴリ

 こびとスタジオさんのブログで「ストレージ機器を選択するブレードが開けないバグ」についての情報があったのですが、私も Tips 用にストレージのプログラムを作っていたまま、Xbox 360 で一度もテストしていなかったので(^^;)ちょっと試してみました。

 とりあえず実装が簡単そうな「StorageDevice.ShowStorageDeviceGuide」メソッドを使ってみました。

/// <SUMMARY>
/// 描画以外のデータ更新等の処理を行うメソッド
/// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
/// </SUMMARY>
/// <PARAM NAME="GAMETIME">タイミング値のスナップショット</PARAM>
protected override void Update(GameTime gameTime)
{
    KeyboardState keyboardState = Keyboard.GetState();
    GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);

    // Xbox360 コントローラの BACK ボタンを押したときにゲームを終了させます
    if (gamePadState.Buttons.Back == ButtonState.Pressed)
    {
        this.Exit();
    }

    // A ボタン、または A キーを押したとき
    if (gamePadState.Buttons.A == ButtonState.Pressed ||
        keyboardState.IsKeyDown(Keys.A))
    {
        // デバイス選択UIを表示する
        StorageDevice storageDevice = StorageDevice.ShowStorageDeviceGuide();
    }

    // 登録されたGameComponentを更新する
    base.Update(gameTime);
}

  Xbox360 で実行すると「StorageDevice.ShowStorageDeviceGuide」メソッドを呼び出したところでパッタリ止まってしまいますね(^^;)。

 一応メインスレッドでフレームのカウントを取っているのですが、こちらもカウントが止まっているのでメインスレッドもダメっぽいです。もちろんコントローラーの操作も受け付けません。

 仕方ないので Visual C# のデバッグを終了させるとプログラムが強制終了する瞬間、ブレードが一瞬だけ見えるんですよね。なんか裏に隠れちゃっているのかな?

フレームカウント
こんな感じにカウントを取っている

プログラム強制終了間際にブレードが表示される
画面が固まった後、プログラム強制終了間際にブレードが表示される。原因不明…

 で、今度は非同期でブレードを表示するプログラムで試してみました。

/// <SUMMARY>
/// 非同期操作のステータス
/// </SUMMARY>
private IAsyncResult asyncResult = null;

/// <SUMMARY>
/// 描画以外のデータ更新等の処理を行うメソッド
/// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
/// </SUMMARY>
/// <PARAM NAME="GAMETIME">タイミング値のスナップショット</PARAM>
protected override void Update(GameTime gameTime)
{
    KeyboardState keyboardState = Keyboard.GetState();
    GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);

    // Xbox360 コントローラの BACK ボタンを押したときにゲームを終了させます
    if (gamePadState.Buttons.Back == ButtonState.Pressed)
    {
        this.Exit();
    }

    // A ボタン、または A キーを押したとき
    if (this.asyncResult == null &&
        gamePadState.Buttons.A == ButtonState.Pressed ||
        keyboardState.IsKeyDown(Keys.A))
    {
        // デバイス選択UIを表示する
        this.asyncResult = StorageDevice.BeginShowStorageDeviceGuide(nullnull);
    }

    if (this.asyncResult != null && this.asyncResult.IsCompleted)
    {
        // デバイスを選択
        StorageDevice device = StorageDevice.EndShowStorageDeviceGuide(this.asyncResult);

        // デバイスを選択したら null にセット
        this.asyncResult = null;
    }

    // 登録されたGameComponentを更新する
    base.Update(gameTime);
}

  こびとスタジオさんのとは違ってコールバックメソッドは使っていません。これを実行すると今度は正常にストレージの選択ができるみたいです。ただ、ストレージの選択で、「戻る」ボタンを押しても StorageDevice が正常に取得できるのは少し気になりますが(^^;)。

 あと、2番目のプログラムの場合、ブレードを開いている間でもメインのスレッドは非同期で処理されているので(フレームカウントで確認済み)なんらかの対処はしないといけないみたいですね。メインプログラムをフラグで処理しないようにするか ヘルプのサンプルのように Tick メソッドでぐるぐる回して待機する方法になるのかな?

投稿日時 : 2007年8月19日 23:34

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント