版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章基于VisualC++2010开发windowsphone7应用WindowsPhone7是Microsoft的新一代资能电话平台,它允许用户安装并使用一些高级应用程序,并赋予开发人员创建此类应用程序的能力。WindowsPhone7应用程序采用我们熟悉的工具来开发,比如VisualStudio2010,Silverlight和XNA„因此,开发人员利用现有技能即可创建功能丰富的智能电话应用程序。作为一个安全的平台,WindowsPhone7应用程序可以利用通过云提供的很多服务和资源。配置开发Windowsphone7的开发调试平台WindowsPhone7开发环境的搭建,我们需要到微软的网站下载WindowsPhoneDcvclopci•工具集。(/downloads/dctails.aspx?FamilylD=2338b5dl-79d8-46af-b828-380b0f854203&displaylang=en)这个版本包含了四个软件,All-in-one,不需要一个个下载。VisualStudio2010ExpressfbrWindowsPhoneCTPWindowsPhoneEmulatorCTPSilverlightfbrWindowsPhoneCTPXNA4.0GameStudioCTP需要注意的是这软件需要安装在Vista或者Windows7下面,不再支持WindowsXPc搭建wp7时,需要VistaorWindows7系统,打开VS2010后,存在一些变化,一方面WindowsPhone提供了两种不同的开发平台:SilverlightforWindowsPhone和XNA4.0,但从另一方面而言,以前WindowsMobile的C++和.NETCompactFramework都用不上了。所以,以前的WindowsMobile程序员也要经历一个痛苫的转型过程。搭建Windowsphone7的开发平台.安装VS2010正式版:(这部分可以省略).卜载并安装新版的WindowsPhone开发工具WPDTCTP装好后开始菜单中多了“MicrosoftVisualStudio2010ExpressfbrWindowsPhone”建议用正式版的VS2010。.打开VS2010正式版File->New->Project…如下
图5.1图5.1出•*•JciienUbrwy(44^■Swrcii!■—fcdT—Q]18 "Z"・w。图5.2按照如上VisualC++下多了SilverlightforWindows和XNAGameStudio4.0,这就说明安装成功了。1.新建一个测试工程:a)新建一个Application,将其命名为HclloWrold;b)vsualC++->SilverlightfbrWindows->WindowsPhoneApplication;c)添加一个TextBlock修改Text属性为uHelloWorldWindowsPhone7W;d)按F5快捷键运行:VS2010弹出一个Windowsphone模拟器。pagetitle图535.1.2编写第一个WindowsPhone7程序1.启动VisualStudio2010ExpressfbrWindowsPhone图5.4.打开欢迎页面,这里有一些链接可以下载WindowsPhone7相关的文档和视频。555.
图.新建一个WindowPhoneApplication项R♦叫做HclloWorldWindowsPhonco.(iJSMainPage.xmalfKlTextBlocktextBlockPageTitle和textBlockListTitleCodeSnippet.<!—TitleGridisthenameoftheapplicationandpagetitle—>.<Gridx:Name=NTitleGrid,'Grid.Row=M0M>.<TextBlockText=MHelloworldapplication"x:Name="textBlockPageTitle"Style=M{StaticResourcePhoncTextPageTitle1Style}'7>.<TextBlock Text-,SayHelloWorldH x:Name="textBlockListTitle" Style=H{StaticResourcePhoncTextPageTitle2Style}M/>.</Grid>.增加一个按钮CodeSnippet.<!-ContentGridisempty.Placenewcontenthere—>.<Gridx:Name=,,ContentGrid"Grid.Row=Ml">.<ButtonContent=MSayHi"Height=,,70MHorizontalAlignment=,'LeftHMarginal44,65,0,0"Name="buttonr,VcrticalAlignmem="Top”Width=M160"Click="buttonl_Click”/>.</Grid>.增加按钮处理事件CodeSnippet.privatevoidbuttonl_Click(objectsender,RoutedEventArgse).{.textBlockListTitle.Text="SayHi!M;4」一个demo程序就完成了。.点击F5启动Emulator进行调试WindowsPhoneEmulator-c图5.7
进入我们编写的程序:图5.8点击按钮WindowsPhone7的开发环境部署非常的简单,开始WindowsPhone7的旅途吧!SilverlightforWindowsPhoneSilvcrlightforWindowsPhone虽然相对发行较晚,但所有WindowsPhone上的应用必须用Silverlight来写。Silverlight最大的优势在于与ExpressionBlend的无缝整合,可以快速设计出非常漂亮的用户界面,将程序员从繁琐的UI开发中解放出来。而且SilvcrlightforWindowsPhone不再是Silverlight的子集,而是支持Silverlight的全部功能。这样的好处是,已有的Silverlight程序很容易移植至ljWindowsPhone手机上。在程序菜单的XNAGameStudio4.0下打开VS2010,创建一个新工程,在VisualCH■下找到三个模板,选择"WindowsPhoneApplicationM。| >74 同h| >74 同h二工pagetitle图5.10点击OK后,会直接进入IDE的主界面:图5.11左边是工具栏,可以拖拽控件到UI设计器上,与XAML界面对应。此时拖拽了一个Button和一个TextBox上去。双击Button,进入了代码编辑器。namespaceWindowsPhoneApplication1(publicpartialclassMainPagc:PhoncApplicationPage(publicMainPage()(InitiaIizeComponcnt();SupportcdOricntations=SupportedPageOricntation.Portrait|SupportedPageOrientation.Landscape;}privatevoidbuttonI_Click(objectsender,RoutedEventArgse){MessageBox.Show("Hello,WindowsPhone/*+textBoxl.Text);编辑完成后,直接按F5,WindowsPhoneEmulator会被启动。程序运行起来就是下面这个样子。McssagcBox弹Hl来后,会有一个大大的Error标题,看起来McssagcBox在WindowsPhone里主要是用来显示错误的。另外就是输入法,带有明显iPhone的痕迹,不过对电容屏的支持看来不是问题了。pagetitleXNA4.0在移动开发界,XNA还不是一个响亮的名字,但是在游戏开发界,Xbox360上的XNA则是泰山北斗级的开发技术。XNA不仅仅是一个.NET的游戏开发平台,还包括了很多支持XboxLive服务的功能,比如,Avatars技术支持在游戏中显示用户设计的形象。希望这项技术能够和同名电影一样,改变移动游戏开发的历史。WindowsPhone支持的是XNA4.0,与ZuncHD上的XNA3.1有啥区别?支持3D游戏!目前我们看到的这个XNA4.0预览版只支持WindowsPhone开发,不支持Windows和Xbox360的游戏开发。SilverlightforWindowsPhone是典型的事件驱动型应用程序。而XNA是由时间驱动的应用程序,这也是游戏开发技术的典型特点。每隔固定时间,系统会触发Update事件,使程序得以更新。不那么多废话了,创建个XNA4.0的新工程吧!图5.13选择WindowsPhoneGame就好了。IDE环境下没有界面编辑器,需要程序员通过代码来实现ULXNA程序的结构非常简单,程序员只需要实现儿个简单的方法,就可以实现一个简单的XNA程序了。这些方法包括Initialize初始化方法、LoadContcnt加载文件、Update更新内容和Draw绘制等方法。下面是示例代码片段:protectedoverridevoidLoadContent()//CreateanewSpriteBatch,whichcanbeusedtodrawtextures.spritcBatch=newSpritcBatch(GraphicsDevice);texture1=Content.Load<Texture2D>('*winphonc");texture2=Content.Load<Texture2D>(Hwinphonc");soundEffect=Content.Load<SoimdEfIect>(nWindowsDing");spritePositionl.X=0;spritePosition1.Y=0;spritcPosition2.X=graphics.GraphicsDevice.Viewport.Width-texture1.Width;spritePosition2.Y=graphics.GraphicsDevice.Viewport.Height-texture!.Height;sprite1Height=textureLBounds.Height;sprite1Width=texture1.Bounds.Width;sprite2Height=texture2.Bounds.Height;sprite2Width=texture2.Bounds.Width;JLoadContent方法中使用Content.Load方法来加载资源文件,这些文件也是作为资源被加载到XNA程序中的。protectedoverridevoidUpdate(GameTimegameTime){//Allowsthegametoexitif(GamcPad.GetStatc(Playerindex.One).Buttons.BackButtonStatc.Prcssed)this.Exit();//Movethespritearound.UpdateSprite(gameTime,refspritePosition1,refspriteSpeedI);UpdateSprile(gameTime,refspritePosition2,refspriteSpeed2);CheckForCollision();base.Update(gameTime);1Update方法负责更新元素的位置,进行碰撞检测。如果后退键被按"则退出程序。protectedoverridevoidDraw(GameTimegameTime){GraphicsDevice.Clear(Color.ComflowerBlue);//TODO:Addyourdrawingcodehere//Drawthesprite.spriteBatch.Begin(SpriteSortMode.BackToFront,BlendStatc.AlphaBlend);spritcBatch.Draw(texture1,spritePosition1,Color.White);spritcBatch.End();spritcBatch.Begin(SpritcSortModc.BackToFront,BlendStatc.Opaque);spritcBatch.Draw(texture2,spritcPosition2,Color.AliccBlue);spriteBatch.End();base.Draw(gameTime);}Draw方法对更新后的元素进行绘制。我们的第一个XNA程序会显示两张图片,这两张图片会在屏幕中运行,运行到边缘时,会反弹问来。图调试技巧我们来谈谈调试,以及一些可供我们用来优化应用程序的工具。•Application.Currcnt.Host.Scttings如果打开你的App.xaml文件,会看到有这样的语句://Showgraphicsprofilinginformationwhiledebugging,if(System.Diagnostics.Debugger.IsAttached)(//Displaythecurrentframeratecounters.Application.Current.Host.Settings.EnableFrameRateCounter=true;//Showtheareasoftheappthatarcbeingredrawnineachframe.Application.Currcnt.Host.Settings.EnableRedrawRegions=true;//Enablenon-productionanalysisvisualizationmode,//whichshowsareasofapagethatarebeingGPUacceleratedwithacoloredoverlay.Application.Current.Host.Settings.EnableCacheVisualization=true;}这段代码打开了一些工具,当你调试时它们可以提供大量的程序中正在发生的信息。EnablcFramcRatcCountcr这是唯一一个默认被打开的工具,它允许你在程序运行时监视应用程序的帧速率。你会注意到所有这些工具都被包含在一个if语句中(Debugger.IsAttached),这是因为你并不会在最终的产品程序中使用它们。这些工具是专用于调试的。检验调试器还是解锁菜单,测试你的试用版程序这类事情的好方法。当你调试时可以打开某些东西,而在其他状态下不用去管它们.电影业的标准是每秒24帧,你可能不需要这么多,除非是在你的程序中有复杂的动画或移动。在W汰ipedia上有-一篇关于"视觉暂留"(PersistenceofVision,指当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.5秒左右的图像的现象)的非常优秀的文章。
图5.15EnableRedrawRegions打开这个调试设置来看看在你的应用程序中矩形会在哪儿被重绘。当打开后你可以看到被重绘的内容因为重绘区域是兰色的。在获得较低帧速率时这一点变得非常重要,你可能不知道为什么。这是因为应用程序将屏幕中的一部分进行了重绘,即使它很不明显。sd-1」①sd-1」①66nq①p图5.16EnablcCachcVisualization另一种重叠色,EnablcCachcVisualization向你展示页面中哪些区域使用了GPU加速功能。你口J能会期待视频和动画能充分利用它,但我想你会在GPU处理图像的频率上感到惊讶。-B-B」①66nq①p图5.17基于VisualC++2010开发windowsphone7的计算器搭建好WindowsPhone7的环境后,我们首先来看一个个简单的计算器的开发。首先打开:MicrosoftVisualStudio2010ExpressfbrWindowsPhoneFile->NewProject->VisualC#->SilverlightforWindowsPhone->,然后给solution叫个名字这里我是叫WphoneDemo,新建后打开MainPage.xmal的文件,在布局方面为了使界面简洁所以我把TitleGrid删除,把ContentGrid上下左右居中,然后在里面添加相应的按钮,就拖卜.控件就OK了。需要注意的是要把文本框设置成只读这样可以避免输入数字以外的字符。接卜来简单说明卜MainPage.xmal.cs中的逻辑代码。首先定义一个操作符的枚举:privateenumOperateNoPlus,Minus,Multiplied,Divide,Mod然后是保持操作符的变量:privateOpcratcNocalcOpcrat;以及两个操作值的变量:privateintfristValuc=0;privateintsecondValue=0;数字按钮的代码:privatevoidbtnO_Click(objcctsender,RoutedEventArgsc)(if(this.isZero(this.txtResult))(this.txtResult.Text=w0";)else(this.txtResult.Text+="0”;}!其他键类似。操作符按钮代码:privatevoidbtnPlus_CIick(objectsender,RoutedEventArgse){if(!string.IsNullOrEmpty(this.txtResult.Text.Trim()))(this.fristValue=int.Parse(this.txtResult.Text.Trim());this.txtResult.Text=}this.caleOperat=OpcrateNo.Plus;)等号代码:privatevoidbtnResult_Click(objectsender,RoutedEventArgse)(if(!string.IsNullOrEmpty(this.txtResult.Text.Trim()))(this.secondValue=intParse(this.txtResult.Text.Trim());switch(this.caleOperat)(caseOperateNo.Plus:this.txtResult.Text=(this.fristValue+this.secondValue).ToString();this.fristValue=int.Parse(this.txtResult.Text.Trim());break;caseOpcratcNo.Minus:this.txtResult.Text=(this.fristValue-this.secondValue).ToString();this.fristValue=int.Parse(this.txtResult.Text.Trim());break;caseOperateNo.Multiplied:this.txtResult.Text=(this.fristValue*this.secondValue).ToString();this.fristValue=int.Parse(this.txtResult.Text.Trim());break;caseOperateNo.Divide:if(0!=this.secondValue)this.txtRcsult.Text=(this.fristValue/this.secondValuc).ToString();this.fristValue=int.Parse(this.txtResult.Text.Trim());break;caseOperateNo.Mod:if(0!=this.secondValue)this.txtRcsult.Text=(this.fristValue%this.secondValue).ToString();this.fristValue=int.Parse(this.txtResult.Text.Trim());break;default:break;)运行后的效果如图所示:图5.18基于VisualC++2010开发windowsphone7小游戏GameStudio游戏基础这个游戏内置了多层关卡。每个关卡通过情节,游戏角色,环境等关联起来。这个简单的案例中,每个关卡可以看成一个独立的完整游戏。一个关卡通常包含3个种状态:Loading-在此状态下,系统加载资源,设置和关卡相关的变量,计算游戏世界(游戏世界是所有游戏过程发生的地方),并执行在游戏实际开始之前必须执行的任何其他任务。Update-在此状态下,系统需要更新游戏世界状态。通常,这意味着计算(玩家(们)和敌人)的新位置,更新血量、弹药和其他状态,重新计算分数和其他游戏逻辑。这种状态出现在整个游戏引擎处于活动状态的时间。Draw-在此状态卜.,系统将绘制计算的输出的图形设备更新状态的更改。这种状态出现在整个游戏引擎处于活动状态的时间。在XNAFramework中,后面两个状态,对于PCo或者Xbox360的频率可以达到为每秒60次,而在对于Zune,ZuneHD或者WindowsPhone7可以多达30秒每次WindowsPhone7XNA游戏开发实例整个步骤分五个部分,教大家完成一个有XNA编写的winphone手机游戏。XNAGameStudio游戏基石出XNAFramework资源XNAGameStudio游戏循环
XNAGameStudio游戏输入游戏逻辑大家按照教程的五个部分完成就可以做出一个像下图展示的winphone游戏了。图5.19异形游戏在winphone上运行的效果XNAGameStudio游戏基础在这个环节,你将利用XNAGameStudio创建自己的第一个WindowsPhone游戏。这个游戏51然很简单,但是我们会不断地添加新的功能来完善它。Note:虽然我这里用的是MicrosoftVisualStudio2010ExpressforWindowsPhone,但是同样适用于安装了WindowsPhoneDeveloperTools的MicrosoftVisualStudio2010。.打开Micros。仕VisualStudio2010ExpressfbrWindowsPhone»从Start|AllPrograms|MicrosoftVisualStudio2010Express|MicrosoftVisualStudio2010ExpressforWindowsPhone.VisualStudio2010:开打VisualStudio2010从Start|AllPrograms|MicrosoftVisualStudio2010..IntheFilemenu,chooseNewProject.在File菜单,选择NewProject.在File菜单,点击new,然后选择Projecet.在NewProject对话框,选择XNAGameStudiogameWindowsPhone分类中,选择WindowsPhoneGame(4.0);然后设置name为AlicnGamc设置solutionname为Begino图5.20在MicrosoftVisualStudio2010ExpressfbrWindowsPhone中,创建一个新的WindowsPhone游戏应川程序项目.在资源解决方案管理器中,查看由WindowsPhone应用程序模板生成的解决方案的结构。任何VisualStudio解决方案都是是相关项目的一个容器;在这种情况下,它包含一个名为AlienGame的XNAGameStudiogamefbrWindowsPhone项El和一个名为AlienGameContent的相关游戏资源项目。SolutionExplorer ▼C3XQ3SoliMion'Be9m(2projects)//AfienGame»MPropertiesD4Refevences.ContentReferencesWB^ckyrouncLpng■Game.icogG«mel.csdG«mcThumbn«ii.png④Pr09ram.csj《AlienGameContent(Content)
7References图5.21在解决方案资源管理器中展示AlienGame应用Note:解决方窠资源管理器允许您查看项,并执行一个解决方案或项目中的项管理任务。显示解决方案资源管理器,按CTRL+W、或者在视图菜单中选择?OtherWindows|SolutionExplorer。.生成的项目包括一个默认的游戏实现,这个实现包含基本XNAGameStudio游戏循环。它位于在Game1.cs文件中。.打开Gamel.cs文件。我建议将其默认名称修改成为可以反映你想法的游戏名称。.在这里我们将游戏的主类(默认命名为Gamel)重命名为AlienGame,»将其重命名,右键单击类名称,选择Refactor|RspaceAlienGame(1 ///<suamary>///Thisisthemaintypeforyourgame///</sumary>publicclass , M»CIV ♦〃Remme- f2Graph-icOrgwwtlhmji ,“ExtractMethods CtrkRM图5.22重命名主游戏类.在重命名对话框中,在Newname字段中输入AlienGame,然后点击确定。图5.23给主游戏类命名.检查由VisualStudio提供的更改建议,并点击Apply.
图5.24对主游戏类实施变更.我们将文件名进行修改来匹配新的类名。在解决方案资源管理器中右键点击Gamel.cs并选择Rename。给这个类•个新名字AlienGame.cs。图5.25将主游戏类文件重命名.GameThumbnail.png包含应用程序在手机设备快速启动屏幕上显示的图标。你可以在解决方案资源管理器中双击他,就是利用你的机器中的图片修改软件来修改这个图片,如绘图板。Note:在VisualStudio2010中,在解决方案资源管理器中双击这个icon文件,会打开VisualStudio中内置的面片修改器XNAGameStudiogame开发的WindowsPhone应用程序通常利用由基础平台或其他库提供的服务。若要使用此功能,应用程序需要引用相应的程序集,实现这些服务。.要显示由项目引用的程序集,展开在解决方案资源管理器中的References节点,并检查列表。我们会发现他包含XNAFramework程序集和?WindowsPhoneplatform的特殊程序集。图5.26项目引用的程序集目前,该应用程序没有更多的内容,但它已准备好做第一次测试运行。在这一步,我们准备调试程序,并将该应用程序将其部署到WindowsPhoneEmulator,然后执行它,来了解一个典型的开发周期。.在Debug菜单,选择Windows|Output来打开Output窗口。.在Debug菜单中选择BuildSolution或者按下SHIFT+F6组合,在解决方案中编译项目。VisualStudio2010:选择Build菜单中的BuildSolution或者按下CTRL+SHIFT+B在解决方案中编译项目。.观察Output窗口并查看调试过程中产生的追踪消息,包含一条追踪的结果信息。TOC\o"1-5"\h\zOutput *OXShowoutputfratn:Budd / J,Buildstarted:Project:AlienGawe,Configuration:DebugWindowsPhone ・AlienGM*->C:\WP7TralningKit\Labs\Ga«eOevelop^ntwithXNA\Source\exi_AllenG««e\Begln\AllenG«ae\iBeginapplicationaanifestgenerationApplication««nifestgenerationcompletedsuccessfullyBeginX«ppackaging ICreatingfileAlienGane.xapAddingAlienGaM.dllAddingk*$AppM«ni<«st.xalAddingApf^anifest.x«alAddingG«m«Thuabnail.pngXappackagingcoapletedsuccessfully・・・・・・・・・・Build:1succeededorup'tO'date,Gfailed,0skipped••••••••••E •图5.27在VisualStudio中调试应用程序您应该不会在现阶段观察任何错误,但如果项目包含编译错误这些将在输出窗口中显示。若要对付这些类型的错误您可以利用错误列表窗口。此窗口显示错误、警告,并可以进行排序的列表中的编译器产生的消息和筛选器基于错误的严重性。此外,您可以双击自动打开有关源代码文件并定位到错误的来源列表中的项。.要打开ErrorList窗口,在view菜单中,点击OtherWindows并选择ErrorList。VisualStudio2010:打开ErrorList窗口,在view菜单中选择ErrorListoError1stOlEnof|j0Wimm9$0MessagesDe$cnpbon We bneCdurnnProject*11I;opected lAhenGernea 146lAl^nGifne图5.28ErrorList窗口显示错误在调试过程中
.确认部署目标为WindowsPhoneEmulator。做法为,找到工具栏上StartDebugging按钮旁的SelectDevice,确认WindowsPhone7Emulator选项在SelectDevice下拉菜单中处于选中的状态。CAhenGame-MicrosoftVisualStudio2010ExpressforWindowsPhoneFileEditViewProjectDebugTookWindowHelpJ3」,」dJA-J•0•u•I»•|JDebug .:rjQA.q|.一CWindowsPhone7Emuli•_Fj►J-立口,HoAhenGame.esX! ,(Default)WindowsPhone7Emulator[弋AlienGame.AlenG«meWindow!Phone7Devke•|♦AJenG«meEflusinRSystem;图5.29选择目标设备来部署应用Note:当你通过VisualStudio部署你的应用时,你可以选择部署在真机或者仿真程序.按f5键在WindowsPhoneEmulator中启动该应用程序。请注意,一个设备仿真程序窗口将出现,而且出现一个短暂的停顿,这时VisualStudio在设置仿真环境和部署图像。一旦准备好仿真程序显示开始页,此后不久您的应用程序将显示在仿真器窗口中。应用程序将显示一个简单的蓝色屏幕,没有任何其他所示。对于一个早期阶段中的应用程序,这是正常现象。图5.30在WindowsPhoneEmulator上运行应用在您创建的用户界面和程序的应用程序逻辑之前,没有什么可以在应用上做的。.请按下SHIFT+F5或者和点击工具栏上Stop按钮,来切断调试并且结束调试会话。这个时候要不关闭仿真程序窗口。七AlienGameJMenGame三usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingMicrosoft.Xna.Framework;图5.31结束调试会话Note:在启动调试会话时,它将要用•段来时间设置仿真环境和启动应用程序.为了简化您的调试体验,避免关闭仿真程序。这样一旦运行仿真程序,只需要很少的时间停止当前会话,编辑源代码,然后构建和部署新的图片,为您的应用程序启动新的调试会话。5.3.2XNAFramework游戏资源这个环节我们将利用XNA将提供的大量的声音、图片和声音各种资源管理起来,使游戏开发过程更加容易。在此任务中,您将添加这些资源到游戏中。同时还提供了大量的代码文件,以处理在游戏中的菜单和屏幕变化的复杂性。您需要将游戏中添加这些文件。您现在正在构建这个游戏。这个游戏将呈现一些图形。在此任务中,您将添加一些资源,应用程序和一些现有的游戏逻辑(ScreenManager)。Note:所有游戏资源请在下载压缩包的assets目录下找:Source\\Assets\\Code-所有C#文件Source\\Assets\\Media-所有的字体、图片和声音7.…无后厂疏一目二…"力.媒加二恒运%二…甫.而亍页丁「松期工二…加…,我.位一值而Source\\Assets\\Media\\Images\\Icons文件夹下的两个文件复制到AlienGame项目中,覆盖原文件。Game.icoGameThumbnail.png.重新打开VisualStudio2010♦并打开AlienGame项目。大多数游戏使用的艺术表现模式为模型、网格、子画面、纹理、影响、地形、动画等等形式。这种艺术资产可以在许多不同的方式创建和存储在许多不同的文件格式里。他们在游戏开发过程中经常更改。内容管道被设计来帮助您轻松地和自动在游戏中管理这些艺术资产。美工可以生成一个汽车的模型,并导入到XNAGameStudio游戏项目中。而开发人员可以直接用过这个汽车模型的名字通过ContcntManagcr.Load调用。这个简单的流程让设计人员聚焦在创建资源,而开发人员聚焦在使用他们,大家再也不用担心之间的关联和转化。XNA内容管道是很容易集成到XNAGameStudio项目中。您只需将资源添加到您的项目和当您编译数据导入并转换中使用内容的导入程序的XNB(XNA二进制文件)。为适当的平台生成此XNB文件。内容导入程序是作为程序集实现的。除了由XNAGameStudio提供的标准,你还可以使用自定义和第三方开发的一些标准的内容导入程序包括以下文件类型(部分列表):AutodeskFBXfonnat(.fbx)DirectXEffectfileformat(.fx)Fontdescriptionspecifiedina.spritefbntfileTexturefile.Thefollowingtypesaresupported:.bmp,.dds,.dib,.hdr,.jpg,.pfm,.png,.ppm,and.tgaGameaudiospecifiedintheMicrosoftCross-PlatfbrmAudioCreationTool(XACT)format(.xap).这里为大家准备了一些多媒体文件,包括字体,声音和图像。我们将下列资源添加到AlienGameContent项目中:所有的字体在Source\\Assets\\Media\\Fonts</strong>文件夹中所有的图片在Source\\Assets\\Media\\Images\\Content文件夹中所有的音效在Source\\Assets\\Media\\Sounds文件夹中.添加现有项目,右键点击AlienGameContent工程名,并选择Add|ExistingItems:
图5.32向工程中添加现有项目.定位到文件位置,然后选择文件。在某些情况下,您可能会看不到的所有文件。在这种情况卜需要更改文件选择对话框中的筛选器,以显示在目录中的所有文件:图5.33更改文件类型筛选器,以显示该文件夹中的所有文件.所产生的AlienGameContent项目应如下所示:•心ijjidl•心ijjidl/心JIKddl,”图5.34添加了内容以后的项目结构.添加一个新的项目文件夹-右键点击AlienGame,选择Add|NewFolder。图5.35添加新项目文件夹.将文件夹命名成ScreenManager。这个文件夹将被用来存放提供的源文件。这些文件用以帮助管理创建游戏屏幕、菜单,和它们之间的更改的复杂内容。Note:这段代码实现创建XNAGameStudio菜单和屏幕的标准方法。.打开SourceWAssetsWCodeWScreenManager文件夹,添加所有现有ScreenManager文件。.将SourceWAssetsWCode文件夹中ParticleSystem.cs添加到AlienGame根目录。.最终AlienGame项目结构如下SolutionExplorer ▼QXaNSolutionAlienGame'(2projects)jAKenGime»&Properties“Referencesa/ContentReferences■。ScreenManager⑵G«meS<re«n.cslnputState.es<©MenuEntry.es<©Menukreen.es
S<reenM«n«ger.c$<©AlienG«me.c$白App.configGame.ico,j|GameThumbnail.png<0ParticleSystem.es<©Program.esNAlienGameContent(Content)图5.36最终AlienGame项目结构.添加一个新类到AlienGame项目,命名为Backgroundscreen:」。£1*»»-SowsPhone.」。£1*»»-SowsPhone.
/se.e);由(图5.37给项目中添加•个新类.打开新的类,并添加以下使用申明:(代码段-XNA游戏-Backgroundscreen使用申明)usingAlienGameSample;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework;.从GameScreen类中派生的新类,(GameScreen类添加到ScreenManager文件夹中):classBackgroundScrecn:GameScreen(}.添加下面的类变量,以后用于加载资源:(代码段-XNA游戏-BackgroundScrecn-屏幕背景类变量)Texture2Dtitle;Texture2Dbackground;.定义类的构造函数,如下所示:(代码段-XNA游戏-BackgroundScrecn构造函数)publicBackgroundScreen()(TransitionOnTime=TimcSpan.FromSeconds(O.O);TransitionOfTTime=TimeSpan.FromSeconds(0.5);}.GameScreen类定义了一些核心的游戏功能,根据之前所描述的:LoadContcnt,更新,及绘图。重写了基类LoadContent功能(代码段-XNA游戏-BackgroundScreenLoadContent方法)publicoverridevoidLoadContent()(title=ScreenManager.Game.Content.Load(HtitleM);background=ScreenManager.Game.Content.Load(,,backgroundw);此代码段从游戏资源中通过名称来加载内容。.创建一个LoadingScreen〈/strong>类,这个类,在游戏资源加载的时候,将屏幕展示出来。Note:创建一个新类,在在解决方案资源管理器中,右键单击AlienGame项目,然后选择Add|Classo.添加以下使用申明(usingstatements)到LoadingScrccn类:(代码段-XNA游戏开发-LoadingScreen使用申明)usingAlienGameSampIe;usingSystem.Threading;usingMicrosoft.Xna.Framework;.从GameScreen基类(像你之前类所做的),派生一个新类,并添加构造函数,如下所示:(代码段一XNA游戏开发一LoadingScreen构造函数)classLoadingScreen:GameScreen{publicLoadingScreen。{TransitionOnTime=TimeSpan.FromSeconds(O.O);TransitionOffTime=TimeSpan.FromSeconds(O.O);):.添加一个类变量来保存将用来加载该组件的线程:(代码段一XNA游戏开发一装屏幕类变量)privateThreadbackgroundThread;.创建一个方法去加载这些内容。这个方法是xna标准加载过程的一部分。(代码段一XNA游戏开发一</em>LoadingScreenBackgroundLoadContent方法)voidBackgroundLoadContcnt(){ScrcenManager.Game.Contcnt.Load<object>("alien_hit");ScreenManagcr.Game.Content.Load<object>("alicn1**);ScreenManagcr.Game.Content.Load<object>('background1');ScreenManager.Game.Content.Load<object>("badguy_blue");ScreenManager.Game.Content.Load<object>(,,badguy_greenM);ScreenManager.Gamc.Content.Load<object>("badguyorange1');ScreenManager.Game.Content.Load<object>("badguyred");ScreenManager.Game.Content.Load<object>("bullet");ScreenManager.Game.Content.Load<object>(Mcloud1");ScreenManagcr.Game.Content.Load<object>(Mcloud2,');ScreenManager.Game.Contem.Load<object>("fke");ScrecnManager.Game.Content.Load<object>(,'gamefbnt,');ScrcenManager.Game.Contcnt.Load<object>(Mground");ScreenManager.Game.Contcnt.Load<object>("hills*');ScreenManagcr.Game.Content.Load^bjec^C'laser");ScreenManagcr.Game.Content.Load〈object>("mcnufbnt");ScreenManager.Game.Contern.Load<object>("moon");ScreenManager.Game.Content.Loadvobject>("mountains_blurred");ScreenManager.Game.Content.Load<object>(Mplayer_hit");ScreenManager.Game.Content.Load〈object>("scorefbnl");ScreenManager.Game.Content.Load<object>(Msmoke");ScreenManager.Game.Content.Load<object>("sunH);ScreenManager.Game.Content.Load<object>("tankH);ScreenManager.Game.Content.Load<object>("tank_fireM);ScreenManager.Game.Content.Load<object>("tanktire");ScrcenManager.Game.Content.Load^bjec^C^tanktop");ScrccnManagcr.Game.Contcnt.Load^bject^^title1');ScreenManager.Game.Content.Load<object>("titlefbntM);}.重写基类LoadContent方法,并作为一个新线程,实现资源的异步加载开始加载程序的方法:Note:在我们简单的游戏中,加载资源将瞬间完成,但在更复杂的游戏,这种方法将使用显示进度指示器或闪屏(splashscreen)。(CodeSnippet-GameDevelopmentwithXNA-加载ScreenLoadContent方法)publicoverridevoidLoadContent()(if(backgroundThread=null){backgroundThread=newThread(BackgroundLoadContent);backgroundThread.Start。;}base.LoadContent();:.重写基类更新方法,等待LoadContent完成并跳转到MainMcnu屏幕(在接下来的步骤中添加):(代码段-XNA游戏--LoadingScreenUpdate方法)publicoverridevoidUpdatefGameTimegameTime,boolotherScreenHasFocus,boolcoveredByOtherScreen){if(backgroundThread!=null&&backgroundThread.Join(10){backgroundThread=null;this.ExitScreen();ScrcenManager.AddScreen(ncwMainMenuScreenO);ScrcenManager.Game.ResetElapsedTime();}base.LIpdate(gamcTime,otherScreenHasFocus,coveredByOtherScreen);).现在添加一个新的类并将其命名为MainMenuScrccno添加以下使用申明:(代码段-XNA游戏-MainMenuScreen使用申明)usingAlienGameSample;.从McnuScrecn基类派生新类。此类也定义定义到ScrccnManagcr文件夹中,并便于与菜单和菜单项显示/交互所需的所有典型功能。.创建MainMcnuScrccn类构造函数:(代码段-XNA游戏-MainMenuScreen构造函数)classMainMenuScrecn:MenuScreen(publicMainMenuScreen():base(HMain")(//Createourmenuentries.MenuEntrystartGameMenuEntry=newMcnuEntry(MSTARTGAME");MenuEntryexitMenuEntry=newMenuEntry(HQUIT**);//Hookupmenueventhandlers.startGameMenuEntry.Selected+=StartGameMcnuEntrySelected;exitMenuEntry.Selected+=OnCancel;//Addentriestothemenu.MenuEntries.Add(startGameMenuEntry);MenuEntries.Add(exitMenuEntry);}).Intheconstructoryousubscribedfbrtwoevents,whichwillfirewhentheuserselectsthemenuitems.Createtheeventhandlermethodstohandlethoseevents:在构造函数中应用了,当用户选择了(CodeSnippet-GameDevelopmentwithXNA-MainMenuScreeneventhandlers)voidStartGameMenuEntrySelected(objectsender,EventArgse){}protectedoverridevoidOnCanceI()(ScrecnManagcr.Game.Exit();).打开AlienGame.es文件,并添加以下使用申明:(代码段-XNA游戏-AlienGame使用申明)usingAlienGameSample;.添加以下类变量:(代码段-XNA游戏--AlienGame变量)ScreenManagerscrccnManagcr;.删除由VisualStudio创建的变量spriteBatchSpriteBatchspriteBatch;.删除除了类的构造函数和变量申明以外的全部内容。.初始化主游戏类后,您需要加载游戏资源,并向用户显示的菜单的一些背景。菜单屏幕会需要一个加载过程。在另外我们建议您定义你图形设备首选的方案。要达到这个目标更改构造函数方法根据下面的代码片断:(代码段-XNA游戏--AlienGame构造函数)publicAlienGameOgraphics=newGraphicsDeviccManager(this);//SettheWindowsPhonescreenresolutiongraphics.PrcfcrrcdBackBuflbrWidth=480;graphics.PrcicrrcdBackBuffcrHeight=800;Content.RootDircctory="Content";//Framerateis30fpsbydefaultforWindowsPhone.TargetElapsedTime=TimeSpan.FromSeconds(1/30.0);//CreateanewinstanceoftheScreenManagerscreenManager=newScreenManager!this);Components.Add(screenManager);//AddtwonewscreensscreenManager.AddScreen(newBackgroundScreen());screenManager.AddScreen(newLoadingScreenO);.编译并运行应用程序。程序加载后,主菜单将出现图5.38应用程序的主菜单.停止调试,返回到应用程序编辑环节。在这个环节,你给游戏添加了一些资源,并创建了些screen,在加载游戏的时候去加载内容,还创建了一个主菜单。XNAGameStudio游戏循环在这部分中您将重点两剩余部分的游戏——重写Update和Draw功能。有些大大可能看过相关微软的训练包.打开BackgroundScreen.cs文件。.重写基类Update方法如卜.:(CodeSnippet-GameDevelopmentwithXNA-BackgroundScreenUpdatemethod)publicoverridevoidUpdatc(GamcTimcgameTime,boolothcrScreenHasFocus,boolcovcredByOthcrScrccn){base.Update(gameTime,otherScreenHasFocus,false);:.重写基类方法绘制。绘图方法将绘制图形设备上使用。Microsoft.Xna.Framewok.Graphics命名空间中的SpriteBatch类。一组sprites被绘制的时候使用同样的设置。改变Draw方法来匹配卜面的代码段:(CodeSnippet-GameDevelopmentwithXNA-BackgroundScreenDrawmethod)publicoverridevoidDraw(GameTimcgameTime)SpriteBatchspriteBatch=ScrecnManager.SpriteBatch^ZMakethemenuslideintoplaceduringtransitions,usinga//powercurvetomakethingslookmoreinteresting(thismakes//themovementslowdownasitnearstheend).floattransitionoffset=(float)Math.Pow(TransitionPosition,2);spriteBatch.Begin();//DrawBackgroundspriteBatch.Draw(background,newVector2(0,0),newColor(255,255,255,TransitionAlpha));//DrawTitlespriteBatch.Draw(title.newVector2(60,55),newColor(255,255,255,TransitionAlpha));spriteBatch.End();}.按F5编译并运行该应用程序。图5.39修改了updatae和Draw后的运行效果.停止调试(SHIFT+F5),并返回到编辑应用程序。 6.将一个附加类添加到应用程序,并将其名称设置为GameplayScreen。 Note:要创建一个新的类,在解决方案资源管理器中右键单击AlienGame项目并选择Add|Class.““一丁南笳以话谈帝市期薪亮(CodeSnippet-GameDevelopmentwithXNA-GameplayScreenusingstatements)usingAlienGameSample;usingMicrosoft.Xna.Framework;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework.Audio;usingSystem.IO.IsolatedStorage;usingSystem.IO;.从GameScreen派生:classGameplayScreen:GameScreen{).添加以下类变量(将在比赛中使用它们)。后面我们使用这些变量,处理游戏逻辑、用户输入和绘图:(CodeSnippet-GameDevelopmentwithXNA-GameplayScreenvariables)//GamePlayMembersRectangleworldBounds;boolgameOver;intbascLevelKillCount;intlevelKillCount;floatalienSpawnTimer;floatalicnSpawnRatc;floatalienMaxAccuracy;floatalienSpeedMin;floatalienSpeedMax;intalienScore;intnextLife;inthitStreak;inthighScore;Randomrandom;////RenderingMembers//Texture2Dcloud1Texture;Texture2Dcloud2Texture;Texture2DsunTexture;Texture2DmoonTexture;Texture2DgroundTexture;Texture2DtankTexture;Texture2DalienTexture;Texture2Dbadguyblue;Texture?Dbadguy_red;Texture2Dbadguy_green;Texture2Dbadguy_orange;Texture2DmountainsTexture;Texture2DhillsTexture;Texture2DbulletTexture;Texturc2DlaserTexture;SpriteFontscoreFont;SpriteFontmenuFont;Vector2cloud1Position;Vector2cloud2Position;Vector2sunPosition;//Levelchanges,nighttimetransitions,etcfloattransitionFactor;//O.Of=day,l.Of=nightfloattransitionRate;//>O.Of=daytonightParticleSystemparticles;////AudioMembers//SoundEflectalienFired;SoundEfleetalienDicd;SoundEflectplayerFired;SoundEflectplayerDied;//ScreendimensionconstsconstfloatscreenHeight=800.0f;constfloatscreenWidth=480.0f;constintleftOffset=25;constinttopOflset=50;constintbottomOffset=20;.游戏类构造函数定义(在游戏屏幕和其他屏幕在游戏中的)之间的扉幕转换的速度和大小一—在处理游戏的所有操作的地方。添加此类构造函数,如下所示:(CodeSnippet-GameDevelopmentwithXNA-GameplayScreenConstructor)publicGameplayScreen()(random=newRandom。;worldBounds=newRectangle(O,0,(int)screenWidth,(int)screenHeight);gameOver=true;TransitionOnTime=TimeSpan.FromSeconds(O.O);TransitionOfTTime=TimeSpan.FromSeconds(O.O);:.现在让我们来创建内容的加载和卸载功能重写基类的LoadContent和UnloadContent的方法。添加LoadContent代码段::(CodeSnippet-GameDevelopmentwithXNA-GameplayScreenLoadContentmethod)publicoverridevoidLoadContent()(cloud1Texture=ScrecnManager.Game.Content.Load<Texture2D>(*'cloud1**);cloud2Texture=ScreenManagcr.Game.Content.Load<Texture2D>("cloud2");sunTexture=ScreenManager.Game.Content.Load<Texture2D>("sunH);moonTexture=ScreenManager.Game.Content.Load<Texture2D>(Mmoon,,);groundTexture=ScreenManager.Game.Content.Load<Texture2D>("ground");tankTexture=ScreenManager.Gamc.Content.Load<Texture2D>(,'tank");mountainsTexture=ScrcenManager.Game.Content.LoadvTexture2D>("mountains_blurrcd");hillsTexture=ScreenManager.Game.Content.Load<Texture2D>(*,hiilsH);alienTexture=ScrcenManager.Game.Content.Load<Texture2D>("alien1");badguybluc=ScrecnManagcr.Game.Content.Load<Texturc2D>("badguyblue");badguyre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年奶粉跨境电商购销合同
- 家电企业文员聘用合同范本
- 管道铺设脚手架钢管租赁协议
- 航空航天项目审计要点
- 城市照明防水保温施工协议
- 地铁基础设施建设招投标案例
- 招投标项目合作法律注意事项
- 医药行业采购合同制度
- 智慧城市二手房交易合同范本
- 制度评审与风险管理
- 四年级数学上册 第4章《运算律》单元测评必刷卷(北师大版)
- 期中测试卷(试题)-2024-2025学年数学五年级上册北师大版
- 2023年医疗器械经营质量管理制度
- 教学能力大赛“教案”【决赛获奖】-
- 诺贝尔奖介绍-英文幻灯片课件
- 球墨铸铁管、钢管顶管穿路施工方案
- GB/T 44672-2024体外诊断医疗器械建立校准品和人体样品赋值计量溯源性的国际一致化方案的要求
- 手术室课件教学课件
- 2024年新人教版一年级上册数学课件 四 11~20的认识 第7课时 解决问题
- 人教版2024八年级上册物理期中测试卷(含答案)
- 2024年普通高等学校招生全国统一考试·新课标卷(物理)附试卷分析
评论
0/150
提交评论