Ottenere il percorso del contenitore di archiviazione

Pagina aggiornata :
Data di creazione della pagina :

sommario

Ottiene il percorso del contenitore di archiviazione per il dispositivo di archiviazione selezionato.

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

Ambiente operativo

Prerequisiti

Versioni XNA supportate
  • 2.0
Piattaforme supportate
  • Windows (XP SP2, Vista)
  • Xbox360
Versione Vertex Shader richiesta da Windows 1.1
Versione Pixel Shader richiesta da Windows 1.1

Ambiente operativo

piattaforma

Come utilizzare l'esempio

Funziona con tastieraController Xbox 360mouse
Scelta di un dispositivo di archiviazione Un Un -

sostanza

Informazioni sull'interfaccia utente di selezione del dispositivo di archiviazione

Xbox 360 dispone di più dispositivi di archiviazione, tra cui un disco rigido e un'unità di memoria. Quando si salvano i dati per i giochi, ecc., Xbox 360 viene fornito di serie con un'interfaccia utente (UI) che consente di scegliere su quale dispositivo salvare i dati. (Vedi figura sopra)

In questo esempio viene usata questa interfaccia utente per ottenere il percorso di destinazione.

Aggiunta di un componente dei servizi di gioco

L'interfaccia utente di selezione del dispositivo di salvataggio funziona in modo asincrono con il gioco vero e proprio. A tale scopo, è necessario aggiungere un servizio di gioco e fare in modo che il servizio di gioco guidi l'interfaccia utente di selezione del dispositivo di salvataggio.

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

GamerServicesComponent costruttore

Creare un'istanza di GamerServicesComponent per gestire il servizio giocatore.

gioco Gioco Questo componente e la classe di gioco associata.

Avviare la visualizzazione dell'interfaccia utente di selezione del dispositivo di archiviazione

Per visualizzare l'interfaccia utente di selezione del dispositivo di salvataggio, chiama il metodo "Guide.BeginShowStorageDeviceSelector" nel metodo Update. Tuttavia, l'interfaccia utente di selezione del dispositivo di salvataggio non verrà visualizzata al momento della chiamata a questo metodo, ma verrà chiamata dal servizio di gioco appena aggiunto.

Il primo argomento del metodo Guide.BeginShowStorageDeviceSelector specifica il metodo che verrà chiamato dopo che il dispositivo è stato selezionato nell'interfaccia utente di salvataggio del selettore di dispositivo. È necessario definire questo metodo da soli (vedere la sezione successiva).

Il secondo argomento può essere impostato su qualsiasi dato. Se si desidera utilizzare alcuni dati dopo aver selezionato un dispositivo di archiviazione, impostare questo parametro sui propri dati.

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

Guide.BeginShowStorageDeviceSelector metodo

Avvia il processo per la visualizzazione dell'interfaccia utente di selezione del dispositivo di archiviazione. Questa operazione viene eseguita in modo asincrono con il processo di gioco.

richiamo AsyncCallback Imposta il metodo che viene chiamato dopo aver selezionato il dispositivo di salvataggio.
stato Oggetto Impostare i propri dati da utilizzare per l'elaborazione asincrona.

A proposito, questa interfaccia utente di selezione del dispositivo di salvataggio non viene visualizzata perché viene selezionata automaticamente se è collegato un solo dispositivo. Inoltre, non viene visualizzato su Windows.

Metodo di elaborazione dopo la selezione di un dispositivo di archiviazione

Il metodo specificato nel metodo Guide.BeginShowStorageDeviceSelector è definito per accettare 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;
        }
    }
}

Questo metodo viene chiamato al termine del processo di selezione del dispositivo nell'interfaccia utente di salvataggio della selezione del dispositivo.

È possibile ricevere un dispositivo di salvataggio passando il risultato passato dall'argomento (IAsyncResult) all'argomento di "Guide.EndShowStorageDeviceSelector". Si noti che se si annulla la selezione, verrà restituito null.

Guide.EndShowStorageDeviceSelector metodo

Visualizza l'interfaccia utente di selezione del dispositivo di salvataggio e riceve il dispositivo di salvataggio.

asyncResult IAsyncResult Passa il risultato della selezione del dispositivo di salvataggio.
Valori restituiti Dispositivo di archiviazione Il dispositivo di archiviazione selezionato. Se la selezione viene annullata, viene restituito null.

Controlla se il dispositivo è effettivamente connesso con la proprietà "StorageDevice.IsConnected" e apri il contenitore con il metodo "StorageDevice.OpenContainer". L'argomento del metodo StorageDevice.OpenContainer è il nome del contenitore. Questo nome identifica il contenitore in cui sono archiviati i dati.

StorageDevice.IsConnected proprietà

Restituisce true se il dispositivo è stato connesso correttamente; in caso contrario, false.

StorageDevice.OpenContainer metodo

Apre il contenitore di archiviazione con il nome specificato.

titleName corda Nome del contenitore.
Valori restituiti Contenitore di archiviazione Recupera il contenitore di archiviazione con il nome specificato.

Una volta ottenuto il contenitore, è possibile usare la proprietà StorageContainer.Path per ottenere il percorso in cui è archiviato il file.

StorageContainer.Path proprietà

Ottiene il percorso del file di salvataggio del gioco dell'utente.

Si consideri che l'interfaccia utente di selezione del dispositivo di archiviazione è un processo asincrono

Nell'esempio, mentre viene visualizzata l'interfaccia utente di selezione del dispositivo di salvataggio, conta ogni fotogramma per assicurarsi che sia in esecuzione in modo asincrono e visualizza il conteggio. Se lo si esegue effettivamente, è possibile notare che il valore del contatore aumenta in background anche quando è visualizzata l'interfaccia utente di selezione del dispositivo.

Se stai effettivamente creando un gioco, devi tenerne conto e interrompere l'avanzamento del gioco mentre stai selezionando un dispositivo. In alternativa, potresti voler interrompere l'avanzamento, ma continuare gli effetti e gli altri effetti dello schermo. Quest'area deve essere regolata per adattarsi al gioco reale.

Tutti i codici

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