קבל את הנתיב של גורם המכיל של האחסון

עודכן דף :
תאריך יצירת דף :

תקציר

מקבל את נתיב הגורם המכיל של האחסון עבור התקן האחסון שנבחר.

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

סביבת הפעלה

דרישות מוקדמות

גרסאות XNA נתמכות
  • 2.0
פלטפורמות נתמכות
  • חלונות (XP SP2, Vista)
  • Xbox360
Windows נדרש Vertex Shader גירסה 1.1
גירסת Pixel Shader נדרשת של Windows 1.1

סביבת הפעלה

פלטפורמה

כיצד לעבוד עם המדגם

עובד מקלדתבקר Xbox 360עכבר
בחירת התקן אחסון A A -

חומר

אודות ממשק המשתמש לבחירת התקן אחסון

Xbox 360 כולל התקני אחסון מרובים, כולל כונן קשיח ויחידת זיכרון. בעת שמירת נתונים עבור משחקים וכו', Xbox 360 מגיע כסטנדרט עם ממשק משתמש (ממשק משתמש) המאפשר לך לבחור באיזה מכשיר לשמור נתונים. (ראה איור לעיל)

בדוגמה זו, אנו משתמשים בממשק משתמש זה כדי לקבל את נתיב היעד.

הוספת רכיב שירותי משחק

ממשק המשתמש של בחירת המכשיר לשמירה פועל באופן אסינכרוני עם המשחק בפועל. כדי להשיג זאת, עליך להוסיף שירות משחקים ולבקש משירות המשחקים להניע את ממשק המשתמש של בחירת המכשיר השמור.

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

GamerServicesComponent בנאי

צור מופע של GamerServicesComponent כדי לטפל בשירות השחקנים.

משחק משחק רכיב זה ומחלקת המשחק המשויכת אליו.

התחל להציג את ממשק המשתמש של בחירת התקן האחסון

כדי להציג את ממשק המשתמש של בחירת ההתקן לשמירה, קרא לפעולת השירות "Guide.BeginShowStorageDeviceSelector" בפעולת השירות Update. עם זאת, ממשק המשתמש של בחירת המכשיר שמור לא יוצג בזמן הקריאה לשיטה זו, אלא ייקרא על-ידי שירות המשחק שהוספת זה עתה.

הארגומנט הראשון של פעולת השירות Guide.BeginShowStorageDeviceSelector מציין את השיטה שתיקרא לאחר בחירת ההתקן בממשק המשתמש של בורר ההתקנים. עליך להגדיר שיטה זו בעצמך (עיין בסעיף הבא).

ניתן להגדיר את הארגומנט השני לכל הנתונים. אם ברצונך להשתמש בנתונים מסוימים לאחר בחירת התקן אחסון, הגדר פרמטר זה לנתונים שלך.

// ストレージデバイス選択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 שיטת

פתיחת הגורם המכיל של האחסון בשם שצוין.

titleName מחרוזת שם המכולה.
ערכי החזרה אחסוןContainer מאחזר את הגורם המכיל של האחסון בשם שצוין.

לאחר שתקבל את הגורם המכיל, תוכל להשתמש במאפיין 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);
        }
    }
}