Получение пути к контейнеру хранения
сводка
Возвращает путь к контейнеру хранения для выбранного устройства хранения.
Операционная среда
Необходимые условия
Поддерживаемые версии XNA |
|
Поддерживаемые платформы |
|
Windows Требуемая версия вершинного шейдера | 1.1 |
Требуемая версия пиксельного шейдера Windows | 1.1 |
Операционная среда
платформа |
Как работать с образцом
Рабочая клавиатураXbox | 360 контроллермышь | ||
---|---|---|---|
Выбор запоминающего устройства | A | A | - |
вещество
Сведения о пользовательском интерфейсе выбора запоминающего устройства
Xbox 360 имеет несколько запоминающих устройств, включая жесткий диск и карту памяти. При сохранении данных для игр и т. д. Xbox 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 | Задает метод, который вызывается после выбора устройства сохранения. |
государство | Объект | Задайте собственные данные, которые будут использоваться для асинхронной обработки. |
Кстати, этот пользовательский интерфейс выбора устройства сохранения не отображается, потому что он автоматически выбирается, если подключено только одно устройство. Он также не отображается в 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
метод
Отображает пользовательский интерфейс выбора устройства для сохранения и получает устройство для сохранения.
asyncРезультат | IAsyncResult | Передайте результат выбора устройства для сохранения файла. |
Возвращаемые значения | Устройство хранения данных | Выбранное запоминающее устройство. Если выбор отменен, возвращается значение null. |
Проверьте, действительно ли устройство подключено, с помощью свойства "StorageDevice.IsConnected" и откройте контейнер с помощью метода "StorageDevice.OpenContainer". Аргументом метода StorageDevice.OpenContainer является имя контейнера. Это имя определяет контейнер, в котором хранятся данные.
StorageDevice.IsConnected
свойство
Возвращает значение true, если устройство успешно подключено; в противном случае — false.
StorageDevice.OpenContainer
метод
Открывает контейнер хранения с указанным именем.
titleName | струна | Имя контейнера. |
Возвращаемые значения | StorageContainer | Извлекает контейнер хранения с указанным именем. |
Получив контейнер, вы можете использовать свойство 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);
}
}
}