【IT168技术】微软windows phone平台已经在连续经历爆炸式新闻之后已经走入了开发者的视野,应用商店中应用的数量也备受开发者和玩家关注。除了应用之外,微软自己的游戏平台更是开发者应该关注的一个金矿。做微软平台的游戏开发,首先要学的是微软的XNA平台,IT168移动开发频道今天给大家介绍一些XNA平台开发的入门知识,希望能够给大家带来开发方面的帮助。
一、认识XNA
XNA中的X表示能够在Windows Xbox和合作伙伴之间达到跨平台的强大的软件工具。N表示“下一代(Next-generation)”,A表示“架构(Architecture)”。
XNA是基于DirectX的游戏开发环境,是微软对于 Managed DirectX 的修正及扩充版本。它的任务是帮助开发者在创建更加优秀快速和跨平台的游戏时能够减少费用。通过整合Microsoft的非常好的创新和来自业界的对于游戏开发的非常好的创新,XNA旨在降低大量的开发费用并且允许开发者构建卓尔不群的游戏。
目前Windows Phone7使用的是XNA Game Studio4.0 版本,也是目前最高的版本。但是也还存在不同:
1. 监控和使用accelerometer数据,这样就可以开发出具有重力感应的游戏。
2. 只能保存数据到IsolateStorage,而不能保存到其他介质上。
所需要的开发环境:
1.操作系统:
▲操作系统
2. 硬件:需要显卡最少支持DirectX10, Shader Model2.0。
3. 软件:
a. 开发工具:Microsoft Visual Studio 2010 Express for Windows Phone
b. .Net Frame: Microsoft .NET Framework 4.0
以上软件环境,在安装Microsoft Windows Phone Developer Tools Beta时,都已安装好。如果在创建游戏后按F5后报错(Deploy failed with the following error: The current display adapter does not meet the emulator requirements to run XNA Framework applications.),说明显卡可能不支持DirectX10,需要升级显卡。也可以通过微软提供的工具DirectX Caps Viewer Tool测试显卡是否支持DirectX10。
二、XNA GAME 开发架构
对于新建一个XNA for WP7的工程,可以看到在它的工程文件中,有:Initialize(), LoadContent(), Update(),Draw()这几个主要的函数,那由些也就可以看得出XNA开发游戏的一个基本架构了:
Loading:用来加载保证游戏可以正常运行的所有资源等,这个状态在整个系统中只在游戏开始前运行,也就是说整个游戏的生命周期中只运行一次。
Update:这个状态是由所设置的时间间隔来驱动的,在每个时间间隔里重新计算游戏中各角色的状态,以及游戏分值和各种游戏逻辑。一般默认为每秒30次(帧),如果设置间隔过大,游戏可能无法启动。
Draw:这个状态也是由所设置的时间间隔来驱动的,用来绘制各种变化到显示设置上。
对于XNA资源,在创建新的工程时,就一起创建了一个Content工程,所有的资源(图片、声音、视频、字体、3D造形、纹理等)都要加载到这个工程中,并被这个工程编译为.xnb格式的XNA二进制文件,这样才可以加载到游戏中,并被调用。
所支持的资源格式:
? Autodesk FBX format (.fbx)
? DirectX Effect file format (.fx)
? Font description specified in a .spritefont file
? Texture file. The following types are supported: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, and .tga
? Game audio specified in the Microsoft Cross-Platform Audio Creation Tool (XACT) format (.xap)
对于XNA游戏来说,还需要有输入来与游戏交互,如点击屏幕、各种传感器(如Accelerometer)等。相关的命名空间为:
Microsoft.Xna.Framework.Input:用于键盘、按钮、鼠标等的输入。在WP7上只有按钮可以用(back、start)。
Microsoft.Xna.Framework.Touch:用于触控的输入。其中又包括gesture和touch location。
Content Pipeline
另外,还有一个是Content Pipeline,它是XNA中很重要的一块内容。素材管线用于输入、编译和加载游戏资源,例如纹理、3D模型和声音文件。它大大减轻了用户在游戏中自己获取图像、3D数据和着色器的代码量。其包括的dll:
Microsoft.Xna.Framework.Content.Pipeline
Microsoft.Xna.Framework.Content.Pipeline.Audio
Microsoft.Xna.Framework.Content.Pipeline.Graphics
Microsoft.Xna.Framework.Content.Pipeline.Processors
Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler
Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate
Microsoft.Xna.Framework.Content.Pipeline.Tasks
三、文字(SPRITEFONT)
在游戏开发中,一般首先碰到的是文字,对于文字又需要字体的支持,在XNA中,如果要使用文字,就需要先指定字体,对于字体XNA使用了SpriteFont和 SpriteFontTexture两种方式来指定字体。
SpriteFont
这个字体文件实际上是一个XML的配置文件,用来配置字体、字体大小、字体样式、字体编码范围。然后在编译时会按这个配置,将字体编译成.xnb二进制文件。
<XnaContent xmlns:Graphics=”Microsoft.Xna.Framework.Content.Pipeline.Graphics”>
<Asset Type=”Graphics:FontDescription”>
<FontName>Courier New</FontName>
<Size>32</Size>
<Spacing>2</Spacing>
<Style>Bold</Style>
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
▲
XNA也支持中文,其配置方法是一样的。
<XnaContent xmlns:Graphics=”Microsoft.Xna.Framework.Content.Pipeline.Graphics”>
<Asset Type=”Graphics:FontDescription”>
<FontName>宋体</FontName>
<Size>32</Size>
<Spacing>2</Spacing>
<Style>Bold</Style>
<CharacterRegions>
<CharacterRegion>
<Start>一</Start>
<End>龥</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
▲
上面看到的图看起来很奇怪,为什么要输入这样的中文,这是因为中文是用unicode来表示的(这是unicode编码表中的前几个汉字),其编码区间是4E00(19968)—9FA5(40869),也就是说有2万多字,所以编译起来特别的慢,有时还会让vs2010无响应。由此看来,要开发XNA中文版的游戏,机器一定要好,要不然连编译都过不去。
第一个XNA程序 Hello World!
一. 创建XNA工程,在Content工程下加入spritefont字体文件,并配置好所要用的字体。
▲
一. 在Game1.cs文件中,加入代码:
{
base.Draw(gameTime);
SpriteBatch.Begin();
SpriteBatch.DrawString(Font, “Hello World!”, new Vector2(100, 200), Color.Red);
SpriteBatch.End();
}
protected override void LoadContent()
{
base.LoadContent();
ContentManager cm = this.Content;
Font = cm.Load(“gamefont”);
}
三.二 SPRITE TEXTURE FONT
对于XNA的字体,除了之前的SpriteFont外还有一种是SpriteTextureFont,其实就是生成的字体bitmap图片,也就是说可以用bitmap类型的字库来当作XNA的字体集,这样就等于扩充了字体库,使手机里没有的字体库也可以使用。其使用方法和SpriteFont是一样的,都是以SpriteFont加载,然后通过DrawString方法画出来。
要使用图片字库,那首先就要制作字体图片。在http://www.daisy123.com/?page_id=427 ttf2bmp就可以直接生成字体图片了,这是一个开源工程。
▲
这样看起来似乎很好,使用中文看起来也就没有问题了!但事实上却没有这么完美,因为如果要生成两万多个汉字,图片会非常大,这就造成了无法加载,因为WP7对图片的限制是2048K,而只生成几千字的图片库就有十几M了。看来如果要用汉字还要费很大的力气来处理字库。
这是用工具生成的字体库图片文件:
▲
四、INPUT输入方式
对于Windows Phone7来说与用户的交互方法主要有三种:手势、按键、触控和一些传感器的信号(如重力感应等,对于最后一种,在一起学Windows Phone7开发(十四. Device)中已经详细介绍过了)所以XNA游戏所能用到的交互方式也是一样的。但对于XNA来说与Windows phone7是有很大区别的。其主要的函数在Microsoft.Xna.Framework.Input和Microsoft.Xna.Framework.Input.TouchPanel。
一.按键:对于按键来说,其实可控的也就只有Back键,其它的两个键是不受控的。
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)//这个是系统填加的
{
//…
}
}
二.触控:状态也很少,只有Move、Press、Release这么几种。
foreach (TouchLocation location in touchState)
{
switch (location.State)
{
case TouchLocationState.Pressed:
break;
case TouchLocationState.Moved:
break;
case TouchLocationState.Released:
break;
}
}
三.手势:可以通过手在屏幕上的不同动作来触发不同应用和触控很相似,但是比其状 态要多很多,并且需要指定。
if (TouchPanel.EnabledGestures != GestureType.None)
{
switch (TouchPanel.ReadGesture())
{
case GestureType.Tap:
break;
case GestureType.DoubleTap:
break;
case GestureType.FreeDrag:
break;
case GestureType.DragComplete:
break;
case GestureType.Flick:
break;
case GestureType.Hold:
break;
case GestureType.HorizontalDrag:
break;
case GestureType.None:
break;
case GestureType.Pinch:
break;
case GestureType.PinchComplete:
break;
case GestureType.VerticalDrag:
break;
}
}
}
五、SOUND
在游戏中声音是非常重要的一块,对于声音来说又分为音频和音乐,在这方面XNA也提供了很方便的方法用来管理和播放。
一.音频:一般用来播放一些很短的wav格式的音频,比如点击等声音效果。
Microsoft.Xna.Framework.Audio 命名空间中的SoundEffect包括了对Audio的处理API,如Play、Stop、Pause等还可以循环播放。
SoundEffect se = .Game.Content.Load(“Hit”);
se.GreateInstance().Play();//播放
se.GreateInstance().Stop();//停止
se.GreateInstance().Pause();//暂停
se.GreateInstance().Resume();//继续
se.GreateInstance().IsLooped = true;//循环播放
如果声音很多,就需要管理起来,可以在加载的时候把资源全部加到一个列表里进行管理,需要的时候再调出来用。
Dictionary AudioList //可以用Dictionary来保存所有声音资源,它的好处就是可以按名索引取资源。
SoundEffect se = Game.Content.Load(“声音资源名”);//载入声音资源
AudioList.Add(key, se.CreateInstance());//存储资源
AudioList[“声音资源名”].Play();//获取资源并播放
AudioList[“声音资源名”].State == SoundState.Playing //获取声音状态
二.音乐:可以播放mp3等格式的音乐。可以用来播放背景音乐。
Microsoft.Xna.Framework.Media 命名空间中的Song包括了对song的处理API,如音乐的名称、专辑、歌手、时间等的获取。但这个类不能用于对音乐的Play、Stop、Pause、Repeat等的操作,需要MediaPlayer这个静态类来实现。
Song = Content.Load(“Kalimba”);
MediaPlayer.IsRepeating = true;
MediaPlayer.Play(Song);