Obtenir el camí del contenidor d'emmagatzematge
resum
Obté el camí del contenidor d'emmagatzematge per al dispositiu d'emmagatzematge seleccionat.
Entorn operatiu
Prerequisits
Versions XNA compatibles |
|
Plataformes compatibles |
|
Versió del shader de vèrtex necessària per al Windows | 1.1 |
Versió de Pixel Shader necessària per a Windows | 1.1 |
Entorn operatiu
plataforma |
Com treballar amb la mostra
Funciona teclatControlador Xbox | 360ratolí | ||
---|---|---|---|
Triar un dispositiu d'emmagatzematge | Un | Un | - |
substància
Sobre la interfície d'usuari de selecció de dispositius d'emmagatzematge
Xbox 360 té diversos dispositius d'emmagatzematge, inclòs un disc dur i una unitat de memòria. Quan deseu dades per a jocs, etc., Xbox 360 ve de sèrie amb una interfície d'usuari (interfície d'usuari) que us permet triar en quin dispositiu voleu desar dades. (Vegeu la figura anterior)
En aquest exemple, utilitzem aquesta interfície d'usuari per obtenir el camí de destinació.
Addició d'un component de serveis de jocs
La interfície d'usuari de selecció de dispositius de desament funciona de manera asíncrona amb el joc real. Per aconseguir-ho, heu d'afegir un servei de jocs i fer que el servei de jocs condueixi la interfície d'usuari de selecció de dispositius de desament.
// 非同期処理を行うためのゲームサービスコンポーネントを追加
this.Components.Add(new GamerServicesComponent(this));
GamerServicesComponent
constructor
Creeu una instància de GamerServicesComponent per gestionar el servei de jugador.
joc | Joc | Aquest component i la seva classe de joc associada. |
Comença a mostrar la interfície d'usuari de selecció del dispositiu d'emmagatzematge
Per visualitzar la interfície d'usuari de selecció de dispositius de desament, crideu al mètode "Guide.BeginShowStorageDeviceSelector" al mètode Update. Tanmateix, la interfície d'usuari de selecció de dispositius de desament no es mostrarà en el moment de cridar aquest mètode, sinó que serà cridada pel servei de joc que acabeu d'afegir.
El primer argument del mètode Guide.BeginShowStorageDeviceSelector especifica el mètode que es cridarà després de seleccionar el dispositiu a la interfície d'usuari Desa el selector de dispositius. Heu de definir aquest mètode vosaltres mateixos (vegeu la secció següent).
El segon argument es pot establir a qualsevol dada. Si voleu utilitzar algunes dades després de seleccionar un dispositiu d'emmagatzematge, definiu aquest paràmetre a les vostres pròpies dades.
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
Guide.BeginShowStorageDeviceSelector
mètode
Inicia el procés per visualitzar la interfície d'usuari de selecció del dispositiu d'emmagatzematge. Aquesta operació es fa de manera asíncrona amb el procés del joc.
Resposta | Devolució de trucada asíncrona | Defineix el mètode que es crida després de seleccionar el dispositiu de desament. |
estat | Objecte | Definiu les vostres pròpies dades per utilitzar-les per al processament asíncron. |
Per cert, aquesta interfície d'usuari de selecció de dispositius de desament no es mostra perquè es selecciona automàticament si només hi ha un dispositiu connectat. Tampoc es mostra a Windows.
Mètode de processament després de seleccionar un dispositiu d'emmagatzematge
El mètode especificat al mètode Guide.BeginShowStorageDeviceSelector es defineix per acceptar 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;
}
}
}
Aquest mètode s'anomena quan heu acabat el procés de selecció de dispositius a la interfície d'usuari de desament de selecció de dispositius.
Podeu rebre un dispositiu de desament passant el resultat passat per l'argument (IAsyncResult) a l'argument de "Guide.EndShowStorageDeviceSelector". Tingueu en compte que si cancel·leu la selecció, es retornarà null.
Guide.EndShowStorageDeviceSelector
mètode
Mostra la interfície d'usuari de selecció de dispositius desats i rep el dispositiu desat.
asyncResult | IAsyncResult | Passa el resultat de la selecció de desament del dispositiu. |
Valors retornats | Dispositiu d'emmagatzematge | El dispositiu d'emmagatzematge seleccionat. Si es cancel·la la selecció, es retorna null. |
Comproveu si el dispositiu està realment connectat amb la propietat "StorageDevice.IsConnected" i obriu el contenidor amb el mètode "StorageDevice.OpenContainer". L'argument del mètode StorageDevice.OpenContainer és el nom del contenidor. Aquest nom identifica el contenidor on s'emmagatzemen les dades.
StorageDevice.IsConnected
propietat
Retorna true si el dispositiu s'ha connectat correctament; en cas contrari, false.
StorageDevice.OpenContainer
mètode
Obre el contenidor d'emmagatzematge amb el nom especificat.
titleNom | corda | El nom del contenidor. |
Valors retornats | Contenidor d'emmagatzematge | Recupera el contenidor d'emmagatzematge amb el nom especificat. |
Un cop tingueu el contenidor, podeu utilitzar la propietat StorageContainer.Path per obtenir el camí on s'emmagatzema el fitxer.
StorageContainer.Path
propietat
Obté el camí del fitxer de desament del joc de l'usuari.
Tingueu en compte que la interfície d'usuari de selecció del dispositiu d'emmagatzematge és un procés asíncron
A l'exemple, mentre es mostra la interfície d'usuari de selecció de dispositius de desament, compta cada fotograma per assegurar-se que s'executa de manera asíncrona i mostra el recompte. Si realment l'executeu, podeu veure que el valor del comptador augmenta en segon pla fins i tot mentre es mostra la interfície d'usuari de selecció de dispositius.
Si realment esteu fent un joc, heu de tenir-ho en compte i aturar el progrés del joc mentre seleccioneu un dispositiu. Alternativament, és possible que vulgueu aturar el progrés, però continuar amb els efectes i altres efectes de pantalla. Aquesta àrea s'ha d'ajustar perquè coincideixi amb el joc real.
Tots els codis
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);
}
}
}