windowsphone开发xna游戏设计.docx

上传人:b****6 文档编号:8760785 上传时间:2023-02-01 格式:DOCX 页数:7 大小:53.89KB
下载 相关 举报
windowsphone开发xna游戏设计.docx_第1页
第1页 / 共7页
windowsphone开发xna游戏设计.docx_第2页
第2页 / 共7页
windowsphone开发xna游戏设计.docx_第3页
第3页 / 共7页
windowsphone开发xna游戏设计.docx_第4页
第4页 / 共7页
windowsphone开发xna游戏设计.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

windowsphone开发xna游戏设计.docx

《windowsphone开发xna游戏设计.docx》由会员分享,可在线阅读,更多相关《windowsphone开发xna游戏设计.docx(7页珍藏版)》请在冰豆网上搜索。

windowsphone开发xna游戏设计.docx

windowsphone开发xna游戏设计

摘要

在上一篇文章中我们为大家介绍了XNAGameStudio4.0的基本功能与支持游戏设计的特性和优势,做为使用XNAGameStudio4.0版设计游戏程序的基础。

这一回我们将要为大家介绍如何使用VisualStudio2010或VisualStudio2010ExpressforWindowsPhone设计以XNA为基础的WindowsPhone7游戏程序,并了解以XNA为基础的游戏程序的基础架构与核心功能。

 XNA游戏程序结构

使用MicrosoftVisualStudio2010ExpressforWindowsPhone建立的WindowsPhoneGame(4.0)型态的项目中,名称为Game1.cs的程序档案是整个游戏最主要的核心,负责定义名称为Game1的类别,打造以XNA为基础的游戏的基本结构。

有关使用MicrosoftVisualStudio2010ExpressforWindowsPhone建立XNA游戏项目的说明可以参考:

[WindowsPhone7智能型手机应用程序开发总览]一文的说明。

Game1类别继承自XNAFramework提供的Microsoft.Xna.Framework.Game类别,预设会覆写基础类别的Initialize方法、LoadContent方法、UnloadContent方法、Update方法、Draw方法,加上Game1类别自己的建构函式,形成游戏最基本的结构。

例如以下就是一个XNA游戏类别的最基本的类别及类别的结构:

publicclassGame1:

Microsoft.Xna.Framework.Game

{

publicGame1(){}

protectedoverridevoidInitialize(){}

protectedoverridevoidLoadContent(){}

protectedoverridevoidUnloadContent(){}

protectedoverridevoidUpdate(GameTimegameTime){}

protectedoverridevoidDraw(GameTimegameTime){}

}

 Game类别主要方法的功能

在Game1类别覆写基础类别的方法中,名称为Initialize的方法与Game1类别的建构函式负责执行游戏初始化的工作,名称为LoadContent的方法负责自ContentPipeline项目加载透过ContentPipeline技术预先处理成二进制数据的游戏资源,名称为UnloadContent的方法负责执行释放资源的动作,请注意以XNA为基础的应用程序只需要释放非ContentManager管理的资源即可,意即未透过ContentManager类别的Add方法加入到ContentManager进行管理的资源才有需要在UnloadContent方法执行释放资源的动作。

Game1类别中名称为Update的方法负责更新游戏的状态,例如要将游戏的主角从X坐标等于100的位置移动到X坐标为500的位置,改变主角坐标的动作就可以在Update方法中执行。

请注意Update方法只负责更新游戏的状态,不负责更新游戏的显示画面,换句话说,Update方法只负责更新主角的坐标位置,但是并不负责将主角显示在新的坐标位置,负责更新游戏显示内容的是名称为Draw的方法,所有显示游戏最新状态的工作,皆由Draw方法负责执行。

 XNA游戏程序的基本结构

了解Game1类别各个方法的基本功能之后,接下来我们就要来探讨Game1类别各个方法必须执行的工作,以成功地建立一个能够执行的WindowsPhone7游戏程序。

图1所示即为一个WindowsPhone7游戏程序从启动到结束执行的运作过程,以及游戏程序执行过程中每个阶段必须执行的工作:

