Получаване на пътя на контейнера за съхранение

Страницата се актуализира :
Дата на създаване на страница :

резюме

Получава пътя на контейнера за съхранение за избраното устройство за съхранение.

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

Работна среда

Предпоставки

Поддържани версии на XNA
  • 2.0
Поддържани платформи
  • Windows (XP SP2, Vista)
  • Xbox360
Необходима версия на Vertex Shader за Windows 1.1
Необходима версия на пикселния шейдър за Windows 1.1

Работна среда

платформа

Как да работим с пробата

Работи клавиатураXbox 360 контролермишка
Избор на устройство за съхранение Една Една -

вещество

Относно потребителския интерфейс за избор на устройство за съхранение

Xbox 360 има множество устройства за съхранение, включително твърд диск и единица памет. Когато запазвате данни за игри и т.н., Xbox 360 се предлага стандартно с потребителски интерфейс (потребителски интерфейс), който ви позволява да изберете на кое устройство да запазите данни. (Вижте фигурата по-горе)

В този пример използваме този потребителски интерфейс, за да получим пътя на местоназначението.

Добавяне на компонент за услуги за игри

Потребителският интерфейс за избор на устройство за запазване работи асинхронно с действителната игра. За да постигнете това, трябва да добавите услуга за игри и услугата за игри да управлява потребителския интерфейс за избор на устройство за запазване.

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

GamerServicesComponent Конструктор

Създайте екземпляр на GamerServicesComponent, за да обработвате геймърската услуга.

игра Игра Този компонент и свързаният с него клас на играта.

Започнете да показвате потребителския интерфейс за избор на устройство за съхранение

За да покажете потребителския интерфейс за избор на устройство за записване, извикайте метода "Guide.BeginShowStorageDeviceSelector" в метода за актуализиране. Въпреки това, потребителският интерфейс за избор на устройство за запазване няма да се показва по време на извикването на този метод, а ще бъде извикан от услугата за игри, която току-що сте добавили.

Първият аргумент на метода Guide.BeginShowStorageDeviceSelector указва метода, който ще бъде извикан, след като устройството бъде избрано в потребителския интерфейс на Save Device Selector. Трябва сами да дефинирате този метод (вижте следващия раздел).

Вторият аргумент може да бъде зададен на всякакви данни. Ако искате да използвате някакви данни, след като сте избрали устройство за съхранение, задайте този параметър на вашите собствени данни.

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

Guide.BeginShowStorageDeviceSelector метод

Инициира процеса за показване на потребителския интерфейс за избор на устройство за съхранение. Тази операция се извършва асинхронно с процеса на играта.

Обратно AsyncCallback Задава метода, който се извиква след избиране на устройството за запис.
държава Обект Задайте свои собствени данни, които да използвате за асинхронна обработка.

Между другото, този потребителски интерфейс за избор на устройство за запазване не се показва, защото се избира автоматично, ако е свързано само едно устройство. Също така не се показва в Windows.

Метод на обработка след избор на устройство за съхранение

Методът, посочен в метода Guide.BeginShowStorageDeviceSelector, е дефиниран да приема 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;
        }
    }
}

Този метод се извиква, когато приключите процеса на избор на устройство в потребителския интерфейс за избор на устройство за записване.

Можете да получите записвано устройство, като предадете резултата, подаден от аргумента (IAsyncResult), към аргумента "Guide.EndShowStorageDeviceSelector". Имайте предвид, че ако отмените селекцията, ще бъде върнат null.

Guide.EndShowStorageDeviceSelector метод

Показва потребителския интерфейс за избор на записвано устройство и получава запазеното устройство.

asyncResult IAsyncResult Подайте резултата от избора на запазване на устройството.
Върнати стойности Устройство за съхранение Избраното устройство за съхранение. Ако изборът е отменен, се връща null.

Проверете дали устройството действително е свързано със свойството "StorageDevice.IsConnected" и отворете контейнера с метода "StorageDevice.OpenContainer". Аргументът на метода StorageDevice.OpenContainer е името на контейнера. Това име идентифицира контейнера, в който се съхраняват данните.

StorageDevice.IsConnected свойство

Връща true, ако устройството е свързано успешно; в противен случай false.

StorageDevice.OpenContainer метод

Отваря контейнера за съхранение с посоченото име.

titleИме низ Името на контейнера.
Върнати стойности Контейнер за съхранение Извлича контейнера за съхранение с зададеното име.

След като имате контейнера, можете да използвате свойството StorageContainer.Path, за да получите пътя, където се съхранява файлът.

StorageContainer.Path свойство

Получава пътя на файла за запазване на играта на потребителя.

Имайте предвид, че потребителският интерфейс за избор на устройство за съхранение е асинхронен процес

В примера, докато се показва потребителският интерфейс за избор на устройство за записване, той отчита всеки кадър, за да гарантира, че работи асинхронно и показва броенето. Ако действително го стартирате, можете да видите, че стойността на брояча се увеличава във фонов режим, дори когато се показва потребителският интерфейс за избор на устройство.

Ако всъщност правите игра, трябва да вземете това предвид и да спрете напредъка на играта, докато избирате устройство. Като алтернатива може да искате да спрете напредъка, но да продължите ефектите и другите ефекти на екрана. Тази област трябва да бъде коригирана, за да съответства на действителната игра.

Всички кодове

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