WP7 源碼加分析

Windows手機操作系統上有兩個用戶界面開發的編程模型:Silverlight和XNA。

Silverlight,比NET Framework 功能稍弱的框架,給業務應用開發提供了一個相對快速開發系統模型。Silverlight中包含的用戶界面控件的種類繁多,且有不斷增長的第三方控件市場,使我們能夠迅速設計多樣,服務我們的業務的應用程序的用戶界面。如果你要創建Silverlight應用程序的Windows Phone 7.5,下載“Windows Phone的Silverlight工具包” http://silverlight.codeplex.com/。

 在這裏我不得不感謝一直支持我的滷麪網版主,是他讓我提起興趣寫了這麼一篇文章,再次感謝滷麪網,一個非常不錯的wp7開發論壇,後面我也將再次向大家發佈幾篇高質量文章,請大家到滷麪上找我吧,呵呵

進入正題:

XNA呢,它使我們能夠使用DirectX 9加速圖形輸出。如視頻播放,將圖形渲染任務從CPU移動到GPU,釋放CPU資源來處理其他的事情。

當我們使用最初發布的Windows Phone的開發,我們不得從Silverlight和XNA中進行選擇。而在Windows Phone 7.5中,Silverlight應用程序可以嵌入XNA模型 而且XNA的應用程序也可以嵌入Silverlight的用戶界面元素 - 一個巨大的進步。

分析遊戲

當我們在Windows Phone使用XNA,我們必須牢牢學習基礎,這是非常重要的。

XNA Game Studio 4.0添加了很多模板到Visual Studio項目,我們要使用一個稱爲XNA Game Studio 4.0(4.0)的模板,它位於“ C# - >XNA Game Studio 4.0(4.0)。我命名項目“ AnatomyOfAGame “,並把生成的” Game1 “類更名爲” GameSkeleton “。

我們真的需要了解生成的代碼,並且希望知道框架是如何爲我們工作的

public class GameSkeleton : Microsoft.Xna.Framework.Game
{

  XNA Framework的“Game“類實現遊戲循環,它提供了窗口,這個窗口顯示我們的遊戲,並且還包含一個虛擬的方法,使我們的遊戲能和XNA框架之間進行溝通。

GraphicsDeviceManager graphics;

  “ GraphicsDeviceManager “提供的功能,使我們能夠管理圖形設備的配置。

SpriteBatch spriteBatch;

  

“ SpriteBatch “讓我們繪製的紋理形式的精靈。精靈能通過pipeline 的轉換,照明或效果直接繪製到渲染目標,。它使得我們能單獨使用精靈創造一些相當不錯的遊戲,。

所生成的代碼構造是相當簡單:

public GameSkeleton()
{
graphics = new GraphicsDeviceManager(this);


  第一步是創建“ GraphicsDeviceManager “,接着我們需要告訴” ContentManager “應該去哪兒尋找內容。

Content.RootDirectory = "Content";

  

“ 內容 “屬性允許你訪問” ContentManager “,這是負責裝載位於”管理對象AnatomyOfAGameContent “的內容項目的二進制文件。

“content”是指在設計時產生的內容,他通常是指除去代碼的部分如位圖,模型和聲音等內容。內容是通過Content Pipeline添加到項目,它被稱爲“Content Pipeline“,是因爲它會在遊戲build時就被應用到遊戲資源中,RootDirectory “告訴” ContentManager“它應該去哪兒尋找那些資源。

// 默認情況下幀速率爲30 fps的Windowsphone。
TargetElapsedTime = TimeSpan.FromTicks(333333);

  TargetElapsedTime 指的是一個固定的遊戲循環的時間。在固定步長的遊戲,“ update “,被稱爲定期執行,每次執行的時間間隔是TargetElapsedTime,在調用draw函數前,遊戲會檢查是否是時間調用update,當draw完成時,遊戲會一直是idle狀態,直到下一次update需要被調用。

InactiveSleepTime = TimeSpan.FromSeconds(1);
}

  

protected override void Initialize()
{
base.Initialize();
}


   初始化時,我們都應該思考我們所要的任何服務,並加載非圖形資源。這一點很重要,我們調用基類的Initialize,因爲這保證Initialize能將所有遊戲組件被添加到Components集合。Initialize會在遊戲進入 update/draw循環前被調用

protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
}


  

“ LoadContent方法 在初始化時被調用, 當DeviceReset 事件發生時,遊戲內容也必須被重新加載,這時這個函數也會被調用

protected override void UnloadContent()
{
}

  UnloadContent 在圖形資源需要被卸載時會被調用,也就是在這裏我們應該卸載任何特定遊戲的圖形資源。

protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
{
this.Exit();
}
base.Update(gameTime);
}


  

update就是所有最感興趣的事情處理的地方了,移動物體,檢查碰撞,讓手機顫抖..總之:所有我們處理遊戲邏輯的地方

