近期发布
专辑列表

Windows Phone 游戏合集
JQueryElement
IEBrowser
WPXNA

在 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 中处理后退按钮

posted @ 2013-05-07 13:43  麦丝平方  阅读(923)  评论(0编辑  收藏  举报