Obtenir el camí del contenidor d'emmagatzematge

Pàgina actualitzada :
Data de creació de la pàgina :

resum

Obté el camí del contenidor d'emmagatzematge per al dispositiu d'emmagatzematge seleccionat.

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

Entorn operatiu

Prerequisits

Versions XNA compatibles
  • 2.0
Plataformes compatibles
  • Windows (XP SP2, Vista)
  • Xbox360
Versió del shader de vèrtex necessària per al Windows 1.1
Versió de Pixel Shader necessària per a Windows 1.1

Entorn operatiu

plataforma

Com treballar amb la mostra

Funciona teclatControlador Xbox 360ratolí
Triar un dispositiu d'emmagatzematge Un Un -

substància

Sobre la interfície d'usuari de selecció de dispositius d'emmagatzematge

Xbox 360 té diversos dispositius d'emmagatzematge, inclòs un disc dur i una unitat de memòria. Quan deseu dades per a jocs, etc., Xbox 360 ve de sèrie amb una interfície d'usuari (interfície d'usuari) que us permet triar en quin dispositiu voleu desar dades. (Vegeu la figura anterior)

En aquest exemple, utilitzem aquesta interfície d'usuari per obtenir el camí de destinació.

Addició d'un component de serveis de jocs

La interfície d'usuari de selecció de dispositius de desament funciona de manera asíncrona amb el joc real. Per aconseguir-ho, heu d'afegir un servei de jocs i fer que el servei de jocs condueixi la interfície d'usuari de selecció de dispositius de desament.

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

GamerServicesComponent constructor

Creeu una instància de GamerServicesComponent per gestionar el servei de jugador.

joc Joc Aquest component i la seva classe de joc associada.

Comença a mostrar la interfície d'usuari de selecció del dispositiu d'emmagatzematge

Per visualitzar la interfície d'usuari de selecció de dispositius de desament, crideu al mètode "Guide.BeginShowStorageDeviceSelector" al mètode Update. Tanmateix, la interfície d'usuari de selecció de dispositius de desament no es mostrarà en el moment de cridar aquest mètode, sinó que serà cridada pel servei de joc que acabeu d'afegir.

El primer argument del mètode Guide.BeginShowStorageDeviceSelector especifica el mètode que es cridarà després de seleccionar el dispositiu a la interfície d'usuari Desa el selector de dispositius. Heu de definir aquest mètode vosaltres mateixos (vegeu la secció següent).

El segon argument es pot establir a qualsevol dada. Si voleu utilitzar algunes dades després de seleccionar un dispositiu d'emmagatzematge, definiu aquest paràmetre a les vostres pròpies dades.

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

Guide.BeginShowStorageDeviceSelector mètode

Inicia el procés per visualitzar la interfície d'usuari de selecció del dispositiu d'emmagatzematge. Aquesta operació es fa de manera asíncrona amb el procés del joc.

Resposta Devolució de trucada asíncrona Defineix el mètode que es crida després de seleccionar el dispositiu de desament.
estat Objecte Definiu les vostres pròpies dades per utilitzar-les per al processament asíncron.

Per cert, aquesta interfície d'usuari de selecció de dispositius de desament no es mostra perquè es selecciona automàticament si només hi ha un dispositiu connectat. Tampoc es mostra a Windows.

Mètode de processament després de seleccionar un dispositiu d'emmagatzematge

El mètode especificat al mètode Guide.BeginShowStorageDeviceSelector es defineix per acceptar un 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;
        }
    }
}

Aquest mètode s'anomena quan heu acabat el procés de selecció de dispositius a la interfície d'usuari de desament de selecció de dispositius.

Podeu rebre un dispositiu de desament passant el resultat passat per l'argument (IAsyncResult) a l'argument de "Guide.EndShowStorageDeviceSelector". Tingueu en compte que si cancel·leu la selecció, es retornarà null.

Guide.EndShowStorageDeviceSelector mètode

Mostra la interfície d'usuari de selecció de dispositius desats i rep el dispositiu desat.

asyncResult IAsyncResult Passa el resultat de la selecció de desament del dispositiu.
Valors retornats Dispositiu d'emmagatzematge El dispositiu d'emmagatzematge seleccionat. Si es cancel·la la selecció, es retorna null.

Comproveu si el dispositiu està realment connectat amb la propietat "StorageDevice.IsConnected" i obriu el contenidor amb el mètode "StorageDevice.OpenContainer". L'argument del mètode StorageDevice.OpenContainer és el nom del contenidor. Aquest nom identifica el contenidor on s'emmagatzemen les dades.

StorageDevice.IsConnected propietat

Retorna true si el dispositiu s'ha connectat correctament; en cas contrari, false.

StorageDevice.OpenContainer mètode

Obre el contenidor d'emmagatzematge amb el nom especificat.

titleNom corda El nom del contenidor.
Valors retornats Contenidor d'emmagatzematge Recupera el contenidor d'emmagatzematge amb el nom especificat.

Un cop tingueu el contenidor, podeu utilitzar la propietat StorageContainer.Path per obtenir el camí on s'emmagatzema el fitxer.

StorageContainer.Path propietat

Obté el camí del fitxer de desament del joc de l'usuari.

Tingueu en compte que la interfície d'usuari de selecció del dispositiu d'emmagatzematge és un procés asíncron

A l'exemple, mentre es mostra la interfície d'usuari de selecció de dispositius de desament, compta cada fotograma per assegurar-se que s'executa de manera asíncrona i mostra el recompte. Si realment l'executeu, podeu veure que el valor del comptador augmenta en segon pla fins i tot mentre es mostra la interfície d'usuari de selecció de dispositius.

Si realment esteu fent un joc, heu de tenir-ho en compte i aturar el progrés del joc mentre seleccioneu un dispositiu. Alternativament, és possible que vulgueu aturar el progrés, però continuar amb els efectes i altres efectes de pantalla. Aquesta àrea s'ha d'ajustar perquè coincideixi amb el joc real.

Tots els codis

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