在 XNA 中处理后退按钮
如果你希望在 Windows Phone 上创建游戏,那么 XNA 是一个选择。平方会和你一起探讨和学习 Windows Phone 中 XNA 的小知识。
商城审核
如果你希望自己的游戏通过 Windows Phone 商城的审核,那么你就需要对后退按钮做一些特殊处理。
如果在游戏进行过程中,用户按下了后退键,那么应该提示用户是否退出当前的关卡,并使游戏进入暂停的状态。
如果用户在主屏幕按下后退键,则你应该询问用户是否退出整个游戏。
捕获后退按钮
在默认的情况下,项目中的 Game 类已经包含了对后退按钮的判断。
1 protected override void Update ( GameTime gameTime ) 2 { 3 4 if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed ) 5 this.Exit ( ); 6 7 base.Update ( gameTime ); 8 }GamePad 类表示游戏控制器,通过 GetState 方法可以获取某一个玩家的控制器状态,比如:玩家一的游戏手柄状态。但是在 Windows Phone 中,只需要通过 PlayerIndex.One 获取玩家一的控制器状态。
而 GetState 方法将返回一个 GamePadState 对象,也就是控制器的状态。Buttons 属性可以获取控制器上的各种按钮,在上面的代码中,我们获取了 Back 属性,它是一个枚举值,用来表示后退按钮的状态。我们判断如果后退按钮按下,则退出游戏。
询问用户
在上面的代码中,如果你按下后退键,那么游戏会直接退出。所以我们需要添加一些代码,询问用户是否退出。
1 protected override void Update ( GameTime gameTime ) 2 { 3 4 if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed ) 5 Guide.BeginShowMessageBox ( "退出", "是否退出游戏?", new string[] { "是", "否" }, 1, MessageBoxIcon.None, new AsyncCallback ( this.userSelected ), null ); 6 7 base.Update ( gameTime ); 8 } 9 10 private void userSelected ( IAsyncResult result ) 11 { 12 13 if ( !result.IsCompleted ) 14 return; 15 16 int? index = Guide.EndShowMessageBox ( result ); 17 18 if ( index.HasValue && index.Value == 0 ) 19 this.Exit ( ); 20 21 }我们使用了 Guide 类的 BeginShowMessageBox 来弹出一个对话框,让用户选择是否退出游戏。方法 userSelected 用来判断用户的选择结果。用户可以选择是或者否。
在方法 userSelected 中,result 参数表示用户的选择,IsCompleted 属性表示用户是否完成了选择。然后可以使用 Guide 类的 EndShowMessageBox 方法来获取用户选择的按钮。在我们的代码中,0 表示是,1 表示否。注意变量 index,它并不是 int 类型而不是 int?。
我们可以增加两个字段来表示,玩家是否正在进行游戏和游戏是否暂停了。根据这两个变量来显示不同的对话框。
Windows Phone 7.x
在 Windows Phone 7.x 设备中,当用户按下后退键之后,我们弹出了对话框,如果在对话框显示之前,用户再次按下后退键,则 BeginShowMessageBox 将再次执行,这可能会引发一个异常。如果要避免这个错误,你可以设置一个字段用来判断对话框是否显示,如果正在显示则不能再次显示。
1 private bool isMessageBoxShow = false; 2 3 protected override void Update ( GameTime gameTime ) 4 { 5 6 if ( GamePad.GetState ( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed && !this.isMessageBoxShow ) 7 { 8 this.isMessageBoxShow = true; 9 Guide.BeginShowMessageBox ( "退出", "是否退出游戏?", new string[] { "是", "否" }, 1, MessageBoxIcon.None, new AsyncCallback ( this.userSelected ), null ); 10 } 11 12 base.Update ( gameTime ); 13 } 14 15 private void userSelected ( IAsyncResult result ) 16 { 17 this.isMessageBoxShow = false; 18 19 if ( !result.IsCompleted ) 20 return; 21 22 int? index = Guide.EndShowMessageBox ( result ); 23 24 if ( index.HasValue && index.Value == 0 ) 25 this.Exit ( ); 26 27 }
完,欢迎访问我在他处发布的同一文章:在 XNA 中处理后退按钮