XNA 中的返回按钮
我将与你一起探索和学习用于 Windows Phone 的 XNA。
原始文章可以在 这里 找到。
简介/目录
如果你想为 Windows Phone 创建游戏,那么 XNA 是一个不错的选择。现在,我将与你一起探索和学习用于 Windows Phone 的 XNA。
- Marketplace 审核
- 捕获返回按钮
- 询问用户
- Windows Phone 7.x
- Marketplace 审核
如果你希望你的游戏通过 Windows Phone Marketplace 的审核,那么你需要对返回按钮进行一些特殊处理。
当用户在游戏过程中按下返回按钮时,你应该询问用户是否退出当前关卡并暂停游戏。
当用户在主屏幕上按下返回按钮时,你应该询问用户是否退出游戏。
捕获返回按钮
默认情况下,项目中的 Game
类已经包含有关返回按钮的代码。
protected override void Update ( GameTime gameTime )
{
if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed )
this.Exit ( );
base.Update ( gameTime );
}
GamePad
是一个游戏手柄类。使用 GetState
方法获取玩家的游戏手柄。但在 Windows Phone 中,我们只需要获取玩家 I 的游戏手柄。
GetState
方法返回 GamePadState
类,这是游戏手柄的状态。属性 Buttons 是游戏手柄上的按钮,在上面的代码中,我们获取 Back 属性,这是返回按钮的状态。如果按下返回按钮,则退出游戏。
询问用户
在上面的代码中,如果你按下返回按钮,则会退出游戏。因此,我们需要添加一些代码来询问用户是否退出。
protected override void Update ( GameTime gameTime )
{
if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed )
Guide.BeginShowMessageBox ( "Exit", "Do you want to exit?",
new string[] { "Yes", "No" }, 1,
MessageBoxIcon.None, new AsyncCallback ( this.userSelected ), null );
base.Update ( gameTime );
}
private void userSelected ( IAsyncResult result )
{
if ( !result.IsCompleted )
return;
int? index = Guide.EndShowMessageBox ( result );
if ( index.HasValue && index.Value == 0 )
this.Exit ( );
}
我们使用 Guide
类的 BeginShowMessageBox
方法弹出一个对话框,让用户选择是否退出游戏。userSelected
方法用于确定用户的选择,他们可以选择“是”或“否”。
在 userSelected
方法中,参数 result 表示用户的选择,属性 IsCompleted
表示用户是否完成了选择。你可以使用 Guide 的 EndShowMessageBox
方法获取按钮索引。在我们的代码中,0 表示“是”。注意变量 index,它不是 int
,而是 int?
。
我们可以添加两个额外的字段来表示玩家是否正在游戏以及游戏是否暂停。根据这两个变量显示不同的对话框。
Windows Phone 7.x
在 Windows Phone 7.x 设备上,当用户按下返回按钮时,如果用户在显示对话框之前再次按下返回按钮,BeginShowMessageBox
可能会抛出异常。如果你想避免此错误,你可以设置一个字段来确定是否显示对话框。
private bool isMessageBoxShow = false;
protected override void Update ( GameTime gameTime )
{
if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back ==
ButtonState.Pressed && !this.isMessageBoxShow )
{
this.isMessageBoxShow = true;
Guide.BeginShowMessageBox ( "Exit", "Do you want to exit?", new string[]
{ "Yes", "No" }, 1, MessageBoxIcon.None,
new AsyncCallback ( this.userSelected ), null );
}
base.Update ( gameTime );
}
private void userSelected ( IAsyncResult result )
{
this.isMessageBoxShow = false;
if ( !result.IsCompleted )
return;
int? index = Guide.EndShowMessageBox ( result );
if ( index.HasValue && index.Value == 0 )
this.Exit ( );
}
更多内容,请访问 Developer。