Windows Phone编程简介:第1部分(译文)
By S.F.
本文链接 https://www.kyfws.com/news/introduction-to-windows-phone-programming-part/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 12 分钟阅读 - 5890 个词 阅读量 0Windows Phone编程简介:第1部分(译文)
原文地址:https://www.codeproject.com/Articles/108022/Introduction-to-Windows-Phone-Programming-Part
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
这是有关Windows Phone 7开发的多部分博客文章的第一部分.在这篇文章中,我将介绍新的操作系统并从XNA编程开始.
我正在撰写有关Windows Phone编程的文章,而不是等待整个文章完成,而是决定开始提供这些部分.我的计划是涵盖XNA(2D和3D)和Silverlight概念.我计划将完成的文章以及代码示例放到CodeProject.com上,然后再开始编写XNA 3D游戏制作文件.如果您在该草案中发现任何需要正确,进一步详细或改进的内容,请随时告诉我.
介绍
本文将使.NET开发人员从Windows Phone 7开发入手,并介绍WP7中可用的基本应用程序模型和服务.
先决条件
本文的目标读者是已经熟悉C#并使用.NET开发环境的开发人员.对于VB开发人员,请注意,目前,VB语言不支持用于创建Windows Phone 7应用程序的语言. C#是唯一可用的语言.
您需要什么一览
如果今天要创建一个新的开发环境,那么您将需要这些:
如果要出售应用程序或在真实硬件上安装或测试它们,则还需要满足以下条件:
仅供参考,在仿真器中使用Windows Phone工具的能力将受到很大限制.
从Windows Mobile出发
对于新的Windows Phone开发人员,要接受的最困难的事情之一(假设开发人员具有以前的Windows Mobile操作系统的经验)是Windows Phone不是Windows Mobile.从API角度来看,它们都是在CE内核之上运行的操作系统,但是Windows Mobile和Windows Phone的共同点很少. Windows Phone 7与Windows Mobile应用程序不兼容.除了仅运行签名代码的可选限制之外,Windows Mobile不会主动限制应用程序可以执行的操作. 您为Windows Mobile编写的所有应用程序都需要重写才能在Windows Phone 7上运行.如果您的代码具有适当的关注点分离,那么您必须重写的代码量将会减少.但是无论哪种方式,都需要一个不同的二进制文件. 如果您有开发Windows Mobile的经验和期望,现在是时候将它们抛在后面了.不存在您从Windows Mobile熟悉的API.相反,存在完全不同的东西.您也无法从代码内访问整个系统.相反,您的代码将在沙箱中运行.我不想在这里讨论所有差异.但是请理解,Windows Mobile和Windows Phone 7几乎没有相似之处.
开发硬件和软件要求
要开始Windows Phone 7开发,您将需要一台运行Windows Vista SP 2或更高版本(可以使用入门版以外的任何版本)或Windows 7版本的计算机.您至少需要2 GB的RAM.如果您打算使用仿真器(除非您拥有Windows Phone 7设备,否则很有可能会这样做),计算机中的视频显示必须支持DirectX 10并具有兼容WDDM 1.1的驱动程序.如果您的视频显示器没有足够的支持,则模拟器将无法在您的计算机上正常工作. 可选地,仿真器将为您的台式机或笔记本电脑提供触摸屏显示.更好的是,如果您的计算机具有支持多点触控的显示器,那么仿真器也可以利用它.时不时地出现一个问题,即模拟器是否支持Wacom提供的多点触摸平板电脑.这些平板电脑将您的手势转换为鼠标消息,例如滚动消息.它们不传输发生多点触摸交互的实际点.
手机硬件要求
Windows Phone 7的硬件要求比Windows Mobile更高. Windows Mobile设计为能够在只有200MHz处理器,32MB ram且可能没有视频加速器或FPU的设备上运行. Windows Phone 7的标准明显更高.
这些是最低硬件要求.因此,一部电话可能超出了这些要求.此外,所有Windows Phone的设备正面都将具有三个按钮.开始按钮,后退按钮和搜索按钮.
Windows移动市场注册
如果要将程序部署到自己的硬件上或要分发,则需要在市场中注册.如果不注册,您仍然可以创建Windows Phone 7程序.但是这些程序只能在您的模拟器中运行. (换句话说,所有形式的部署都需要注册市场.) 在市场中注册后,您最多可以将三个设备注册为将用于开发的设备.在撰写本文时,一般公众尚不知道用于注册设备的确切程序(本文的此部分将在更新时更新).
为您的开发环境设置
对于Windows Phone 7开发,您可以选择使用完整版本的Visual Studio 2010或Express版本之一.如果计划使用完整版本之一,请先安装它.安装后,请继续安装Windows Phone工具. 要安装Windows Phone工具,请转到http://developer.windowsphone.com,然后选择选项以下载Windows Phone工具.初始下载只有3兆.这只是安装程序的引导程序.它将检查您的系统以查看需要哪些组件,然后它将下载并安装这些组件.
Windows Phone 7支持的应用程序类型
Windows Phone 7支持两种应用程序类型; Silverlight和XNA. Microsoft的Silverlight技术可以以多种形式(在Windows PC,Linux PC,Mac OS X,Symbian,Windows CE)上使用.该技术允许以声明方式构建可缩放至不同分辨率的用户界面,并内置了对平滑过渡和视觉效果,媒体的支持,并且对Web服务具有强大的支持. XNA可在Windows Phone,Windows桌面和Xbox 360上使用.XNA框架在设计时考虑了游戏,并支持硬件加速的2维和3维图形,对音频缓冲区的访问以及各种资源管理.内置功能. 您将获得的一般指导是,如果您要制作游戏,请制作XNA应用程序.如果要制作业务应用程序,请使用Silverlight.但这只是一般性指导,而不是硬性规定.可以使用Silverlight来制作游戏,也可以使用XNA来进行面向业务的事情.您将根据需要与用户进行的交互类型做出决定.两种应用程序类型具有两种完全不同的向用户呈现用户界面的方式.如果使用Silverlight,则将获得可自定义控件的调色板,包括(但不限于)文本框,列表框,按钮等.在设计布局时,您可以选择仅关注现有控件的控件位置,设计这些现有控件的外观样式,甚至创建自己的控件.如果要在XNA中执行相同的操作,则需要负责在运行时将控件放置在自己的变量中,并且还必须编写代码以将控件绘制到屏幕上的适当位置.如果用户触摸屏幕,则需要计算触摸是否与控件之一重叠(很明显,Silverlight在这里胜出).另一方面,如果您需要开发一个需要以较高频率更新显示的应用程序,那么XNA将是首选的应用程序类型.
创建一个简单的XNA应用程序
我们将创建一个基于XNA的简单应用程序.在深入创建应用程序之前,让我们进行测试,以确保您的计算机能够正确地支持模拟器中所需的功能.启动Visual Studio 2010并创建一个新的Windows Phone项目.
将新项目命名为" Hello XNA",然后选择"确定".项目完成后,按F5键运行它.如果您的计算机不满足我前面提到的视频要求,则在部署过程中将收到一条错误消息,指出"显示适配器不符合运行XNA Framework应用程序的模拟器要求".如果收到此错误,则可能需要使用真实的Windows Phone 7硬件来测试您的应用程序,需要更新显示硬件和/或驱动程序以满足要求,或者需要将项目移至另一台计算机上.
恭喜,如果您没有任何错误,那么您就拥有兼容的硬件!您可以停止项目运行,然后返回源代码.
游戏类
创建XNA游戏时,将创建一个继承自Microsoft.Xna.Framework.Game的类,并将覆盖该类上的事件.这些事件将作为内置在此类中的执行循环的一部分进行调用.
XNA应用程序生命周期的简化视图如下:
Update和Draw方法将循环调用,直到您的应用程序终止.
对于第一个示例,我只想在屏幕上显示一些内容.打开绘画编辑器,并使用您的艺术技巧(或者在我的情况下缺乏技巧)来绘制平面.从这样一个角度进行绘制:一个人可能会看到它们的高度是否比俯视图的飞机高,且平面图的顶部朝上.将平面图保持在32x32像素左右,并将其另存为名为" Plane.png"的PNG文件.
返回到Visual Studio.您将在解决方案中看到一个Content项目.右键单击项目,然后选择添加->现有项目.导航到您的飞机并添加.这将使平面图像可作为" Texture2D"对象使用.现在,平面图像在内容资源中可用,我们需要编写将使用该图像的代码.
打开" Game1"类的文件.您会看到该类已经声明了一些成员.在声明字段的部分,您将看到spriteBatch
和graphics
的声明.之后,声明一个名为" _planeTexture"的" Texture2D"元素和一个名为" _planePosition"的" Vector2"元素. _planeTexture元素将包含您刚刚绘制的平面. _planPosition元素将保持平面的X,Y位置.默认情况下,它将是(0,0),我们现在将其保留不变.
在给出的方法中,我们需要做几件事.在LoadContent
方法中,我们将加载平面图像,在Draw
方法中,我们将绘制平面.更改这两种方法,使其看起来如下所示:
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
_planeTexture = Content.Load<Texture2D>("Plane");
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(_planeTexture, _planePosition, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Content.Load ()的目的很直观.对" sprite"批处理对象的调用是为一组图形操作准备一个队列,以便可以将它们立即传递给图形适配器.这比为每个请求的操作调用图形适配器更快.如果现在运行该程序,您将看到计划渲染.
获取输入
XNA支持来自许多不同设备的输入. Xbox控制器,键盘,鼠标,加速度计和触摸屏.即使没有实际的设备,这些输入设备的类也可以在XNA的不同实现中使用(在这种情况下,该类将始终在该虚拟设备上不返回任何活动).我对该程序的下一个更改是从输入设备读取并移动飞机.
阅读触摸输入
我知道Windows Phone 7设备具有4点多点触摸屏.但是我将编写代码,好像目标设备可能没有.这是因为我可能会为没有触摸屏的其他内容重新编译此代码(例如 xbox),或者可能决定针对尚不存在的设备重新编译它.为了确保代码正确地适应XNA的所有不同实现,我将以编程方式询问在尝试使用某个输入设备之前是否存在该输入设备.我只检查一次触摸屏设备的存在.静态方法TouchPanel.GetCapabilities()返回一个TouchCapabilities对象.我对此类的IsConnected
成员感兴趣.如果有可用的触摸屏,则它包含值" true".我将其结果存储在_useTouch中.我比较喜欢使用_useTouch而不是使用_hasTouch,因为可能有可用的设备,但我不想使用它.
在" Update"方法中,我只是检查触摸点是在平面中心的左侧还是右侧,然后将平面移动到距离触摸点更近一个像素的位置.我将飞机的中心点与飞机的位置分开放置(在真正的应用程序中,我不会这样做).它们总是同时更新,因此我知道它们总是同步的.要将此功能添加到您的程序中,请声明一个名为Vectorplane的新字段,名为_planeCenter和一个布尔字段,名为_useTouch.在Initialize()方法内,使用以下代码初始化_useTouch:
protected override void Initialize()
{
base.Initialize();
TouchPanelCapabilities touchCaps = TouchPanel.GetCapabilities();
_useTouch = touchCaps.IsConnected;
_useAccelerometer = (Accelerometer.GetCapabilities().IsConnected());
}
根据接触点更改平面位置的逻辑在" update"方法中.它将如下所示:
if (_useTouch)
{
TouchCollection touchList = TouchPanel.GetState();
if (touchList.Count > 0)
{
var touchPoint = touchList[0];
if (touchPoint.Position.X > _planeCenter.X)
{
++_planeCenter.X;
++_planePosition.X;
}
else if (touchPoint.Position.X < _planeCenter.X)
{
--_planeCenter.X;
--_planePosition.X;
}
}
}
如果您现在运行程序,则飞机将根据您触摸屏幕的位置向左或向右移动.如果进一步扩展逻辑,也可以使其上下移动.
使用加速度计
如果您在XNA版本3.x中使用了加速度计类(或看到了我的Zune Level代码)Game Studio,请忘记学习的知识;加速度计不再是XNA的一部分.它可以在Windows Phone特定的程序集之一中使用,并且访问它的方式有所不同.您无需注册" static"类的状态,而需要注册事件通知.首先在您的类中添加对Microsoft.Devices.Sensors的引用,并为其添加适当的using语句.添加一个名为_myAccelerometer
的类型为Accelerometer`的新字段,并使用Initialize()方法中的默认构造函数对其进行初始化.初始化之后,为ReadingChanged事件添加一个事件处理程序.该事件将收到加速度计的X,Y和Z读数.
对于那些已经使用XNA编写了软件并将其移植的人,此更改不会对您的代码产生太大的影响.您可以将在ReadingChanged事件中获得的值存储到变量中,然后在游戏循环中读取该变量,而不是在游戏循环的每个周期中读取加速度计.我只对左右移动飞机感兴趣.因此,我将加速度计的读数更改为倾斜方向.如果设备倾斜超过45度,那么我会将其解释为故意移动.小于45度将被视为"死区",并且不会影响飞机.改变加速度计的读数是一个简单的数学问题.我通常以弧度工作,但是为了使此代码更具可读性,我将按度工作.
void _myAccelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
float tiltDirection = (180f/(float)Math.PI)*(float)Math.Atan2(e.Y, e.X);
if((tiltDirection>45)&&(tiltDirection<=135))
{
_planeMovement.X = 1;
}
else if((tiltDirection>225)&&(tiltDirection<=315))
{
_planeMovement.X = -1;
}
}
要测试此代码,您将需要一个物理Windows Phone设备.我还没有获得,但是希望尽快开始使用.
GamePad类
您将在Windows Phone XNA库中找到一个GamePad
类.考虑到Windows Phone没有任何类型的游戏手柄,乍一看似乎有些奇怪.但是,由于可以针对其他平台(Xbox 360和Windows PC)重新编译XNA应用程序,因此该类的存在使为另一个平台重新编译代码的任务变得更加容易.如果没有此类,则必须添加条件编译逻辑以确保该类仅在支持该类的平台上可见.
我不会在这里详细介绍课程.如果您想了解有关GamePad
类的更多信息,请从PC上访问这篇文章.在Xbox 360上也可以使用相同的概念.
下一步是什么?
在本文的下一部分,我将讨论如何在游戏中添加声音. CodeProject
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# Windows WinMobile .NET Mobile Dev Intermediate 新闻 翻译