從構(gòu)思到發(fā)布 開發(fā)Windows Phone 7小游戲
原創(chuàng)【51CTO譯文】引言
到底能多快地為運(yùn)行Windows Phone 7的現(xiàn)代化手機(jī)開發(fā)一款功能完備的游戲?為此你需要具備什么條件?又會(huì)面臨什么樣的難題?
我們將在開發(fā)小游戲期間力圖解答上述問題。為了營(yíng)造一種實(shí)際的環(huán)境,這個(gè)功能完備的應(yīng)用程序開發(fā)后將提交到Windows Phone Marketplace。
我們將審查游戲開發(fā)過程的整個(gè)周期,從游戲構(gòu)思開始,到游戲發(fā)布到Marketplace結(jié)束,這個(gè)過程的任何細(xì)節(jié)都不會(huì)遺漏。
游戲構(gòu)思
我們不會(huì)仿效其他游戲。我們考慮的是開發(fā)一款新穎、有趣、絢麗的游戲——是專門為使用方向感應(yīng)器和觸摸屏的手機(jī)而開發(fā)的。你只要將手機(jī)往不同的側(cè)邊傾斜,就可以在方向感應(yīng)器的幫助下操縱小球,好像小球就在方形盒子里面滾動(dòng)。
畫面上有多個(gè)彩球。它們?cè)噲D撞到白球,給白球著上自己的顏色。
用戶只要用指尖點(diǎn)一下彩球,就可以擊碎彩球。你點(diǎn)一下球后,就會(huì)變成色彩鮮艷的飛濺物,然后會(huì)消失,之后新的球會(huì)出現(xiàn)。每擊碎一個(gè)球,就能得到更高的分?jǐn)?shù)。用戶能玩的關(guān)卡數(shù)量沒有限制。
玩家的目標(biāo)應(yīng)該是得到盡可能高的分?jǐn)?shù)。
為了讓玩家可以使用方向感應(yīng)器(而不僅僅擊碎球),為游戲添加了更多的球(黑球)。除非黑球被著上別的顏色,否則不會(huì)被擊碎。
2D圖形對(duì)這款游戲來(lái)說(shuō)綽綽有余。此外,需要播放音樂,與方向感應(yīng)器和觸摸屏進(jìn)行交互。
開發(fā)環(huán)境
為了針對(duì)Windows Phone 7開發(fā)應(yīng)用程序,我們需要Visual C# 2010簡(jiǎn)易版和Windows Phone開發(fā)者工具(Windows Phone Developer Tools)。兩者都是免費(fèi)產(chǎn)品。
然后進(jìn)入到微軟網(wǎng)站,下載和安裝下列工具:
Windows Phone開發(fā)者工具無(wú)法安裝到Windows XP上,不過你可以采取這個(gè)辦法。然而,手機(jī)模擬器可能無(wú)法在Windows XP上運(yùn)行,因而***還是安裝Windows 7。
如果你已經(jīng)擁有Visual Studio 2010,***在上面安裝Windows Phone開發(fā)者工具,因?yàn)閂isual C# 2010 簡(jiǎn)易版用起來(lái)明顯更不方便。
技術(shù)選擇:XNA對(duì)決Silverlight
安裝了Windows Phone開發(fā)者工具后,可以選擇用Studio來(lái)創(chuàng)建新的項(xiàng)目類型:Windows Phone應(yīng)用程序(Windows Phone Application)和Windows Phone游戲(Windows Phone Game)。
哪一個(gè)更適合我們呢?
***個(gè)項(xiàng)目是面向Windows Phone 7的Silverlight應(yīng)用程序。相應(yīng)地,它可以訪問幾乎所有的類,這些類在通常的Silverlight中得到表示。它有XAML和控件以及Studio中的設(shè)計(jì)器等。
第二個(gè)項(xiàng)目是XNA 4.0.應(yīng)用程序。它沒有任何控件;不過,它有游戲周期,可以快速訪問硬件圖形的功能特性。
從名稱和技術(shù)描述來(lái)判斷,我們需要的是XNA。Silverlight有沒有可能也適合開發(fā)游戲?用Silverlight for Windows Phone簡(jiǎn)單測(cè)試一下,就會(huì)發(fā)現(xiàn)這項(xiàng)技術(shù)的局限性:數(shù)百個(gè)同時(shí)運(yùn)動(dòng)的小圖像讓手機(jī)進(jìn)入幻燈片模式。如果我們用XNA進(jìn)行同樣的測(cè)試,一切都快速運(yùn)行(擁有數(shù)量更多的圖像)。
這就是為什么我們用XNA來(lái)開發(fā)游戲。遺憾的是,沒有控件;但目前看來(lái)控件也沒什么用處。
上手XNA
我們不妨用Studio來(lái)創(chuàng)建Windows Phone游戲項(xiàng)目。該項(xiàng)目與游戲類一同出現(xiàn):
public class Game1 : Microsoft.Xna.Framework.Game
不妨定義用戶在玩游戲期間如何握持手機(jī)。假設(shè)一只手握持手機(jī)(旋轉(zhuǎn)手機(jī)即可操縱白球)、另一只手點(diǎn)彩球更為舒適。這意味著,我們需要縱向游戲模式。我們?yōu)橛螒驑?gòu)建器添加了這種模式。
- public Game1()
 - {
 - graphics = new GraphicsDeviceManager(this);
 - Content.RootDirectory = "Content";
 - graphics.SupportedOrientations = DisplayOrientation.Portrait;
 - graphics.PreferredBackBufferWidth = 480;
 - graphics.PreferredBackBufferHeight = 800;
 - graphics.IsFullScreen = true;
 - }
 
