Získajte cestu úložného kontajnera

Stránka aktualizovaná :
Dátum vytvorenia strany :

súhrn

Získa cestu ku kontajneru úložiska pre vybraté ukladacie zariadenie.

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

Prevádzkové prostredie

Predpoklady

Podporované verzie XNA
  • 2.0
Podporované platformy
  • Windows (XP SP2, Vista)
  • Xbox360
Windows vyžaduje verziu tieňovača vrcholov 1.1
Windows vyžaduje verziu Pixel Shader 1.1

Prevádzkové prostredie

nástupište

Ako pracovať so vzorkou

Funguje klávesnicaOvládač pre Xbox 360myš
Výber úložného zariadenia A A -

látka

O používateľskom rozhraní výberu úložného zariadenia

Konzola Xbox 360 obsahuje viacero ukladacích zariadení vrátane pevného disku a pamäťovej jednotky. Pri ukladaní dát pre hry atď. sa konzola Xbox 360 štandardne dodáva s používateľským rozhraním (používateľské rozhranie), ktoré vám umožňuje vybrať, do ktorého zariadenia chcete údaje uložiť. (Pozri obrázok vyššie)

V tejto ukážke použijeme toto používateľské rozhranie na získanie cieľovej cesty.

Pridanie komponentu herných služieb

Používateľské rozhranie výberu zariadenia na ukladanie funguje asynchrónne so skutočnou hrou. Ak to chcete dosiahnuť, musíte pridať hernú službu a nechať hernú službu riadiť používateľské rozhranie výberu zariadenia na ukladanie.

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

GamerServicesComponent staviteľ

Vytvorte inštanciu GamerServicesComponent na spracovanie služby pre hráčov.

hra Hra Tento komponent a jeho pridružená herná trieda.

Začnite zobrazovať používateľské rozhranie výberu úložného zariadenia

Ak chcete zobraziť používateľské rozhranie výberu zariadenia na uloženie, zavolajte metódu "Guide.BeginShowStorageDeviceSelector" v metóde Update. Používateľské rozhranie výberu zariadenia na uloženie sa však nezobrazí v čase volania tejto metódy, ale bude volané hernou službou, ktorú ste práve pridali.

Prvý argument metódy Guide.BeginShowStorageDeviceSelector určuje metódu, ktorá sa zavolá po výbere zariadenia v používateľskom rozhraní Uložiť selektor zariadenia. Túto metódu si musíte definovať sami (pozri nasledujúcu časť).

Druhý argument je možné nastaviť na ľubovoľné údaje. Ak chcete po výbere úložného zariadenia použiť nejaké údaje, nastavte tento parameter na vlastné údaje.

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

Guide.BeginShowStorageDeviceSelector metóda

Spustí proces zobrazenia používateľského rozhrania výberu úložného zariadenia. Táto operácia sa vykonáva asynchrónne s herným procesom.

Spätné volanie AsyncCallback Nastaví metódu, ktorá sa vyvolá po výbere zariadenia na ukladanie.
štát Namietať Nastavte vlastné údaje, ktoré sa majú používať na asynchrónne spracovanie.

Mimochodom, toto používateľské rozhranie výberu zariadenia pre uloženie sa nezobrazí, pretože sa automaticky vyberie, ak je pripojené iba jedno zariadenie. Nezobrazuje sa ani v systéme Windows.

Spôsob spracovania po výbere úložného zariadenia

Metóda zadaná v metóde Guide.BeginShowStorageDeviceSelector je definovaná tak, aby akceptovala 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;
        }
    }
}

Táto metóda sa volá po dokončení procesu výberu zariadenia v používateľskom rozhraní výberu zariadenia.

Zariadenie na ukladanie môžete získať odovzdaním výsledku odovzdaného argumentom (IAsyncResult) argumentu "Guide.EndShowStorageDeviceSelector". Upozorňujeme, že ak výber zrušíte, vráti sa hodnota null.

Guide.EndShowStorageDeviceSelector metóda

Zobrazí používateľské rozhranie výberu zariadenia na uloženie a prijme zariadenie na uloženie.

asyncResult IAsyncResult Odovzdajte výsledok výberu zariadenia na uloženie.
Vrátené hodnoty Úložné zariadenie Vybrané úložné zariadenie. Ak je výber zrušený, vráti sa null.

Skontrolujte, či je zariadenie skutočne pripojené s vlastnosťou "StorageDevice.IsConnected" a otvorte kontajner pomocou metódy "StorageDevice.OpenContainer". Argument metódy StorageDevice.OpenContainer je názov kontajnera. Tento názov označuje kontajner, v ktorom sú údaje uložené.

StorageDevice.IsConnected majetok

Ak je zariadenie úspešne pripojené, vráti hodnotu true, v opačnom prípade hodnotu false.

StorageDevice.OpenContainer metóda

Otvorí úložný kontajner so zadaným názvom.

Názov názvu povrázok Názov kontajnera.
Vrátené hodnoty Skladovací kontajner Načíta kontajner úložiska so zadaným názvom.

Keď budete mať kontajner, môžete použiť vlastnosť StorageContainer.Path na získanie cesty, kde je súbor uložený.

StorageContainer.Path majetok

Získa cestu k súboru uloženej hry používateľa.

Zvážte, že používateľské rozhranie výberu úložného zariadenia je asynchrónny proces

Vo vzorke, keď je zobrazené používateľské rozhranie výberu zariadenia na uloženie, spočíta každú snímku, aby sa zabezpečilo, že beží asynchrónne, a zobrazí počet. Ak ho skutočne spustíte, môžete vidieť, že hodnota počítadla sa zvyšuje na pozadí, aj keď je zobrazené používateľské rozhranie výberu zariadenia.

Ak skutočne vytvárate hru, musíte to vziať do úvahy a zastaviť priebeh hry pri výbere zariadenia. Prípadne môžete zastaviť priebeh, ale pokračovať v efektoch a iných efektoch obrazovky. Túto oblasť je potrebné upraviť tak, aby zodpovedala skutočnej hre.

Všetky kódy

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