مسیر ظرف ذخیره سازی را دریافت کنید

صفحه به روز شده :
تاریخ ایجاد صفحه :

خلاصه

مسیر محفظه ذخیره سازی را برای دستگاه ذخیره سازی انتخاب شده دریافت می کند.

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

محیط عملیاتی

پیش نیازها

نسخه های XNA پشتیبانی شده
  • 2.0
پلتفرم های پشتیبانی شده
  • ویندوز (XP SP2، ویستا)
  • ایکس باکس 360
نسخه Vertex Shader مورد نیاز ویندوز 1.1
ویندوز نسخه Pixel Shader مورد نیاز است 1.1

محیط عملیاتی

بستر

نحوه کار با نمونه

صفحه کلید کار می کندکنترلر ایکس باکس 360ماوس
انتخاب دستگاه ذخیره سازی A A -

ماده

درباره رابط کاربری انتخاب دستگاه ذخیره سازی

ایکس باکس 360 دارای چندین دستگاه ذخیره سازی از جمله هارد دیسک و واحد حافظه است. هنگام ذخیره داده ها برای بازی ها و غیره، ایکس باکس 360 به صورت استاندارد با یک رابط کاربری (رابط کاربری) ارائه می شود که به شما امکان می دهد انتخاب کنید که داده ها را در کدام دستگاه ذخیره کنید. (شکل بالا را ببینید)

در این نمونه، ما از این رابط کاربری برای دریافت مسیر مقصد استفاده می کنیم.

افزودن کامپوننت سرویس های بازی

رابط کاربری انتخاب دستگاه ذخیره به صورت ناهمزمان با بازی واقعی کار می کند. برای انجام این کار، باید یک سرویس بازی اضافه کنید و از سرویس بازی بخواهید رابط کاربری انتخاب دستگاه ذخیره را هدایت کند.

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

GamerServicesComponent سازنده

یک نمونه از GamerServicesComponent برای مدیریت سرویس گیمر ایجاد کنید.

بازی بازی این مؤلفه و کلاس بازی مرتبط با آن.

شروع به نمایش رابط کاربری انتخاب دستگاه ذخیره سازی کنید

برای نمایش رابط کاربری انتخاب دستگاه ذخیره، روش "Guide.BeginShowStorageDeviceSelector" را در روش Update فراخوانی کنید. با این حال، رابط کاربری انتخاب دستگاه ذخیره در زمان فراخوانی این روش نمایش داده نمی شود، اما توسط سرویس بازی که به تازگی اضافه کرده اید فراخوانی می شود.

اولین آرگومان روش Guide.BeginShowStorageDeviceSelector روشی را مشخص می کند که پس از انتخاب دستگاه در رابط کاربری Save Device Selector فراخوانی می شود. شما باید این روش را خودتان تعریف کنید (به بخش بعدی مراجعه کنید).

آرگومان دوم را می توان روی هر داده ای تنظیم کرد. اگر می خواهید پس از انتخاب دستگاه ذخیره سازی از برخی داده ها استفاده کنید، این پارامتر را روی داده های خود تنظیم کنید.

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

Guide.BeginShowStorageDeviceSelector روش

فرآیند نمایش رابط کاربری انتخاب دستگاه ذخیره سازی را آغاز می کند. این عملیات به صورت ناهمزمان با فرآیند بازی انجام می شود.

پاسخ AsyncCallback روشی را تنظیم می کند که پس از انتخاب دستگاه ذخیره فراخوانی می شود.
دولت شی داده های خود را برای استفاده برای پردازش ناهمزمان تنظیم کنید.

به هر حال، این رابط کاربری انتخاب دستگاه ذخیره نمایش داده نمی شود زیرا اگر فقط یک دستگاه متصل باشد، به طور خودکار انتخاب می شود. همچنین در ویندوز نمایش داده نمی شود.

روش پردازش پس از انتخاب دستگاه ذخیره سازی

روش مشخص شده در روش Guide.BeginShowStorageDeviceSelector برای پذیرش IAsyncResults تعریف شده است.

/// <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 روش

ظرف ذخیره سازی را با نام مشخص شده باز می کند.

titleName رشته نام ظرف.
مقادیر برگشتی کانتینر ذخیره سازی محفظه ذخیره سازی را با نام مشخص شده بازیابی می کند.

هنگامی که کانتینر را در اختیار گرفتید، می توانید از ویژگی 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);
        }
    }
}