Nhận đường dẫn của vùng chứa lưu trữ
tóm tắt
Nhận đường dẫn vùng chứa lưu trữ cho thiết bị lưu trữ đã chọn.
Môi trường hoạt động
Điều kiện tiên quyết
Các phiên bản XNA được hỗ trợ |
|
Nền tảng được hỗ trợ |
|
Phiên bản Vertex Shader yêu cầu của Windows | 1.1 |
Phiên bản Pixel Shader yêu cầu của Windows | 1.1 |
Môi trường hoạt động
nền tảng |
Cách làm việc với mẫu
điều khiển XboxBàn phím hoạt độngBộ | 360chuột | ||
---|---|---|---|
Chọn thiết bị lưu trữ | Một | Một | - |
chất
Giới thiệu về giao diện người dùng lựa chọn thiết bị lưu trữ
Xbox 360 có nhiều thiết bị lưu trữ, bao gồm ổ cứng và bộ nhớ. Khi lưu dữ liệu cho trò chơi, v.v., Xbox 360 đi kèm tiêu chuẩn với giao diện người dùng (giao diện người dùng) cho phép bạn chọn thiết bị để lưu dữ liệu. (Xem hình trên)
Trong mẫu này, chúng ta sử dụng giao diện người dùng này để lấy đường dẫn đích.
Thêm thành phần dịch vụ trò chơi
Giao diện người dùng chọn thiết bị lưu hoạt động không đồng bộ với trò chơi thực tế. Để thực hiện việc này, bạn cần thêm dịch vụ trò chơi và để dịch vụ trò chơi điều khiển giao diện người dùng chọn thiết bị lưu.
// 非同期処理を行うためのゲームサービスコンポーネントを追加
this.Components.Add(new GamerServicesComponent(this));
GamerServicesComponent
Constructor
Tạo một phiên bản của GamerServicesComponent để xử lý dịch vụ game thủ.
trò chơi | Trò chơi | Thành phần này và lớp trò chơi liên quan của nó. |
Bắt đầu hiển thị giao diện người dùng lựa chọn thiết bị lưu trữ
Để hiển thị giao diện người dùng chọn thiết bị lưu, hãy gọi phương thức "Guide.BeginShowStorageDeviceSelector" trong phương thức Update. Tuy nhiên, giao diện người dùng chọn thiết bị lưu sẽ không được hiển thị tại thời điểm gọi phương thức này mà sẽ được gọi bởi dịch vụ trò chơi bạn vừa thêm.
Đối số đầu tiên của phương thức Guide.BeginShowStorageDeviceSelector chỉ định phương thức sẽ được gọi sau khi thiết bị được chọn trong giao diện người dùng Lưu bộ chọn thiết bị. Bạn phải tự xác định phương pháp này (xem phần tiếp theo).
Đối số thứ hai có thể được đặt thành bất kỳ dữ liệu nào. Nếu bạn muốn sử dụng một số dữ liệu sau khi chọn thiết bị lưu trữ, hãy đặt thông số này thành dữ liệu của riêng bạn.
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
Guide.BeginShowStorageDeviceSelector
phương pháp
Bắt đầu quá trình hiển thị giao diện người dùng lựa chọn thiết bị lưu trữ. Thao tác này được thực hiện không đồng bộ với quá trình trò chơi.
gọi lại | AsyncCallback | Đặt phương thức được gọi sau khi thiết bị lưu được chọn. |
tiểu bang | Đối tượng | Đặt dữ liệu của riêng bạn để sử dụng cho quá trình xử lý không đồng bộ. |
Nhân tiện, giao diện người dùng chọn thiết bị lưu này không được hiển thị vì nó được chọn tự động nếu chỉ có một thiết bị được kết nối. Nó cũng không được hiển thị trên Windows.
Phương pháp xử lý sau khi chọn thiết bị lưu trữ
Phương thức được chỉ định trong phương thức Guide.BeginShowStorageDeviceSelector được xác định để chấp nhận 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;
}
}
}
Phương thức này được gọi khi bạn đã hoàn tất quá trình chọn thiết bị trong giao diện người dùng chọn thiết bị lưu.
Bạn có thể nhận một thiết bị lưu bằng cách chuyển kết quả được truyền bởi đối số (IAsyncResult) đến đối số của "Guide.EndShowStorageDeviceSelector". Lưu ý rằng nếu bạn hủy lựa chọn, null sẽ được trả về.
Guide.EndShowStorageDeviceSelector
phương pháp
Hiển thị giao diện người dùng lựa chọn thiết bị lưu và nhận thiết bị lưu.
kết quả không đồng bộ | Kết quả IAsyncResult | Vượt qua kết quả chọn thiết bị lưu. |
Giá trị trả về | Thiết bị lưu trữ | Thiết bị lưu trữ đã chọn. Nếu lựa chọn bị hủy, null sẽ được trả về. |
Kiểm tra xem thiết bị có thực sự được kết nối với thuộc tính "StorageDevice.IsConnected" hay không và mở vùng chứa bằng phương thức "StorageDevice.OpenContainer". Đối số cho phương thức StorageDevice.OpenContainer là tên của vùng chứa. Tên này xác định vùng chứa mà dữ liệu được lưu trữ.
StorageDevice.IsConnected
tài sản
Trả về true nếu thiết bị được kết nối thành công; nếu không, false.
StorageDevice.OpenContainer
phương pháp
Mở vùng chứa lưu trữ với tên được chỉ định.
tên tiêu đề | xâu | Tên của thùng chứa. |
Giá trị trả về | Thùng chứa | Truy xuất vùng chứa lưu trữ có tên được chỉ định. |
Khi bạn có vùng chứa, bạn có thể sử dụng thuộc tính StorageContainer.Path để lấy đường dẫn nơi tệp được lưu trữ.
StorageContainer.Path
tài sản
Nhận đường dẫn tệp của tệp lưu trò chơi của người dùng.
Hãy xem xét rằng giao diện người dùng lựa chọn thiết bị lưu trữ là một quy trình không đồng bộ
Trong mẫu, trong khi giao diện người dùng lựa chọn thiết bị lưu được hiển thị, nó đếm mọi khung hình để đảm bảo rằng nó đang chạy không đồng bộ và hiển thị số lượng. Nếu bạn thực sự chạy nó, bạn có thể thấy rằng giá trị của bộ đếm tăng lên trong nền ngay cả khi giao diện người dùng lựa chọn thiết bị được hiển thị.
Nếu bạn thực sự đang tạo một trò chơi, bạn phải tính đến điều này và dừng tiến trình của trò chơi trong khi bạn đang chọn một thiết bị. Ngoài ra, bạn có thể muốn dừng tiến trình, nhưng vẫn tiếp tục các hiệu ứng và các hiệu ứng màn hình khác. Khu vực này cần được điều chỉnh để phù hợp với trò chơi thực tế.
Tất cả mã
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);
}
}
}