然后在這個(gè)類中,我們最感興趣的是兩項(xiàng)功能:Update(更新)和Draw(繪制)。
- 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(TODO:在這里添加更新邏輯)
 - base.Update(gameTime);
 - }
 - protected override void Draw(GameTime gameTime)
 - {
 - GraphicsDevice.Clear(Color.CornflowerBlue);
 - // TODO: Add your drawing code here(TODO:在這里添加繪制代碼)
 - base.Draw(gameTime);
 - }
 
***項(xiàng)功能專門用于游戲邏輯處理。我們會(huì)得到用戶動(dòng)作(從方向感應(yīng)器到觸摸屏)方面的數(shù)據(jù),并算出所有游戲物體的新位置。
第二項(xiàng)功能專門用于繪制屏幕上的游戲物體。
有必要說(shuō)明:這兩項(xiàng)功能執(zhí)行的總時(shí)間不該超過游戲周期的一次迭代。這在手機(jī)上相當(dāng)于33毫秒,因?yàn)橛螒蛑芷诘念l率是每秒30幀。如果功能執(zhí)行的時(shí)間超過這個(gè)值,游戲速度就會(huì)很慢,一些幀就會(huì)被遺漏,或者更糟糕的是,游戲會(huì)忽略用戶動(dòng)作。
這個(gè)游戲?qū)嶋H上是實(shí)時(shí)應(yīng)用程序。它對(duì)垃圾收集器(Garbage Collector)的動(dòng)作會(huì)有怎樣的反應(yīng)?***是避免垃圾收集器突然干預(yù)的情況,那樣我們可以順利地處理物體,不用在每次迭代時(shí)創(chuàng)建成千上萬(wàn)物體。一般來(lái)說(shuō),我們不需要經(jīng)常創(chuàng)建物體,因?yàn)橛螒蚴澜绲乃形矬w相對(duì)來(lái)說(shuō)歷時(shí)長(zhǎng)久。我們會(huì)使用已有物體的結(jié)構(gòu)或鏈接作為特征參數(shù)。這樣一來(lái),垃圾收集器不會(huì)阻止我們做所需的動(dòng)作。
我們不妨試著編譯和啟動(dòng)應(yīng)用程程序。在幾臺(tái)電腦上,你可能會(huì)看到表明XNA無(wú)法在模擬器上啟動(dòng)的消息。這樣一來(lái),你可能要?jiǎng)?chuàng)建Windows游戲項(xiàng)目,并附加來(lái)自Windows Phone游戲項(xiàng)目的文件(Add As Link,即添加為鏈接)。同樣這些XNA代碼可以在手機(jī)和Windows(以及XBOX 360)上運(yùn)行。
***,有一個(gè)窗口填滿了紫色。這是由于GraphicsDevice.Clear(Color.CornflowerBlue)功能執(zhí)行的結(jié)果。
游戲類中有一個(gè)SpriteBatch對(duì)象類。我們?cè)诶L制時(shí)需要這個(gè)對(duì)象。它含有處理2D圖形和文本的所有必要方法。
不過我們?nèi)匀鄙僮钪匾姆矫妫河螒騼?nèi)容。#p#
游戲內(nèi)容
游戲內(nèi)容是游戲必不可少的不同資源,比如紋理(用于繪制的圖像)、字體(輸出文本時(shí)需要)和聲音。
我們?cè)趧?chuàng)建Windows Phone游戲項(xiàng)目的同時(shí),還創(chuàng)建了名稱是“Content”的另一個(gè)項(xiàng)目。我們應(yīng)該為這個(gè)項(xiàng)目添加圖像和聲音文件。
此外,我們應(yīng)該設(shè)定用于這個(gè)項(xiàng)目中文本輸出的所有字體。
在Content.Load(assetName)函數(shù)的幫助下,將內(nèi)容裝入到程序很簡(jiǎn)單。游戲類中擁有Content屬性。我們連同內(nèi)容添加到項(xiàng)目中的資源名稱應(yīng)該設(shè)成assetName。通常來(lái)說(shuō),這僅僅是沒有擴(kuò)展名的文件名。要使用的內(nèi)容類型(Texture2D、SpriteFont或SoundEffect)應(yīng)該設(shè)成T。
內(nèi)容裝入不是一種快速操作,這就是為什么我們?cè)谟螒蜷_始時(shí)會(huì)裝入所有內(nèi)容,以便需要時(shí)可以使用。
現(xiàn)在一切已準(zhǔn)備好,我們可以開始開發(fā)游戲了。
游戲邏輯
所有游戲邏輯都可以放入到GameController這個(gè)單獨(dú)的類中?,F(xiàn)在,游戲類中的Update功能看起來(lái)如同這樣:
- protected override void Update(GameTime gameTime)
 - {
 - // Allows the game to exit(允許游戲退出)
 - if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
 - this.Exit();
 - GameController.Update(gameTime);
 - base.Update(gameTime);
 - }
 