參數“ gameTime “提供了我們通過三個計時信息的屬性:

public TimeSpan ElapsedGameTime { get; }

  自上次更新過的遊戲時間。

public bool IsRunningSlowly { get; }

  IsRunningSlowly表示遊戲循環是否正以比TargetElapsedTime更長的時間運行。在這種情況下,我們的遊戲要處理相關延誤,因爲這可以給用戶更流暢的遊戲體驗。

public TimeSpan TotalGameTime { get; }

  TotalGameTime指定遊戲開始以來的遊戲時間。

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.DarkKhaki);
// TODO: Add your drawing code here
base.Draw(gameTime);
}
}


  當框架要繪製一幀時,draw將會被XNA框架調用,我們通過調用基類的draw方法,確保遊戲組件的繪製了


現在,我們還沒創造什麼東西,但至少我們現在瞭解了框架是如何工作的。

XNA WP7 Farseer 引擎

在繼續之前,我想向大家介紹Farseer物理引擎,您可以從http://farseerphysics.codeplex.com/下載。Farseer物理引擎是一個開放源碼的可用於商業項目的NET 2D物理引擎。這是相當爽的。

本文的解決方案,包括原始的,幾乎未修改,Windows Phone Farseer物理引擎3.3.1 。我做了唯一的變化是更新了Windows Phone軟件開發工具包(SDK)7.1。要做到這一點,只需點擊項目菜單上的“升級的Windows Phone項目”菜單。

現在,我們有一個物理引擎,它使我們更容易做出有趣的遊戲。

XNAImage - XNA框架圖像處理模塊

當你開始玩XNA框架和Farseer物理,它在運行時創建的精靈會明顯比較快。HarlinnXNA項目包括一個名爲“XNAImage “類,這將有助於我們創造運行效率比較高的遊戲。

這個類允許我們畫線,圓,樣條,Bezier曲線,和還有渲染許多我們的遊戲需要呈現的形狀

XNAImageIntro項目演示XNAImage如何繪製可用於在運行時呈現的圖像。XNAImage是基於WriteableBitmapEx項目,並支持所有的WriteableBitmapEx圖像處理功能。這意味着,我們可以使用該庫在運行時創建的紋理,然後將生成的圖像用於紋理。

 
texture = new Texture2D(GraphicsDevice,
rect.Width, rect.Height, false, SurfaceFormat.Color);
textureImage = new XNAImage(rect.Width, rect.Height, Color.CornflowerBlue);


  

當我們創建Texture2D對象,我們要使用XNAImage 。-我們必須指定SurfaceFormat.Color的格式,使紋理的像素格式和XNAImage像素格式相匹配。

現在,我們已經創建了我們的XNAImage對象,我們可以開始直接繪製圖像:

 
Color color = Color.Green;
textureImage.FillEllipseCentered(480/3, 275, 75, 75, color);
color = Color.Blue;
textureImage.FillEllipseCentered(480*2/3, 275, 75, 75, color);


  我們可以創建另一個圖像,並填充Perlin噪點:

XNAImage noisyImage = new XNAImage(200, 200);
noisyImage.PerlinNoise(1.2, 0.025, 0.9, 3, 5);


  當我們要在我們的遊戲中創造各種效果,如火焰,煙霧和雲層時,Perlin噪點是非常有用的。,然這些圖像可以快速Blit到這樣的目標圖像:

Collapse | Copy Code
textureImage.Blit(new Rectangle(140, 400, 200, 100),
noisyImage, new Rectangle(0, 0, 200, 100),BlendMode.Subtractive);
textureImage.Blit(new Rectangle(140, 500, 200, 100),
noisyImage, new Rectangle(0, 100, 200, 100));


  第一句blit操作,將融合的源圖像和目標圖像使用減色混合,而第二句只是覆蓋到目標矩形上。一旦我們完成了我們的image,我們爲它分配給Texture2D對象:

texture.Assign(textureImage);

  

XNAImage是還在開發中,但它已經提供了功能非常多的非常有用的遊戲UI API:


Blit
FillRectangle
FillEllipse
FillEllipseCentered
FillPolygon
FillQuad
FillTriangle
FillBeziers
FillCurve
FillCurveClosed
Convolute - apply image filters
PerlinNoise
DrawLineBresenham
DrawLineDDA
DrawLine
DrawLineAa
DrawPolyline
DrawTriangle
DrawQuad
DrawRectangle
DrawEllipse
DrawEllipseCentered
DrawBezier
DrawBeziers
DrawCurveSegment
DrawCurve
DrawCurveClosed
Crop
Resize
Rotate
RotateFree
Flip


我希望你喜歡!如果你有話要說,請到滷麪網 wp7開發論壇(codewp7.com)問答區聯繫我,我會很高興知道你在想什麼。同時wp7交流QQ羣172765887中,也能找到我的身影,感謝大家

全部源碼下載請猛擊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章