平衡球遊戲開發教程(四)--深入瞭解WP7遊戲底層原理

前面我們都只是集中在物理引擎上,但是對於一個遊戲來說,他包含的不只是物理引擎,他還要有遊戲面板(普通的,可以滾動的),按鈕,標籤,圖片,背景(層次背景),邊界控制,輸入處理,字體和紋理管理,幀率測速器,我們可以儘可能的使用最少的代碼來輕易創建新的遊戲畫面。好了,現在我們一個個的來,首先我們將創建一個FameRate計數器。(請注意,我採用不同的方式創建和使用這些可複用的組件,這些只是爲了向你顯示有這麼些方法)
對於這一節,我們將引用FarseerXNABase項目。

  

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

進入正題:

  屏幕系統
  可能你心中會有一個疑問,什麼是屏系統,我們有一堆類來處理繪製或者相關的工作,如果我們有屏系統的話,我們能更方便的控制各種組件的繪製,所以我們現在得有一個屏幕類去增加,刪除屏幕中的組件。

  

  遊戲面板
一個面板只是一個單層,他有些獨立的更新和繪製邏輯,並可以與其它層相結合,建立一個複雜的菜單系統。
對於主菜單,選項菜單,“你確定要退出”消息框,遊戲本身,這些都是面板。在FarseerXNABase/Components/ScreenSystem 目錄中,我們有一個叫遊戲面板(gameScreen)的基類。他就是所有面板類的虛基類,讓我們探討它的屬性和方法。

  

ControllingPlayer:獲取控制當前屏幕的玩家的id,如果爲空,則表明它接受所有玩家的輸入。它用於用戶鎖定遊戲到一個帳戶上。在主遊戲菜單中,遊戲響應任意輸入端,當選定某一個帳戶時,遊戲只響應這個帳戶的輸入,直到返回主菜單。
EnabledGestures:獲取面板感興趣的的手勢.面板應該使用儘可能具體的手勢來增加的手勢引擎的準確性。例如,大多數菜單需要輕觸或上下拖動操作。這些手勢都是由面板管理器管理,當面板上有手勢變化時,狀態參數InputState將傳遞給HandleInput方法

  

IsActive:此屬性顯示當前面板是否是在所有面板最頂端。如果它在所有面板最頂端,那麼它的值是true,所有的輸入都由些面板處理。

IsExiting:它用於表明當前面板是否退出。面板關閉有兩個可能的情況。1.暫時跳到其它面板,2.直接跳出當前面板:此屬性表示屏幕是否是真正的退出:如果設置爲true,當跳轉完成時面板會自動刪除本身。

IsPopup:這個屬性指出當前面板是否是一個彈出面板

ScreenManager: 它將返回當前面板attach的ScreenManager。

ScreenState:面板可以有幾下4種狀態,TransitionOn,Active,TransitionOff,Hidden。此屬性返回這個狀態值

TransitionAlpha:存儲面板的透明度值。範圍從0到1

TransitionOffTime:需要完全關閉(漸變變換)當前面板所需時長

TransitionOnTime:當前面板完全變換顯示所需要的時間

TransitionPosition:表明當前面板的位置,範圍從0(完全打開,不變換換)到1(完全關閉)。
draw:當屏幕需要自繪時調用這個函數

ExitScreen:使屏幕退出並開始過渡。這不會立即刪除面板,而是將等待關閉變換完成後再刪除。
Update:狀態變換的邏輯處理,比如更新過渡的位置。 不論面板是active,或隱藏狀態或正在過渡,這個方法都可被調用。
HandleGamePadInput,HandleInput和HandleKeyboardInput:允許處理用戶輸入。與更新,這種方法只被active狀態的面板調用,而其它失去焦點的面板將不被調用。
LoadContent方法,UnloadContent:加載和卸載屏幕的圖形等資源內容。
UpdateTransition:它是一種用來更新屏幕過渡位置的輔助方法。

ScreenManager(面板管理器)

這個類添加,刪除和管理所有面板相關的處理,如渲染面板,更新面板,總之,它管理一個或多個遊戲面板的實例,在特定的時間調用update,draw方法,處理最上面的面板的輸入,讓我們看看其屬性和方法。

  

SpriteBatch:所有面板共享的默認spritebatch。
AddScreen:增加新面板到ScreenManager實例。
draw:讓每個面板繪製自己。
update:更新每個屏幕的運行邏輯。
FadeBackBufferToBlack:幫助繪製一個半透明的黑色全屏精靈,用於漸隱屏幕,彈窗出現後,彈窗後面的背景變黑。
GetScreens:暴露所有屏幕的數組。我們得到返回的引用;
LoadContent,UnloadContent:加載和卸載圖形內容
RemoveScree:從面板管理器刪除面板。你應該直接調用GameScreen.ExitScreen,還不是使用這個方法。這樣面板可以過渡漸隱,而不是隻是被立即刪除。
TranceScreen:用於調試過程中,所有面板打印相關詳情。

Camera2D

我們已經在前面的章節討論過Camera2D類的用法。現在讓我們詳細探討其屬性和方法。

我們已經在前面的章節討論過Camera2D類的用法。現在讓我們詳細探討其屬性和方法。

CurrentSize:表示目前的camera視圖大小。表示爲size*(1 /Zoom)。
MaxPosition MinPosition:相機最左和最右邊的位置。如果這兩個值是相同的,那麼將不會有任何顯示,除非,你重寫該方法。
MaxRotation和MinRotation:它代表一個camera最大最小可以旋轉的角度。
MaxZoom和MinZoom:表示camera的變焦的範圍。
MoveRate: camera移動速度
Position:當前camera的位置
Rotation:當前camera的旋轉角度
RotationRate:表示camera在一次update過程中能旋轉的角度
ScreenCenter:表示面板的中心
ScreenHeight和ScreenWidth:表示當前面板的高度和寬度。
TargetPosition,TargetRotation和TargetZoom:camera要達到的目標值。檢查這些值對當前值,如果需要則進行必要的更新。
TrackingBody:表示需要跟蹤的FarseerPhysics body。該body一般是在屏幕的中間。
Zoom 和ZoomRate:Zoom 代表了當前的縮放級別和ZoomRate表示Zoom的速率。
ConvertScreenToWorld:屏幕上的位置,它將轉換到相機(世界)的的位置
ConvertWorldToScreen:將世界上的位置轉換到屏幕上的位置。
CreateProjection:這將創建相機的投影矩陣,當每次屏幕分辨率或寬高比變化時,我們需要調用此方法。
MoveCamera:以一個指定值移動camera
ResetCamera:重置camera到它的默認值。
Resize:應用旋轉,位置和縮放值到camera。
SmoothResetCamera:重置默認值,camera位置從當前位置逐漸漸變到默認值。
ZoomIn和ZoomOut的:分別讓相機zoomin 或zoomout。

請大家關注下一節:

深入瞭解windowsphone7 遊戲底層原理(續1)

我將在最後一節中放出所有源碼與實例,毫無保留。

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

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