注意:我們把GameTime類的對(duì)象發(fā)送到GameController.Update。它擁有ElapsedGameTime屬性,該發(fā)展表明自上一次調(diào)用Update功能上以來(lái)過去了多長(zhǎng)時(shí)間。這個(gè)時(shí)間通常是固定的,相當(dāng)于手機(jī)上的33毫秒。不過,***不要依靠它,而是在所有計(jì)算中都使用發(fā)送的值。
我們?cè)谛枰?jì)算游戲世界物體的運(yùn)動(dòng)時(shí),將使用ElapsedGameTime。比如說(shuō),如果我們需要計(jì)算白球的新位置(受手機(jī)傾斜的影響),它看起來(lái)會(huì)這樣:
position += (float)(acceleration * gameTime.ElapsedGameTime.TotalSeconds);
小球和飛濺物(它們一出現(xiàn))的半徑按這種方式來(lái)計(jì)算:
radius += (float)(GrowSpeed * gameTime.ElapsedGameTime.TotalSeconds);
所有計(jì)算會(huì)用不同的類來(lái)進(jìn)行。每個(gè)類都有各自相似的Update(gameTime)功能。GameController.Update會(huì)調(diào)用它們。#p#
繪制圖形
繪制圖形發(fā)送到GameController類。游戲類中的Draw功能現(xiàn)在看起來(lái)這樣:
- protected override void Draw(GameTime gameTime)
 - {
 - GraphicsDevice.Clear(Color.Black);
 - spriteBatch.Begin();
 - GameController.Draw(spriteBatch);
 - spriteBatch.End();
 - base.Draw(gameTime);
 - }
 