图1:

WindowsPhone7游戏程序从启动到结束执行的各个阶段必须执行的工作

[注意]

以XNA为基础的WindowsPhone7游戏程序在游戏一开始会自动建立游戏核心类别(即Game1类别)的对象,程序设计师不需要制作建立Game1类别的对象的程序代码。

游戏程序开始执行并完成建立Game1类别的对象之后,第二个阶段就是执行游戏初始化。

游戏初始化阶段主要的工作在建立GraphicsDeviceManager类别的对象。

假设当做游戏核心的类别的名称为Game1,则我们可以在Game1类别的建构函式中执行建立GraphicsDeviceManager类别的对象的动作,并设定GraphicsDeviceManager类别的对象的PreferredBackBufferHeight属性和PreferredBackBufferWidth属性,指定游戏窗口的高度和宽度。

除了设定GraphicsDeviceManager类别的对象的属性以外,我们还可以设定Game1类别的对象的TargetElapsedTime属性,控制游戏程序更新状态及显示内容的频率,做法如下:

publicGame1()

{

graphics=newGraphicsDeviceManager(this);//建立GraphicsDeviceManager類別的物件

Content.RootDirectory="Content";//設定遊戲資源的根目錄

graphics.PreferredBackBufferHeight=480;//設定遊戲視窗的高度

graphics.PreferredBackBufferWidth=800;//設定遊戲視窗的寬度

//Framerateis30fpsbydefaultforWindowsPhone.

TargetElapsedTime=

TimeSpan.FromTicks(333333);//設定遊戲程式更新狀態及顯示內容的頻率為每秒30次

}

[说明]

WindowsPhone7智能型手机目前只有屏幕高度为800,宽度为480的版本,因此将游戏窗口设定成高度480,宽度800的大小,表示游戏要以横式屏幕的方式执行,另外Game1类别的对象的TargetElapsedTime属性负责控制游戏程序更新状态及显示内容的频率,将TargetElapsedTime属性设定成333333,表示更新频率为0.0333333,也就是每秒要更新30次。

请注意每秒更新30次适合在WindowsPhone7智能型手机平台执行的游戏,但是不一定适合在PC个人计算机平台或Xbox360游机

游戏程序完成初始化之后,第三个阶段负责执行加载游戏资源的动作,也就是要加载游戏程序执行的时候需要用到所有资源,包括音效、音乐、图形、和字型等等。

负责加载游戏程序需要使用的所有资源的动作可以交给Game1类别的LoadContent方法负责完成,例如以下就是负责加载游戏程序需要使用的图形资源的程序代码:

Texture2Dgenie=null;//宣告Texture2D類別的物件

protectedoverridevoidLoadContent()

{

//CreateanewSpriteBatch,whichcanbeusedtodrawtextures.

spriteBatch=newSpriteBatch(GraphicsDevice);//建立SpriteBatch類別的物件

//TODO:

usethis.Contenttoloadyourgamecontenthere

genie=Content.Load("genie");

}

请注意上述的程序代码会在游戏程序初始化的阶段建立SpriteBatch类别的对象,而建立SpriteBatch类别的对象的时候需要传入GraphicsDeviceManager类别的对象当做参数。

SpriteBatch类别的对象主要的用途在显示游戏程序欲显示的2D图形,包括游戏背景、游戏人物、游戏的状态、甚至是游戏提示供用户选取的菜单。

除了建立SpriteBatch类别的对象以外,游戏程序必须在初始化的阶段负责加载游戏程序执行时需要用到的所有资源,例如上述的程序代码中这一行程序代码:

genie=Content.Load("genie");

负责从ContentPipeline项目的根目录加载名称为genie的资源,因为程序代码指定欲加载的是Texture2D格式的资源,也就是图形资源,所以在ContentPipeline项目中必须备妥名称为genie的图形档案,其扩展名可以是.bmp、.dds、.dib、.hdr、.jpg、.pfm、.png、.ppm、和.tga等常见的图形格式档案。

有关XNA游戏程序支持的图形文件格式可以参考 认识XNAGameStudio4.0 一文的说明。

