Obțineți calea containerului de stocare

Pagina actualizată :
Data creării paginii :

rezumat

Obține calea containerului de stocare pentru dispozitivul de stocare selectat.

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

Mediul de operare

Cerințe preliminare

Versiuni XNA acceptate
  • 2.0
Platforme acceptate
  • Windows (XP SP2, Vista)
  • Xbox360
Versiunea Vertex Shader necesară pentru Windows 1.1
Versiunea Pixel Shader necesară pentru Windows 1.1

Mediul de operare

peron

Cum se lucrează cu eșantionul

Tastatură de lucruControler Xbox 360mouse
Alegerea unui dispozitiv de stocare Un Un -

substanță

Despre interfața de selectare a dispozitivului de stocare

Xbox 360 are mai multe dispozitive de stocare, inclusiv un hard disk și o unitate de memorie. Când salvați date pentru jocuri etc., Xbox 360 vine standard cu o interfață de utilizare (interfață cu utilizatorul) care vă permite să alegeți pe ce dispozitiv să salvați datele. (Vezi figura de mai sus)

În acest eșantion, folosim această interfață de utilizare pentru a obține calea de destinație.

Adăugarea unei componente Game Services

Interfața de selectare a dispozitivului de salvare funcționează asincron cu jocul real. Pentru a realiza acest lucru, trebuie să adăugați un serviciu de joc și să solicitați serviciului de joc să controleze interfața de selectare a dispozitivului de salvare.

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

GamerServicesComponent constructor

Creați o instanță de GamerServicesComponent pentru a gestiona serviciul gamer.

joc Joc Această componentă și clasa de joc asociată.

Începeți să afișați interfața de selectare a dispozitivului de stocare

Pentru a afișa interfața de utilizare a selectării dispozitivului de salvare, apelați metoda "Guide.BeginShowStorageDeviceSelector" în metoda Update. Cu toate acestea, interfața de selectare a dispozitivului de salvare nu va fi afișată în momentul apelării acestei metode, ci va fi apelată de serviciul de joc pe care tocmai l-ați adăugat.

Primul argument al metodei Guide.BeginShowStorageDeviceSelector specifică metoda care va fi apelată după ce dispozitivul este selectat în interfața de utilizare Salvare selector dispozitiv. Trebuie să definiți singur această metodă (a se vedea secțiunea următoare).

Al doilea argument poate fi setat la orice date. Dacă doriți să utilizați unele date după ce ați selectat un dispozitiv de stocare, setați acest parametru la propriile date.

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

Guide.BeginShowStorageDeviceSelector metodă

Inițiază procesul de afișare a interfeței de selectare a dispozitivului de stocare. Această operațiune se face asincron cu procesul de joc.

Apel invers AsyncCallback Setează metoda care este apelată după selectarea dispozitivului de salvare.
stat Obiect Setați-vă propriile date pentru a le utiliza pentru procesarea asincronă.

Apropo, această interfață de utilizare a selectării dispozitivului de salvare nu este afișată, deoarece este selectată automat dacă este conectat un singur dispozitiv. De asemenea, nu este afișat pe Windows.

Metoda de procesare după selectarea unui dispozitiv de stocare

Metoda specificată în metoda Guide.BeginShowStorageDeviceSelector este definită pentru a accepta 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;
        }
    }
}

Această metodă este apelată când ați terminat procesul de selecție a dispozitivului în interfața de salvare a selectării dispozitivului.

Puteți primi un dispozitiv de salvare prin transmiterea rezultatului transmis de argumentul (IAsyncResult) la argumentul "Guide.EndShowStorageDeviceSelector". Rețineți că, dacă anulați selecția, null va fi returnat.

Guide.EndShowStorageDeviceSelector metodă

Afișează interfața de selectare a dispozitivului de salvare și primește dispozitivul de salvare.

asyncResult IAsyncResult Treceți rezultatul selecției dispozitivului de salvare.
Valori returnate Dispozitiv de stocare Dispozitivul de stocare selectat. Dacă selecția este anulată, se returnează null.

Verificați dacă dispozitivul este de fapt conectat cu proprietatea "StorageDevice.IsConnected" și deschideți containerul cu metoda "StorageDevice.OpenContainer". Argumentul pentru metoda StorageDevice.OpenContainer este numele containerului. Acest nume identifică containerul în care sunt stocate datele.

StorageDevice.IsConnected proprietate

Returnează true dacă dispozitivul este conectat cu succes; în caz contrar, false.

StorageDevice.OpenContainer metodă

Deschide containerul de stocare cu numele specificat.

titleNume șir Numele containerului.
Valori returnate Containere de depozitare Preia containerul de stocare cu numele specificat.

După ce aveți containerul, puteți utiliza proprietatea StorageContainer.Path pentru a obține calea în care este stocat fișierul.

StorageContainer.Path proprietate

Obține calea fișierului de salvare a jocului utilizatorului.

Luați în considerare faptul că interfața de selectare a dispozitivului de stocare este un proces asincron

În eșantion, în timp ce este afișată interfața de utilizare a selectării dispozitivului de salvare, aceasta contorizează fiecare cadru pentru a se asigura că rulează asincron și afișează numărul. Dacă îl rulați de fapt, puteți vedea că valoarea contorului crește în fundal chiar și în timp ce este afișată interfața de selectare a dispozitivului.

Dacă faci de fapt un joc, trebuie să ții cont de acest lucru și să oprești progresul jocului în timp ce selectezi un dispozitiv. Alternativ, poate doriți să opriți progresul, dar să continuați efectele și alte efecte de ecran. Această zonă trebuie ajustată pentru a se potrivi cu jocul real.

Toate codurile

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