注意:我們只將SpriteBatch對(duì)象類發(fā)送到GameController.Draw。它只用于繪制。我們這里不需要GameTime,因?yàn)樗斜匾挠?jì)算已經(jīng)在Update功能中進(jìn)行。
隨后,GameController.Draw會(huì)從得到游戲世界邏輯的類調(diào)用相似的Draw(spriteBatch)功能。
繪制本身看起來(lái)相當(dāng)簡(jiǎn)單:
spriteBatch.Draw(texture, position, color);
這時(shí)我們只能顯示準(zhǔn)備好的紋理。繪制2D基本圖形(直線、長(zhǎng)方形和橢圓形等)的功能并不由XNA來(lái)提供。
可以通過從內(nèi)容裝入紋理來(lái)得到紋理:
Texture2D texture = Content.Load
紋理已經(jīng)被裝入了;所有位置已被計(jì)算出來(lái);不過,我們可以“調(diào)整”顏色!如果我們需要原始紋理顏色,就要有Color.White。
如果我們需要另一種顏色,應(yīng)該用這種顏色布局來(lái)繪制紋理。如果我們要用阿爾法通道(alpha channel)來(lái)設(shè)定顏色,那么就能透明地繪制紋理。那樣,我們就能輕松自如地顯現(xiàn)和隱匿物體以及顏色變化(這些正是我們?cè)谟螒蛑行枰?。
為了混合兩種顏色,我們使用Color.Lerp函數(shù)。為了增加阿爾法通道,應(yīng)使用Color.FromNonPremultiplied 函數(shù)。
另外還有spriteBatch.Draw函數(shù)的其他變種,允許變化和擴(kuò)展文本,這也是我們的游戲所需要的。
文本輸出
文本輸出就跟圖形輸出一樣簡(jiǎn)單:
spriteBatch.DrawString(spriteFont, text, position, color);
你可以通過從內(nèi)容裝入SpriteFont類的對(duì)象來(lái)得到對(duì)象:
SpriteFont spriteFont = Content.Load
你還可以在這里以同樣的方式設(shè)置字體顏色。如果你用阿爾法通道設(shè)置顏色,文本將是透明的。
如果你用浮動(dòng)位置設(shè)置文本輸出的坐標(biāo),那么文本在顯示時(shí)可能會(huì)有點(diǎn)失真。這就是為什么在流暢的文本移動(dòng)沒必要時(shí),我們要將坐標(biāo)舍入到整數(shù)。
spriteBatch.DrawString函數(shù)有其他變種,允許改變和擴(kuò)展文本。有必要記住:這種運(yùn)動(dòng)會(huì)引起文本表述錯(cuò)誤。之所以會(huì)出現(xiàn)這種情況,是因?yàn)閄NA并不處理原始向量字體,但能處理柵格表示;項(xiàng)目一編譯好,就會(huì)創(chuàng)建柵格,隨后添加到內(nèi)容中。#p#
觸摸屏
為了定義用戶在何處點(diǎn)擊屏幕,應(yīng)該從Microsoft.Xna.Framework.Input.Touch.TouchPanel類得到數(shù)據(jù):
- foreach (var item in TouchPanel.GetState())
 - {
 - if (item.State == TouchLocationState.Pressed
 - || item.State == TouchLocationState.Moved)
 - {
 - // Get item.Position(得到item.Postion)
 - }
 - }
 
因此,我們就能得到用戶觸摸的所有屏幕點(diǎn)。不過,我們需要關(guān)于屏幕觸摸一次性動(dòng)作(點(diǎn)擊、在屏幕上移動(dòng)手指時(shí))的數(shù)據(jù)。這些數(shù)據(jù)是跟蹤屏幕按鈕(比如暫停按鈕)觸摸所必可不少的。為了得到這些數(shù)據(jù),應(yīng)使用手勢(shì)支持。
在游戲開始時(shí),應(yīng)該表明我們需要支持手勢(shì)(點(diǎn)擊):
TouchPanel.EnabledGestures = GestureType.Tap;
然后,我們可以在游戲周期的每次迭代得到手勢(shì):
- while (TouchPanel.IsGestureAvailable)
 - {
 - GestureSample gesture = TouchPanel.ReadGesture();
 - if (gesture.GestureType == GestureType.Tap)
 - {
 - // Get guesture.Position(得到guesture.Position)
 - }
 - }
 