[提示]

将上述程序代码中的Texture2D型态更换成SoundEffect型态,可以自ContentPipeline项目加载声音文件(扩展名为.wma的档案),将上述程序代码中的Texture2D型态更换成Song型态,可以自ContentPipeline项目加载音乐档案(扩展名为.mp3的档案),而将上述程序代码中的Texture2D型态更换成SpriteFont型态,可以自ContentPipeline项目加载字型定义档案(扩展名为.SpriteFont的档案)。

[说明]

请注意上述的程序先在类别中宣告了一个型态为Texture2D类别,名称为genie的变量,负责管理游戏程序需要使用的图形。

加载妥游戏执行时需要用到的所有资源之后,游戏程序就可以进入运行时间,处理使用者的输入,更新游戏的状态,并显示游戏最新的内容。

XNA游戏程序一进入运行时间便会不断地呼叫Update方法和Draw方法,其详细的行为与呼叫的频率稍后会有详细的讨论。

假设游戏程序利用Game1类别定义的pos变量控制游戏人物显示的位置,则程序设计师可以于Game1类别的Update方法中更新pos变量的内容值,以便改变游戏人物显示的位置,完成更新游戏状态的工作,如下:

intpos=0;//存放遊戲人物位置的變數

protectedoverridevoidUpdate(GameTimegameTime)

{

//Allowsthegametoexit

if(GamePad.GetState(PlayerIndex.One).Buttons.Back==

ButtonState.Pressed)//如果使用者按下智慧型手機的[Back]鍵,回到上一個畫面

this.Exit();//結束遊戲程式

if(pos<=500)//如果pos變數的內容值不大於500

{

pos++;//遞增pos變數的內容值

}

base.Update(gameTime);//呼叫基礎類別的Update方法

}

请注意Game1类别的Update方法只负责更新游戏的状态,不负责更新游戏显示的内容,更新游戏显示内容的工作是由Game1类别的Draw方法负责的。

例如以下的Draw方法便会将游戏的人物移至X坐标等于pos变量的内容值的位置:

protectedoverridevoidDraw(GameTimegameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);//清除遊戲程式目前顯示的內容

//TODO:

Addyourdrawingcodehere

spriteBatch.Begin();//宣告顯示遊戲內容的動作開始

spriteBatch.Draw(genie,newVector2(pos,100),

Color.White);//將genie變數所管理的圖形的x座標顯示在pos變數的內容值指定的位置

spriteBatch.End();//宣告顯示遊戲內容的動作結束

base.Draw(gameTime);//呼叫基礎類別的Draw方法

}

[提示]

以XNA为基础的游戏程序可以在呼叫spriteBatch对象的Begin方法和呼叫spriteBatch对象的End方法之间执行多个绘制图形和文字的动作,由XNAFramework以批次的方式一次显示多个图形内容。

另外还有一点需要提醒大家的是Game1类别的Update方法和Draw方法都会接一个型态为GameTime的参数,程序设计师可以从这个参数得知游戏程序开始迄今的时间,以及自上一次Update方法被呼到迄今的时间,做为控制更新游戏状态与更新游戏内容的参考。

当游戏程序结束执行的时候,游戏程序可以利用Game1类别的UnloadContent方法释放所有未透过呼叫Content对象的Load方法加载的资源。

换句话说,所有透过呼叫Content对象的Load方法加载的资源可以不需要执行释放的动作,呼叫Content对象的Load方法加载的资源会由ContentManager负责执行释放的动作。

游戏程序执行的最后一个阶段是结束执行,结束游戏程序执行的动作很简单,游戏程序只要呼叫Game1类别的Exit方法就可以结束游戏程序的执行。

 Update方法与Draw方法的呼叫时机

前面有提到,XNA游戏程序一进入运行时间便会不断地呼叫Update方法和Draw方法,其中的Update方法负责更新游戏程序的状态,而Draw方法则负责显示游戏的内容。

请注意并不是每一次Update方法被呼叫之后,Draw方法就会跟着被呼叫,Update方法与Draw方法被呼叫的频率要视Game1类别的IsFixedTimeStep属性的内容值而定。

如果Game1类别的IsFixedTimeStep属性的内容值为true(默认值),则游戏程序处于固定更新(fixed-step)模式。

使用固定更新模式的游戏程序,其Update方法被呼叫的频率是由Game1类别的TargetElapsedTime属性的内容值定义的,其默认值视执行游戏程序的平台的不同而有不同。

如果游戏程序在PC个人计算机或Xbox360游戏机中执行,Update方法呼叫的频率为每秒60次,如果游戏程序在WindowsPhone7智能型手机中执行,因为其处理器的速度较慢,Update方法呼叫的频率为每秒30次。

请注意Update方法被呼叫的频率是一个游戏程序努力要达到的目标值,而不是一定可以达到的数据。

如果游戏程序在PC个人计算机或Xbox360游戏机上执行,但是却无法在1/60秒内完成Update方法和Draw方法执行的工作,则Update方法的gameTime参数(型态为GameTime类别)的IsRunningSlowly属性将会被设定为true,表示游戏程序无法以正常的速度执行,此时游戏程序会在呼叫Update方法之后,将不会伴随着呼叫负责显示游戏内容的Draw方法,而是继续呼叫Update方法,以跟上TargetElapsedTime属性的内容值定义的更新频率,如果此举还是无法令游戏程序跟上欲达到的更新频率,则放弃。

其结果将会造成游戏程序在呼叫负责更新游戏状态的Update方法几次之后才呼叫一次负责显示内容的Draw方法,因此游戏显示的人物的动作将会呈现动作不顺畅的现象。

当游戏程序出现动作更新显示不顺畅的现象时,我们可以降低TargetElapsedTime属性内容值,降低应用程序的更新频率,或是将Game1类别的IsFixedTimeStep属性的内容值为false,令游戏程序以可变更新(variable-step)模式来执行。

请注意以可变更新模式执行的游戏程序会不断地呼叫Update方法和Draw方法,周而复始而且不间断,不管Game1类别的TargetElapsedTime属性的设定值为何。

[特别注意]

不管以XNA为基础的游戏程序采用固定更新(fixed-step)模式执行,或是采用可变更新(variable-step)模式执行,Game1类别的Update方法和Draw方法都会持续地被呼叫,直到游戏结束为止,也就是说游戏程序本身都已经身处循环之中,除非有特殊的需求,否则在Update方法和Draw方法中不需要再使用循环的语法进行控制。

例如我们要将游戏中的动画人物从X坐标为0的位置移动到X坐标为500的位置,不可以在Game1类别的Update方法加入以下的程序代码,以更新动画人物的显示位置(假设pos是负责控制动画人物X坐标位置的变量):

for(inti=0;i<=500;i++)

{

pos=i;

}

因为上述的循环在执行的时候会造成Update方法执行较久,等Update方法执行完毕才会呼叫Draw方法,所以游戏程序执行的时候我们将会看到动画人物原本在X坐标为0的位置,等循环跑完,动画人物会直接在X坐标为500的位置出现,用户将不会看到动画人物从X坐标为0的位置移至X坐标为500的位置的移动过程,造成动画人物移动的过程很突兀,没有渐进的效果。

要令动画人物移动位置的时候有渐进的效果,我们可以在Update方法中利用以下的程序代码改变负责控制动画人物X坐标位置的pos变量的内容值:

if(pos<=500)

{

pos++;

}

因为Update方法会被持续不断地呼叫,每被呼叫一次,动画人物的X坐标的内容值就会改变,当Draw方法被呼叫的时候,使用者就可以看到动画人物渐进移动至目标位置的效果。

[结语]

这一回我们为大家介绍了如何使用VisualStudio2010或VisualStudio2010ExpressforWindowsPhone设计以XNA为基础的WindowsPhone7游戏程序,并了解以XNA为基础的游戏程序的基础架构与核心功能。

下一回我们将要为大家介绍XNAFramework支持游戏程序制作的重要类别,做为开发游戏程序的基础知识。

原文链接:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1