程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十二)(3)

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十二)(3)

編輯:關於C語言

上面代碼已經進行了很詳細的描述:首先我在鼠標左鍵事件中判斷點擊的地方是否是障礙物(點擊的點在副本地圖中是否是黑色的),是的話主角就不移動,否則就啟動簡單的直線移動。接下來我們需要設置幾個變量它們分別存儲副本地圖的圖片源、主角的X,Y精確坐標以及主角最終移動目的點。設置好後最後就是在界面線程中時時獲取主角的X,Y坐標,並且判斷主角當前位置是否是障礙物了。如果是則將當前的移動由普通直線移動轉換成A*尋路移動;同時我們還可以判斷如果是黃色的話則傳送到點(200,20),當然大家還可以設置其他很多顏色來啟動相應的事件,是不是很神奇?嘿嘿。

下面兩圖分別是采用A*尋路的主角移動和改進型的A*尋路(直線移動+A*尋路)的主角移動:

從上圖可以明顯看到,單純的使用A*進行主角移動及饒過障礙物是不自然的,路線很機械且並不真實。而通過直線移動+副本地圖+A*實現的改進型A*尋路所實現的主角移動則可謂幾乎接近完美,與現實吻合。

這裡要順帶提一下的是:本節只為演示需要所以我使用的副本地圖只有一窗口大小,因此當主角移動到窗口外時pickColor()方法的參數X,Y超出了副本地圖的大小導致拋出異常並使程序關閉這是肯定的而並非BUG,這樣也同樣證明了pickColor()方法的正確性。

小結:關於如何對A*進行改進其實也並非一定需要配合該副本地圖,我們同樣的可以通過時時比較主角的(SpiritWindowX,SpiritWindowY)坐標對應的障礙物Matrix[SpiritWindowX, SpiritWindowY]是否==1來判斷是否啟動尋路。但是本節的目的是要告訴大家副本地圖的萬用功能,別的方法能做的,它同樣能做,而且它擴展性更強,描述對象更簡單且直觀,這才叫解放思想、面向對象!其實類似此副本地圖的使用在魔獸世界等著名的游戲中都有用到,只是我這個算是簡單版的。雖然它構造簡單但是在輔助地圖引擎方面卻顯示出強大的威力。目前我感到唯一的缺憾就是還沒有研究出如何使用它單獨的進行有效精確的尋徑(即完全拋棄復雜的A*尋徑算法),曾想過在副本地圖中畫些尋路點(即障礙物旁邊可以起到誘導饒過障礙物的點),當主角碰到障礙物時,尋找副本地圖中離自己最近的尋路點作為臨時目標進行移動,到了此臨時目標後再向最終目標移動,這樣就可以巧妙饒過障礙物了。當然這在不太復雜的地圖中是完全可行的,而且仿佛比A*更強悍且簡單,但是一旦遇到復雜的地圖了呢?我們該如何優化它?還需要對此感興趣的朋友們開動一下腦筋,或許真能想出完美的解決方案呢。

不管怎樣,些許的缺陷是永遠無法掩埋它的偉大的。連美工都可以輕松的參與到游戲地圖引擎的主要設計中,難道不是游戲設計界中神聖的革新嗎?快速開發是我們的理想與追求,只需要一張副本圖片就可以較好的替代以往制作一個游戲地圖引擎必須的四大步驟:切割、拼圖、編輯、轉換。是不是很邪惡?簡化了過程卻實現同樣的效果,讓人覺得措手不及!這就是21世紀!YEAR一個。

下一節我將就主角與地圖及其他對象進行相對移動進行詳細講解,敬請關注。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved