Obter o caminho do contêiner de armazenamento

Página atualizada :
Data de criação de página :

resumo

Obtém o caminho do contêiner de armazenamento para o dispositivo de armazenamento selecionado.

ストレージコンテナのパスを取得する

Ambiente operacional

Pré-requisitos

Versões do XNA suportadas
  • 2.0
Plataformas suportadas
  • Windows (XP SP2, Vista)
  • Xbox360
Versão do sombreador de vértice necessária para Windows 1.1
Versão do sombreador de pixel necessária para Windows 1.1

Ambiente operacional

plataforma

Como trabalhar com a amostra

Teclado de trabalhoControle Xbox 360mouse
Escolhendo um dispositivo de armazenamento Um Um -

substância

Sobre a interface do usuário de seleção de dispositivo de armazenamento

O Xbox 360 possui vários dispositivos de armazenamento, incluindo um disco rígido e uma unidade de memória. Ao salvar dados para jogos, etc., o Xbox 360 vem de fábrica com uma interface do usuário que permite escolher em qual dispositivo salvar os dados. (Veja a figura acima)

Neste exemplo, usamos essa interface do usuário para obter o caminho de destino.

Como adicionar um componente de serviços relacionados a jogos

A interface do usuário de seleção de dispositivo salvo funciona de forma assíncrona com o jogo real. Para fazer isso, você precisa adicionar um serviço de jogo e fazer com que o serviço de jogo conduza a interface do usuário de seleção do dispositivo salvo.

// 非同期処理を行うためのゲームサービスコンポーネントを追加
this.Components.Add(new GamerServicesComponent(this));

GamerServicesComponent construtor

Crie uma instância de GamerServicesComponent para lidar com o serviço de jogador.

jogo Jogo Este componente e sua classe de jogo associada.

Comece a exibir a interface do usuário de seleção do dispositivo de armazenamento

Para exibir a interface do usuário de seleção de dispositivo de salvamento, chame o método "Guide.BeginShowStorageDeviceSelector" no método Update. No entanto, a interface do usuário de seleção de dispositivo salvo não será exibida no momento da chamada desse método, mas será chamada pelo serviço de jogo que você acabou de adicionar.

O primeiro argumento do método Guide.BeginShowStorageDeviceSelector especifica o método que será chamado depois que o dispositivo for selecionado na interface do usuário do Seletor de Dispositivo Salvar. Você deve definir esse método por conta própria (consulte a próxima seção).

O segundo argumento pode ser definido como qualquer dado. Se você quiser usar alguns dados depois de selecionar um dispositivo de armazenamento, defina esse parâmetro como seus próprios dados.

// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);

Guide.BeginShowStorageDeviceSelector método

Inicia o processo de exibição da interface do usuário de seleção do dispositivo de armazenamento. Esta operação é feita de forma assíncrona com o processo do jogo.

Callback Retorno de chamada assíncrona Define o método que é chamado depois que o dispositivo de salvamento é selecionado.
estado Objeto Defina seus próprios dados a serem usados para processamento assíncrono.

A propósito, essa interface do usuário de seleção de dispositivo salvo não é exibida porque é selecionada automaticamente se apenas um dispositivo estiver conectado. Também não é exibido no Windows.

Método de processamento após selecionar um dispositivo de armazenamento

O método especificado no método Guide.BeginShowStorageDeviceSelector é definido para aceitar um IAsyncResult.

/// <summary>
/// ストレージデバイスを取得するために呼ばれる
/// </summary>
/// <param name="result">非同期処理の結果</param>
private void GetStorageDevice(IAsyncResult result)
{
    // 結果をもとにストレージデバイスの選択UIを終了してストレージデバイスを取得します
    StorageDevice storageDevice = Guide.EndShowStorageDeviceSelector(result);

    if (storageDevice != null && storageDevice.IsConnected)
    {
        ///// ストレージデバイスの取得に成功し、接続されている場合 /////

        // ストレージコンテナを開きます
        using (StorageContainer container = storageDevice.OpenContainer("XNASample"))
        {
            // コンテナの名前を取得
            this.storageContainerName = container.TitleName;

            // コンテナで指定されているパスを取得
            this.storageContainerPath = container.Path;
        }
    }
}

Esse método é chamado quando você conclui o processo de seleção de dispositivo na interface do usuário de seleção de dispositivo de salvamento.

Você pode receber um dispositivo de salvamento passando o resultado passado pelo argumento (IAsyncResult) para o argumento de "Guide.EndShowStorageDeviceSelector". Observe que, se você cancelar a seleção, null será retornado.

Guide.EndShowStorageDeviceSelector método

Exibe a interface do usuário de seleção do dispositivo salvo e recebe o dispositivo salvo.

Resultado assíncrono IAsyncResult Passe o resultado da seleção do dispositivo salvo.
Valores retornados Dispositivo de armazenamento O dispositivo de armazenamento selecionado. Se a seleção for cancelada, null será retornado.

