9.4 キーボード入力
9.4.1 テキスト入力画面の表示
ゲーム内で、プレイヤーに何らかの自由なテキストを入力してもらいたいことがあります。例えば、謎解きのシミュレーションゲームで扉を開けるパスワードを入力させたり、サスペンス系のゲームで犯人の名前を入力させたり、または RPG などでキャラクターの名前を入力させたりするといった場合です。実際に Xbox 360 のゲーム中にブレードが表示されてキー入力を促すことがありますが、これと同じことが XNA Framework ゲームからでも可能です。
ゲーマーサービスに対応しているゲームであれば BeginShowKeyboardInput() メソッドを呼び出すことで、キー入力画面を表示できます。メッセージボックスと同じように、キー入力は非同期に行われます。このメソッドは、プレイヤーからの応答を待たずに制御を返します。
public static IAsyncResult BeginShowKeyboardInput ( PlayerIndex player, string title, string description, string defaultText, AsyncCallback callback, Object state )
player パラメータには、キーボード入力画面を表示する対象のプレイヤー番号を指定します。title パラメータには入力画面のタイトルを、description パラメータには入力内容の詳細を表す説明文を指定します。defaultText パラメータには、キーボード入力画面にデフォルトで入力されているテキストを指定します。
callback パラメータとは、プレイヤーがキーボード入力を終えて画面を閉じたときに呼び出されるデリゲートを指定します。state パラメータには、非同期処理を認識するための任意のオブジェクトを設定します。callback と state パラメータの使い方は、BeginShowMessageBox() メソッドと同じです。BeginShowKeyboardInput() メソッドは、非同期処理の状態を提供する IAsyncResult オブジェクトを返します。
入力されたテキストを取得するには EndShowKeyboardInput() メソッドを使います。このメソッドは、BeginShowMessageBox() メソッドに対応する EndShowMessageBox() と同じで、プレイヤーがキーボード入力を終えてガイドを閉じるまで待機してしまいます。通常は、BeginShowKeyboardInput() メソッドの callback パラメータに指定したデリゲートから呼び出します。
public static string EndShowKeyboardInput (IAsyncResult result)
result パラメータには BeginShowKeyboardInput() メソッドが返した IAsyncResult、または AsyncCallback デリゲートが受け取った IAsyncResult を指定します。メソッドは、キーボード入力されたテキストを文字列として返します。
using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.GamerServices; public class Test : Game { public static void Main(string[] args) { using (Game game = new Test()) game.Run(); } private GraphicsDeviceManager graphicsDeviceManager; private string text; public Test() { graphicsDeviceManager = new GraphicsDeviceManager(this); Components.Add(new GamerServicesComponent(this)); } private void CallbackShowKeyboardInput(IAsyncResult ar) { text = Guide.EndShowKeyboardInput(ar); } protected override void Update(GameTime gameTime) { GamePadState state = GamePad.GetState(PlayerIndex.One); if (!Guide.IsVisible) { if (text != null) { Guide.BeginShowMessageBox( PlayerIndex.One, "入力テキスト", text, new string[] { "OK" }, 0, MessageBoxIcon.None, null, null ); text = null; } if (state.Buttons.A == ButtonState.Pressed) Guide.BeginShowKeyboardInput( PlayerIndex.One, "キー入力", "好きなテキストを入力してください", "I LOVE XNA.", CallbackShowKeyboardInput, null ); } base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.White); base.Draw(gameTime); } }
コード1は、A ボタンを押すとキーボード入力画面が表示されるプログラムです。テキストを入力して閉じると CallbackShowKeyboardInput() メソッドが呼び出されます。この中で EndShowKeyboardInput() メソッドを呼び出して入力されたテキストを取得し、text フィールドに代入しています。テキストが得られると、メッセージボックスで入力されたテキストを表示します。
本書執筆時点で、Windows 上で実行する Games for Windows -LIVE は IME に対応していないため、直接の日本語の入力に対応していません。ただし、日本語のテキストをペーストすることは可能なので入力自体が制限されているものではありません。日本で発売されている Xbox 360 であれば、日本語の入力にも対応しています。
EndShowKeyboardInput() メソッドから得られた文字列を SpriteFont で描画する場合は、入力された文字に対応するフォントが存在するかどうか注意してください。予期しない文字が入力される可能性があるため、基本的に SpriteFont で実行時に得られる動的な文字列を描画することは避けるべきです。