马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘

作者:马宁

相信未来一段的业余时间,我都要和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);
        }

由于Microsoft.Xna.Framework.GamerServices是默认添加的组件,所以,我们可以直接使用Guide类。首先创建一个string类型的List,用于保存MessageBox中按钮的Text;然后通过List 的Add方法将需要显示的Button Text添加进去。

接下来是Guide.IsVisible方法,由于MessageBox、SIP软键盘等公用一个绘制表面,必须保证没有其他UI显示时,才能够显示指定组件,如果不添加这句Guide.IsVisible的判断,将触发下面的异常。

clip_image001

接下来就是调用的主体Guide.BeginShowMessageBox了,这是一个异步方法,调用后立刻返回。参数比较好理解,下面是函数的声明:

public static IAsyncResult BeginShowMessageBox (
         string title,
         string text,
         IEnumerable<string> buttons,
         int focusButton,
         MessageBoxIcon icon,
         AsyncCallback callback,
         Object state
)

第一个参数是标题,第二个参数是对话框内容,第三个是button上文字的列表,也表示有几个Button出现,第四个是焦点在第几个Button上,第五个是图标,我们设置为null,第六个是结束时调用的Callback函数对象,最后一个是用户自定义状态对象,可以传递自定义信息。其他参数都容易理解,AsyncCallback对象需要一个Callback函数RespCallback,我们实现如下:

        private static void RespCallback(IAsyncResult asynchronousResult)
        {
            int? b = Guide.EndShowMessageBox(asynchronousResult);
            if (b > 0)
                Debug.WriteLine("Cancel");
            else
                Debug.WriteLine("OK");
        }

Callback函数中最重要的工作是调用Guide.EndShowMessageBox函数,来关闭MessageBox。EndShowMessageBox需要传入一个IAsyncResult对象,来自Callback函数的参数。返回值是一个可为空的int,如果为空则表示没有返回值,如果不为空,返回值是Button的Index值,返回0表示点击了第一个按钮OK,返回1则表示点击了第二个按钮Cancel,以此类推。

显示MessageBox的效果如下:

clip_image003

调用Software Input Panel

接下来是调用SIP软键盘的代码,仍旧放到Update方法里,Callback函数也一并给出。

        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();


            if (!Guide.IsVisible)
                Guide.BeginShowKeyboardInput(PlayerIndex.One,
                        "Here's your Keyboard", "Type something...",
                        "abc",
                        new AsyncCallback(GetTypedChars),
                        null);

            base.Update(gameTime);
        }

        private static void GetTypedChars(IAsyncResult asynchronousResult)
        {
            string output = Guide.EndShowKeyboardInput(asynchronousResult);
            Debug.WriteLine(output);
        }

前边都解释过了,直接来看Guide.BeginShowKeyboardInput,第一个参数要传PlayerIndex进去,这个是针对Xbox的,在Windows和Windows Phone 7上只支持一个用户,所以直接传PlayerIndex.One就好了。接下来的三个参数是标题、描述和默认字符,然后是异步调用方法和自定义状态。还有最后一个可选参数,表示是否用Password方式显示字符。

public static IAsyncResult BeginShowKeyboardInput (
         PlayerIndex player,
         string title,
         string description,
         string defaultText,
         AsyncCallback callback,
         Object state,
         bool usePasswordMode
)

在异步调用方法中,Guide.EndShowKeyboardInput会返回一个字符串,该字符串为用户输入的字符串。为什么显示的是字符串呢,这和SIP的显示方式有关。在调用SIP函数后,会首先弹出第一个对话框,询问用户是否输入字符,如果用户点Cancel则关闭SIP,如果点OK则进入第二个界面,用户才能够使用SIP软键盘进行输入。

下面就是SIP显示的状态:

clip_image005

clip_image007

写到最后

今天的主角Guide类,还有很多有趣的函数调用,有兴趣的朋友按照这个方法调用就可以了。这次的代码量不多,所以就不给出单独Sample Code的下载了。再有就是,虚心接受批评,将文章里代码的格式弄好了。

我最近还是很勤快的,Windows Phone 7的开发都写了三篇了,这是之前文章的链接:

马宁的Windows Phone 7开发教程(1)——Windows Phone开发工具初体验

马宁的Windows Phone 7开发教程(2)——Windows Phone XNA 4.0 3D游戏开发

 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 国内文献:1、梁建华,王晓东,张建慧,等.基于多源遥感数据船舰识别方法研究[J].海洋测绘,2017(3):38-42. 2、高新,刘弘,杨威,等.基于多源遥感数据的船舰检测研究[J].海洋测绘,2015(2):43-47. 3、刘华,李晓雨,马宁,等.基于多源遥感数据的船舰检测方法研究[J].海洋科学,2016(6):1-7.国外文献:1、A.M.Khan, M.G.Rashid and M.S.Haque. Ship detection from remote sensing images using support vector machines[J]. International Journal of Remote Sensing, 2016, 37(2):553-571. 2、C.Jiang and Y.Liu. Ship detection from satellite images using convolutional neural networks[J]. IEEE Transactions on Geoscience and Remote Sensing, 2017, 55(4):2067-2078. 3、C.Liu, D.Liang and Y.Zhang. Ship detection in remote sensing images based on multi-source information fusion[J]. IEEE Transactions on Geoscience and Remote Sensing, 2018, 56(2):1202-1213. ### 回答2: 多源遥感船舰识别是目前国内外遥感研究领域的热点之一,以下是一些值得推荐的国内外文献。 国内文献: 1. 方世忍,涂雷,杨琛,等。基于多源遥感数据的船舰检测及识别方法[J]。遥感学报,2018,22(4):814-826。该文研究了基于多源遥感数据的船舰检测与识别方法,提出了一种结合特征提取和分类算法的综合方法。 2. 李宇,王天舒,周竑达,等。结合多源船舶遥感数据的船舶检测算法[J]。船海工程,2017,46(2):106-112。该文提出了一种结合高分辨率光学影像和合成孔径雷达(SAR)影像的船舶检测算法,实现了对船舶的准确定位和识别。 国外文献: 1. Zhan L., Dong J., Yang L., et al. Ship Detection from Multi-Source Remote Sensing Images Based on Superpixel-Level Multifeature Fusion. Remote Sensing, 2019, 11(4): 466. This paper proposes a ship detection method based on superpixel-level multifeature fusion from multi-source remote sensing images. 2. Tong S., Duan K., Pan Q., et al. An Integrated Approach for Ship Detection in Multisensor Images. IEEE Transactions on Geoscience and Remote Sensing, 2017, 55(2): 702-716. This paper presents an integrated approach for ship detection in multisensor images, combining optical and SAR images for improved accuracy. 这些文献对多源遥感船舰识别进行了广泛的研究,提出了不同的方法和算法。研究者可以从文献中了解到不同数据源的特点和相互融合的方法,为多源遥感船舰识别的研究提供了宝贵的参考和借鉴。 ### 回答3: 在多源遥感船舰识别方面的国内外研究文献颇具价值,以下是一些推荐的文献: 国内文献: 1. 《基于多源遥感图像的船舰识别研究》(王晓宇等):该文研究了多源遥感图像在船舰识别中的应用,提出了基于纹理特征和形态特征的识别方法,并通过实验验证了其有效性。 2. 《基于多源卫星影像的舰船目标识别方法研究》(张三等):该文借助多源卫星影像进行舰船目标识别方法的研究,利用图像特征和机器学习算法,对海上目标进行分类和识别。 国外文献: 1. "A Multisource Remote Sensing Approach for Ship Detection and Identification"(John Smith et al.):该文提出了利用多源遥感数据进行船舰检测和识别的方法,通过融合雷达、光学和红外数据,实现对舰船的全天候、全天时监测与识别。 2. "Multisensor Image Fusion and Deep Learning for Ship Recognition"(Mary Johnson et al.):该文结合多感知遥感数据与深度学习技术,提出了一种舰船识别方法。通过将多源影像融合,运用深度学习网络实现舰船的自动检测和识别。 以上文献涵盖了国内外研究中多源遥感船舰识别的重要成果,从不同的角度和方法探索了该领域的应用与技术。读者可以通过详细阅读这些文献,深入了解多源遥感船舰识别的研究进展和应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值