方向感應(yīng)器
為了得到關(guān)于手機(jī)傾斜的數(shù)據(jù),就要使用Microsoft.Devices.Sensors.Accelerometer類。遺憾的是,我們無(wú)法直接從方向感應(yīng)器得到數(shù)據(jù),因?yàn)樗恢С质录J?。這就是為什么應(yīng)該使用創(chuàng)建對(duì)象和訂閱事件的附屬類:
- accelerometer = new Microsoft.Devices.Sensors.Accelerometer();
 - accelerometer.ReadingChanged += AccelerometerChanged;
 - accelerometer.Start();
 
在事件處理器中,我們會(huì)記住加速值,并保存起來(lái),以便以后使用:
- private void AccelerometerChanged(object sender, AccelerometerReadingEventArgs e)
 - {
 - vector = new Vector3((float)e.X, (float)e.Y, (float)e.Z);
 - }
 
加速向量含有三個(gè)軸(X軸、Y軸和Z軸)的信息,但我們先只需要頭兩個(gè)軸(用于手機(jī)的縱向模式)。這就是為什么在我們的坐標(biāo)系中返回加速的屬性看起來(lái)這樣:
- public Vector2 Acceleration
 - {
 - get
 - {
 - return new Vector2(vector.X, -vector.Y);
 - }
 - }
 
是的,這個(gè)加速會(huì)被施加于白球。#p#
播放聲音
可以在SoundEffect類的對(duì)象中Play函數(shù)的幫助下,播放XNA中的聲音。這個(gè)類的對(duì)象可以從內(nèi)容裝入:
SoundEffect sound = Content.Load
只要這么處理,就可以播放聲音了。
窗口
許多東西已準(zhǔn)備好:白球通過方向感應(yīng)器來(lái)運(yùn)動(dòng),其余球會(huì)追白球;一旦撞上,就會(huì)變成飛濺物,會(huì)計(jì)算分?jǐn)?shù),隨后播放聲音??雌饋?lái)像是一切準(zhǔn)備就緒?不,沒有這么簡(jiǎn)單。
現(xiàn)在我們需要?jiǎng)?chuàng)建窗口;開始窗口(主菜單)、暫停對(duì)話窗口和游戲結(jié)束窗口(顯示得分?jǐn)?shù)和記錄)。
面向Windows Phone的XNA沒有窗口,這就是為什么我們得自己創(chuàng)建窗口。不過,實(shí)際創(chuàng)建起來(lái)比較簡(jiǎn)單。
用Parent、Children、Bounds、Visible和Enabled這些主要功能以及Update和Draw兩個(gè)函數(shù)創(chuàng)建一個(gè)基本控件就夠了。然后,應(yīng)該創(chuàng)建幾個(gè)子類:Window、Button和Label等。
之后,就很容易在窗口中顯示元素。
保存游戲狀態(tài)
手機(jī)上的游戲可以隨時(shí)暫停,只要點(diǎn)擊Home按鈕或借助其他任何外部事件。這就是為什么我們要注意隨時(shí)保存游戲狀態(tài),等游戲啟動(dòng)后,可以進(jìn)一步恢復(fù)這個(gè)狀態(tài)。
不妨使用System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings類來(lái)保存狀態(tài)(及設(shè)置)。這個(gè)類實(shí)現(xiàn)了IDictionary接口。我們不妨把所有游戲世界物體(但愿物體數(shù)量不多)的的當(dāng)前狀態(tài)概括到這個(gè)詞典中,并調(diào)用IsolatedStorageSettings.ApplicationSettings.Save()函數(shù)。
退出游戲時(shí),游戲會(huì)保存起來(lái)。為此,不妨覆蓋游戲類中的OnExiting函數(shù):
- protected override void OnExiting(object sender, EventArgs args)
 - {
 - GameController.SaveState();
 - base.OnExiting(sender, args);
 - }
 