Verifique se o dispositivo está realmente conectado com a propriedade "StorageDevice.IsConnected" e abra o contêiner com o método "StorageDevice.OpenContainer". O argumento para o método StorageDevice.OpenContainer é o nome do contêiner. Esse nome identifica o contêiner no qual os dados são armazenados.

StorageDevice.IsConnected propriedade

Retorna true se o dispositivo for conectado com êxito; caso contrário, false.

StorageDevice.OpenContainer método

Abre o contêiner de armazenamento com o nome especificado.

nome_do_título corda O nome do contêiner.
Valores retornados Contêiner de armazenamento Recupera o contêiner de armazenamento com o nome especificado.

Depois de ter o contêiner, você pode usar a propriedade StorageContainer.Path para obter o caminho em que o arquivo está armazenado.

StorageContainer.Path propriedade

Obtém o caminho do arquivo salvo do jogo do usuário.

Considere que a interface do usuário de seleção do dispositivo de armazenamento é um processo assíncrono

No exemplo, enquanto a interface do usuário de seleção de dispositivo salvo é exibida, ela conta cada quadro para garantir que ele esteja sendo executado de forma assíncrona e exibe a contagem. Se você realmente executá-lo, poderá ver que o valor do contador aumenta em segundo plano, mesmo quando a interface do usuário de seleção de dispositivo é exibida.

Se você está realmente fazendo um jogo, você deve levar isso em consideração e interromper o progresso do jogo enquanto seleciona um dispositivo. Como alternativa, você pode interromper o progresso, mas continuar os efeitos e outros efeitos de tela. Esta área precisa ser ajustada para corresponder ao jogo real.

Todos os códigos

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace GetStorageContainerPath
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// スプライトでテキストを描画するためのフォント
        /// </summary>
        private SpriteFont font = null;

        /// <summary>
        /// ストレージコンテナの名前
        /// </summary>
        private string storageContainerName = "";

        /// <summary>
        /// ストレージコンテナのパス
        /// </summary>
        private string storageContainerPath = "";

        /// <summary>
        /// フレームカウント数
        /// </summary>
        private int frameCount = 0;

        /// <summary>
        /// 直線のキーボード入力の状態
        /// </summary>
        private KeyboardState oldKeyboardState = new KeyboardState();

        /// <summary>
        /// 直線のゲームパッド入力の状態
        /// </summary>
        private GamePadState oldGamePadState = new GamePadState();


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

            // 画面サイズを変更
            this.graphics.PreferredBackBufferWidth = 1024;
            this.graphics.PreferredBackBufferHeight = 768;

            // 非同期処理を行うためのゲームサービスコンポーネントを追加
            this.Components.Add(new GamerServicesComponent(this));
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // フォントをコンテンツパイプラインから読み込む
            this.font = this.Content.Load<SpriteFont>("Font");
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <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();
            }

            if ((keyboardState.IsKeyDown(Keys.A) && this.oldKeyboardState.IsKeyUp(Keys.A)) ||
                (gamePadState.Buttons.A == ButtonState.Pressed &&
                    this.oldGamePadState.Buttons.A == ButtonState.Released))
            {
                ///// A ボタンが押されたとき /////

                // ストレージデバイス選択UIを表示するための設定を行います
                Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
            }

            // 入力情報を記憶
            this.oldKeyboardState = keyboardState;
            this.oldGamePadState = gamePadState;

            // フレームのカウント
            this.frameCount++;

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

        /// <summary>
        /// ストレージデバイスを取得するために呼ばれる
        /// </summary>
        /// <param name="result">非同期処理の結果</param>
        private void GetStorageDevice(IAsyncResult result)
        {
            // 結果をもとにストレージデバイスの選択UIを終了してストレージデバイスを取得します
            StorageDevice storageDevice = Guide.EndShowStorageDeviceSelector(result);

            if (storageDevice != null && storageDevice.IsConnected)
            {
                ///// ストレージデバイスの取得に成功し、接続されている場合 /////

                // ストレージコンテナを開きます
                using (StorageContainer container = storageDevice.OpenContainer("XNASample"))
                {
                    // コンテナの名前を取得
                    this.storageContainerName = container.TitleName;

                    // コンテナで指定されているパスを取得
                    this.storageContainerPath = container.Path;
                }
            }
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // スプライトの描画準備
            this.spriteBatch.Begin();

            // テキスト描画
            this.spriteBatch.DrawString(this.font,
                "A : Data is saved in a file.",
                new Vector2(50.0f, 50.0f), Color.White);

            // ストレージコンテナの名前
            this.spriteBatch.DrawString(this.font,
                "StorageContainerTitleName : " + this.storageContainerName,
                new Vector2(50.0f, 70.0f), Color.White);

            // ストレージコンテナのパス
            this.spriteBatch.DrawString(this.font,
                "[ Path ]\r\n" + this.storageContainerPath,
                new Vector2(50.0f, 90.0f), Color.White);

            // フレームカウント
            this.spriteBatch.DrawString(this.font,
                "FrameCount : " + this.frameCount,
                new Vector2(this.graphics.PreferredBackBufferWidth - 200.0f, 50.0f), Color.White);

            // スプライトの一括描画
            this.spriteBatch.End();

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}