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

  • 相关阅读:
    .NET ORM 的 “SOD蜜”--零基础入门篇
    EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
    PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
    DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
    64位系统使用Access 数据库文件的彻底解决方法
    DDD为何叫好不叫座?兼论DCI与业务分析的方法论
    买的永远没有卖的精:评北京联通宽带送电视送手机优惠促销活动
    在数据库上实现类似铁路售票锁票功能
    .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
    U深度利用iso文件制作U盘启动盘
  • 原文地址:https://www.cnblogs.com/zoyobar/p/xna2.html
Copyright © 2020-2023  润新知