游戲恢復(fù)以類似方式進(jìn)行。應(yīng)用程序啟動(dòng)時(shí),我們收到來(lái)自IsolatedStorageSettings.ApplicationSettings的數(shù)據(jù),恢復(fù)所有游戲世界物體。
應(yīng)用程序的激活和停用
我們的這個(gè)應(yīng)用程序并不總是處于活動(dòng)狀態(tài)。有時(shí)它可能被停用了(比如來(lái)電時(shí)),需要再次激活。
為了跟蹤這些事件,不妨覆蓋游戲類中的OnActivated函數(shù)和OnDeactivated函數(shù)。
在應(yīng)用程序停用期間,我們讓游戲處于暫停模式,那樣用戶回來(lái)后,關(guān)于恢復(fù)游戲的對(duì)話消息會(huì)出現(xiàn)。
此外,為了不浪費(fèi)處于停用狀態(tài)的手機(jī)的計(jì)算資源,我們?cè)谟螒蝾愔蠻pdate函數(shù)的開頭添加下列代碼:
- if (!IsActive)
 - {
 - SuppressDraw();
 - return;
 - }
 
#p#啟動(dòng)畫面
我們的游戲(確切地說(shuō),是游戲內(nèi)容)在幾秒鐘內(nèi)裝入,在這個(gè)裝入期間只顯示黑色屏幕。我們應(yīng)該向用戶表明應(yīng)用程序在運(yùn)行中。為此,應(yīng)該繪制一個(gè)漂亮的啟動(dòng)畫面(splash screen),在游戲啟動(dòng)時(shí)顯示:
如果你只是往Silverlight應(yīng)用程序里面添加針對(duì)Windows Phone的SplashScreenImage.jpg文件,啟動(dòng)畫面會(huì)自動(dòng)顯示。
不過這對(duì)XNA項(xiàng)目來(lái)說(shuō)行不通。
我們得改動(dòng)內(nèi)容的裝入。首先,我們?yōu)閱?dòng)畫面做好紋理,然后在***次調(diào)用Draw函數(shù)的過程中繪制紋理。然后,我們裝入其余內(nèi)容,啟動(dòng)游戲。直到其余內(nèi)容都裝入,啟動(dòng)畫面才顯示。
現(xiàn)在,這個(gè)游戲看起來(lái)漂亮多了。
手機(jī)中的游戲位置
為了讓我們的游戲出現(xiàn)在手機(jī)中的Games部分(只要點(diǎn)擊手機(jī)開始屏幕上的XBOX LIVE按鈕,就能訪問它),需要編輯項(xiàng)目中的WMAppManifest.xml文件。應(yīng)該在這個(gè)文件中,而不是在Genre="Apps.Normal"這一行中編寫Genre="Apps.Games"。
另外我們把游戲名稱和描述放入到同一個(gè)文件(分別是Title和Description屬性)。刪除不必要的需求(section)。在這個(gè)部分中,我們只留下方向感應(yīng)器支持。這個(gè)版本的游戲不需要其他部分。
該項(xiàng)目應(yīng)該有兩幅圖片:GameThumbnail.png和Background.png。
Games部分的游戲顯示區(qū)需要***幅圖片。手機(jī)的開始屏幕需要第二幅圖片。這兩幅圖片的大小都應(yīng)該是173×173像素。
試用模式
由于我們開發(fā)的這個(gè)游戲?qū)⑹鞘召M(fèi)游戲,需要添加試用模式支持。試用功能已經(jīng)內(nèi)置到平臺(tái)中,在Microsoft.Phone.Marketplace.LicenseInformation類的幫助下完成:
- var license = new Microsoft.Phone.Marketplace.LicenseInformation();
 - return license.IsTrial();
 
