Pobieranie ścieżki kontenera magazynu

Strona zaktualizowana :
Data utworzenia strony :

streszczenie

Pobiera ścieżkę kontenera magazynu dla wybranego urządzenia magazynującego.

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

Środowisko pracy

Warunki wstępne

Obsługiwane wersje XNA
  • 2.0
Obsługiwane platformy
  • Windows (XP SP2, Vista)
  • Konsola Xbox360
Wymagana wersja cieniowania wierzchołków systemu Windows 1.1
Wymagana wersja Pixel Shader w systemie Windows 1.1

Środowisko pracy

podest

Jak pracować z próbką

Działa klawiaturaKontroler Xbox 360mysz
Wybór urządzenia pamięci masowej A A -

substancja

Informacje o interfejsie wyboru urządzenia pamięci masowej

Konsola Xbox 360 ma wiele urządzeń pamięci masowej, w tym dysk twardy i jednostkę pamięci. Podczas zapisywania danych w grach itp. konsola Xbox 360 jest standardowo wyposażona w interfejs użytkownika (UI), który pozwala wybrać urządzenie, na którym chcesz zapisać dane. (Patrz rysunek powyżej)

W tym przykładzie użyjemy tego interfejsu użytkownika, aby uzyskać ścieżkę docelową.

Dodawanie składnika usług gier

Interfejs wyboru urządzenia zapisu działa asynchronicznie z rzeczywistą grą. Aby to osiągnąć, musisz dodać usługę gry i sprawić, by usługa gry napędzała interfejs wyboru urządzenia zapisu.

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

GamerServicesComponent konstruktor

Utwórz instancję GamerServicesComponent do obsługi usługi dla graczy.

gra Gra Ten komponent i skojarzona z nim klasa gry.

Rozpocznij wyświetlanie interfejsu wyboru urządzenia pamięci masowej

Aby wyświetlić interfejs użytkownika wyboru urządzenia zapisu, wywołaj metodę "Guide.BeginShowStorageDeviceSelector" w metodzie Update. Jednak interfejs wyboru urządzenia zapisu nie zostanie wyświetlony w momencie wywołania tej metody, ale zostanie wywołany przez właśnie dodaną usługę gry.

Pierwszy argument metody Guide.BeginShowStorageDeviceSelector określa metodę, która zostanie wywołana po wybraniu urządzenia w interfejsie użytkownika zapisywania selektora urządzeń. Metodę tę należy zdefiniować samodzielnie (patrz następna sekcja).

Drugi argument można ustawić na dowolne dane. Jeśli chcesz użyć niektórych danych po wybraniu urządzenia pamięci masowej, ustaw ten parametr na własne dane.

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

Guide.BeginShowStorageDeviceSelector metoda

Inicjuje proces wyświetlania interfejsu wyboru urządzenia pamięci masowej. Ta operacja jest wykonywana asynchronicznie z procesem gry.

Wywołania zwrotnego AsyncCallback Ustawia metodę, która jest wywoływana po wybraniu urządzenia składowania.
stan Sprzeciwiać się Ustawianie własnych danych do użycia na potrzeby przetwarzania asynchronicznego.

Nawiasem mówiąc, ten interfejs wyboru urządzenia do zapisywania nie jest wyświetlany, ponieważ jest wybierany automatycznie, jeśli podłączone jest tylko jedno urządzenie. Nie jest również wyświetlany w systemie Windows.

Metoda przetwarzania po wybraniu urządzenia pamięci masowej

Metoda określona w metodzie Guide.BeginShowStorageDeviceSelector jest zdefiniowana w celu zaakceptowania 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;
        }
    }
}

Ta metoda jest wywoływana po zakończeniu procesu wyboru urządzenia w interfejsie wyboru zapisywania urządzenia.

Urządzenie składowania można odebrać, przekazując wynik przekazany przez argument (IAsyncResult) do argumentu "Guide.EndShowStorageDeviceSelector". Należy pamiętać, że jeśli anulujesz wybór, zostanie zwrócona wartość null.

Guide.EndShowStorageDeviceSelector metoda

Wyświetla interfejs wyboru urządzenia składowania i odbiera urządzenie składowania.

asyncResult (Wynik asynchroniczny) IAsyncResult (Wynik synchronizacji) Przekaż wynik wyboru urządzenia zapisu.
Wartości zwracane Urządzenie pamięci masowej Wybrane urządzenie pamięci masowej. Jeśli zaznaczenie zostanie anulowane, zwracana jest wartość null.

Sprawdź, czy urządzenie jest rzeczywiście połączone z właściwością "StorageDevice.IsConnected" i otwórz kontener za pomocą metody "StorageDevice.OpenContainer". Argumentem metody StorageDevice.OpenContainer jest nazwa kontenera. Ta nazwa identyfikuje kontener, w którym są przechowywane dane.

StorageDevice.IsConnected własność

Zwraca wartość true, jeśli urządzenie zostało pomyślnie połączone; w przeciwnym razie wartość false.

StorageDevice.OpenContainer metoda

Otwiera kontener magazynu o określonej nazwie.

titleName (nazwa_tytułu) struna Nazwa kontenera.
Wartości zwracane Kontener pamięci masowej Pobiera kontener magazynu o określonej nazwie.

Po utworzeniu kontenera możesz użyć właściwości StorageContainer.Path , aby uzyskać ścieżkę, w której jest przechowywany plik.

StorageContainer.Path własność

Pobiera ścieżkę do pliku zapisu gry użytkownika.

Należy wziąć pod uwagę, że interfejs wyboru urządzenia pamięci masowej jest procesem asynchronicznym

W przykładzie, podczas gdy wyświetlany jest interfejs wyboru urządzenia do zapisywania, zlicza każdą klatkę, aby upewnić się, że działa asynchronicznie, i wyświetla liczbę. Jeśli faktycznie go uruchomisz, zobaczysz, że wartość licznika wzrasta w tle, nawet gdy wyświetlany jest interfejs wyboru urządzenia.

Jeśli faktycznie tworzysz grę, musisz wziąć to pod uwagę i zatrzymać postęp gry podczas wybierania urządzenia. Alternatywnie możesz chcieć zatrzymać postęp, ale kontynuować efekty i inne efekty ekranowe. Ten obszar musi zostać dostosowany, aby pasował do rzeczywistej gry.

Wszystkie kody

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