Obtenir le chemin d’accès du conteneur de stockage

Page mise à jour :
Date de création de la page :

résumé

Obtient le chemin d’accès au conteneur de stockage pour le périphérique de stockage sélectionné.

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

Environnement d’exploitation

Conditions préalables

Versions XNA prises en charge
  • 2.0
Plates-formes prises en charge
  • Windows (XP SP2, Vista)
  • Xbox360
Version du Vertex Shader requise par Windows 1.1
Version du Pixel Shader requise par Windows 1.1

Environnement d’exploitation

plateforme

Comment travailler avec l’échantillon

Fonctionne clavierManette Xbox 360souris
Choix d’un périphérique de stockage Un Un -

substance

À propos de l’interface utilisateur de sélection du périphérique de stockage

La Xbox 360 dispose de plusieurs périphériques de stockage, notamment un disque dur et une unité de mémoire. Lors de l’enregistrement de données pour des jeux, etc., la Xbox 360 est livrée en standard avec une interface utilisateur qui vous permet de choisir sur quel appareil enregistrer les données. (Voir la figure ci-dessus)

Dans cet exemple, nous utilisons cette interface utilisateur pour obtenir le chemin d’accès à la destination.

Ajout d’un composant Game Services

L’interface utilisateur de sélection de l’appareil de sauvegarde fonctionne de manière asynchrone avec le jeu réel. Pour ce faire, vous devez ajouter un service de jeu et faire en sorte que le service de jeu pilote l’interface utilisateur de sélection de l’appareil de sauvegarde.

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

GamerServicesComponent constructeur

Créez une instance de GamerServicesComponent pour gérer le service de jeu.

jeu Jeu Ce composant et sa classe de jeu associée.

Commencer à afficher l’interface utilisateur de sélection du périphérique de stockage

Pour afficher l’interface utilisateur de sélection de l’appareil d’enregistrement, appelez la méthode « Guide.BeginShowStorageDeviceSelector » dans la méthode Update. Cependant, l’interface utilisateur de sélection de l’appareil de sauvegarde ne s’affichera pas au moment de l’appel de cette méthode, mais sera appelée par le service de jeu que vous venez d’ajouter.

Le premier argument de la méthode Guide.BeginShowStorageDeviceSelector spécifie la méthode qui sera appelée une fois que l’appareil est sélectionné dans l’interface utilisateur du sélecteur de périphérique d’enregistrement. Vous devez définir cette méthode vous-même (voir la section suivante).

Le deuxième argument peut être défini sur n’importe quelle donnée. Si vous souhaitez utiliser certaines données après avoir sélectionné un périphérique de stockage, définissez ce paramètre sur vos propres données.

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

Guide.BeginShowStorageDeviceSelector méthode

Lance le processus d’affichage de l’interface utilisateur de sélection du périphérique de stockage. Cette opération se fait de manière asynchrone avec le processus de jeu.

Rappel AsyncCallback Définit la méthode appelée après la sélection du périphérique d’enregistrement.
état Objet Définissez vos propres données à utiliser pour le traitement asynchrone.

D’ailleurs, cette interface utilisateur de sélection de l’appareil de sauvegarde n’est pas affichée car elle est automatiquement sélectionnée si un seul appareil est connecté. Il n’est pas non plus affiché sous Windows.

Procédé de traitement après sélection d’un périphérique de stockage

La méthode spécifiée dans la méthode Guide.BeginShowStorageDeviceSelector est définie pour accepter un 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;
        }
    }
}

Cette méthode est appelée lorsque vous avez terminé le processus de sélection de périphérique dans l’interface utilisateur de sauvegarde de la sélection de périphérique.

Vous pouvez recevoir un périphérique de sauvegarde en passant le résultat passé par l’argument (IAsyncResult) à l’argument « Guide.EndShowStorageDeviceSelector ». Notez que si vous annulez la sélection, null sera renvoyé.

Guide.EndShowStorageDeviceSelector méthode

Affiche l’interface utilisateur de sélection de l’appareil d’enregistrement et reçoit l’appareil d’enregistrement.

asyncResult IAsyncResult Passez le résultat de la sélection du périphérique d’enregistrement.
Valeurs de retour Périphérique de stockage Périphérique de stockage sélectionné. Si la sélection est annulée, la valeur null est renvoyée.

Vérifiez si le périphérique est réellement connecté à l’aide de la propriété « StorageDevice.IsConnected » et ouvrez le conteneur à l’aide de la méthode « StorageDevice.OpenContainer ». L’argument de la méthode StorageDevice.OpenContainer est le nom du conteneur. Ce nom identifie le conteneur dans lequel les données sont stockées.

StorageDevice.IsConnected propriété

Renvoie true si l’appareil est correctement connecté, sinon false.

StorageDevice.OpenContainer méthode

Ouvre le conteneur de stockage avec le nom spécifié.

titleName corde Nom du conteneur.
Valeurs de retour Conteneur de stockage Récupère le conteneur de stockage portant le nom spécifié.

Une fois que vous avez le conteneur, vous pouvez utiliser la propriété StorageContainer.Path pour obtenir le chemin d’accès où le fichier est stocké.

StorageContainer.Path propriété

Obtient le chemin d’accès au fichier de sauvegarde de jeu de l’utilisateur.

Considérez que l’interface utilisateur de sélection du périphérique de stockage est un processus asynchrone

Dans l’exemple, lorsque l’interface utilisateur de sélection du périphérique d’enregistrement est affichée, elle compte chaque image pour s’assurer qu’elle s’exécute de manière asynchrone et affiche le nombre. Si vous l’exécutez réellement, vous pouvez voir que la valeur du compteur augmente en arrière-plan même lorsque l’interface utilisateur de sélection de l’appareil est affichée.

Si vous créez réellement un jeu, vous devez en tenir compte et arrêter la progression du jeu pendant que vous sélectionnez un appareil. Alternativement, vous pouvez arrêter la progression, mais continuer les effets et autres effets d’écran. Cette zone doit être ajustée pour correspondre au jeu réel.

Tous les codes

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