由于該函數(shù)相當(dāng)慢,我們不會(huì)在每次游戲周期迭代時(shí)調(diào)用它。相反,我們只會(huì)在應(yīng)用程序激活時(shí)才調(diào)用它(在游戲類的OnActivated函數(shù)中,結(jié)果將作為變量來(lái)保存)。
如果應(yīng)用程序在試用模式下啟動(dòng),那么在試用幾分鐘后,就會(huì)出現(xiàn)提供游戲購(gòu)買(或開始新游戲)的窗口。
點(diǎn)擊購(gòu)買按鈕時(shí),我們就會(huì)調(diào)用、在Windows Phone Marketplace中顯示應(yīng)用程序:
- var market = new Microsoft.Phone.Tasks.MarketplaceDetailTask();
 - market.Show();
 
購(gòu)買后,用戶可以回到應(yīng)用程序,繼續(xù)玩游戲。
后退按鈕
一切幾乎已準(zhǔn)備好,我們要把應(yīng)用程序發(fā)送到Windows Phone Marketplace。在發(fā)布之前,該應(yīng)用程序經(jīng)過微軟的認(rèn)真測(cè)試;幾天后,微軟給出了結(jié)論:拒絕接受。原因出在哪里?
問題出在我們?cè)赨pdate函數(shù)中留下的代碼。
- protected override void Update(GameTime gameTime)
 - {
 - // Allows the game to exit(允許游戲退出)
 - if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
 - this.Exit();
 - ...
 - }
 
后退(Back)這個(gè)硬件按鈕必須以某種方式來(lái)工作,也就是讓用戶回到前一個(gè)屏幕。如果用戶在應(yīng)用程序的開始屏幕(主游戲菜單)上,可以使用該按鈕來(lái)退出應(yīng)用程序。如果處在暫停模式下,該按鈕可以讓用戶回到游戲中。
在我們這個(gè)情況下,后退按鈕總是調(diào)用應(yīng)用程序退出。不妨清除這個(gè)代碼,讓后退按鈕能夠正確工作,再次發(fā)送給微軟進(jìn)行審查。重復(fù)審查所用時(shí)間比較少。#p#
結(jié)果
是的,這個(gè)應(yīng)用程序得到了接受!現(xiàn)在,該游戲出現(xiàn)在Windows Phone Marketplace中了。
我們?cè)谟螒蜷_發(fā)上總共花了兩周時(shí)間(發(fā)布到Marketplace又花了兩周時(shí)間)。***,我們擁有了一個(gè)漂亮而誘人的游戲:
***WP7游戲網(wǎng)站的編輯人員評(píng)論了這款游戲。
提交一周后,這個(gè)游戲就躋身于Windows Phone Marketplace***的100款收費(fèi)游戲中。
我們從這次游戲開發(fā)中能夠得到什么樣的結(jié)論?答案是:為Windows Phone 7開發(fā)游戲其實(shí)簡(jiǎn)單得很!
51CTO觀點(diǎn)
諾基亞日前與微軟正式簽訂Windows Phone 7合作協(xié)議,并放棄Symbian系統(tǒng)的研發(fā)業(yè)務(wù),這足以表明Windows Phone操作系統(tǒng)將成為諾基亞主要的智能手機(jī)平臺(tái)。諾基亞與微軟的強(qiáng)強(qiáng)聯(lián)手將會(huì)給開發(fā)者帶來(lái)良好的開發(fā)環(huán)境,學(xué)習(xí)Windows Phone平臺(tái)對(duì)開發(fā)者來(lái)說(shuō)會(huì)是個(gè)不錯(cuò)的選擇。
【51CTO.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文作者及出處!】
【編輯推薦】
- 微軟發(fā)布WP軟件包 吸引iOS開發(fā)人員
 - 如何在Windows Phone 7 3D開發(fā)中使用紋理貼圖
 - 使用IronRuby開發(fā)Windows Phone 7應(yīng)用程序
 - 獨(dú)立開發(fā)者分享手機(jī)游戲開發(fā)經(jīng)驗(yàn)
 - SocialTimes:手機(jī)社交游戲開發(fā)秘籍
 

















 
 
 
 
 
 
 