相信未來一段的業餘時間,我都要和XNA為伍了。本來想向3D開發的縱深發展 ,但是遇到了一個實際的問題,就是如何在XNA下顯示MessageBox和Software Input Panel。乾脆先寫出來吧,省得大家遇到這問題時抓狂。
按照為數不多的公開文檔描述,XNA和Silverlight for Windows Phone應該 是基於同一個.NET Compact Framework的CLR。但是,XNA並沒有提供任何使用者控 件、MessageBox和軟鍵盤等,也不能直接調用Silverlight for Windows Phone 的類庫。這樣勢必為XNA製造了很多人為的障礙。但調用MessageBox和Software Input Panel的後門,XNA還是給我們留下了,這就是 Microsoft.Xna.Framework.GamerServices命名空間下的Guide類,類描述如下:
http://msdn.microsoft.com/en- us/library/microsoft.xna.framework.gamerservices.guide.aspx
該類不但可以調用MessageBox和軟鍵盤,還能夠調用Marketplace、XBox Live等表單。不過,值得注意的是,Guide類提供的方法都是非同步呼叫,而非同 步調用,這也好理解,遊戲的處理過程是以時間驅動的,所以任何操作不應該阻 塞住遊戲主線程。
Guide類調用MessageBox和軟鍵盤的描述在這裡:
http://msdn.microsoft.com/en-us/library/ff827869.aspx
http://msdn.microsoft.com/en-us/library/ff827868.aspx
但MSDN文檔還是有一些瑕疵,按上面提供的方法會產生Exception,所以我在 下面給出修改後可以啟動並執行方法。運行環境基於VS 2010 + Windows Phone 7 SDK RTW版。
調用MessageBox
建立Windows Phone 7中XNA 4.0的工程,然後,我們在 Update方法裡添加對於MessageBox的調用。當然,大家請不要認為把MessageBox 加到Update裡正確的,這樣會造成MessageBox不斷彈出。我只是為了簡化代碼, 才這麼做的。
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
List<string> MBOPTIONS = new List<string>();
MBOPTIONS.Add("OK");
MBOPTIONS.Add("CANCEL");
if (!Guide.IsVisible)
Guide.BeginShowMessageBox("test", "hello, XNA", MBOPTIONS, 0, MessageBoxIcon.Alert, new AsyncCallback(RespCallback), null);
base.Update(gameTime);
}