1. 程式人生 > >C#基礎視頻教程7.3 如何編寫簡單遊戲

C#基礎視頻教程7.3 如何編寫簡單遊戲

繪圖 初始 span sca csr 防止 傳遞 不同的 區域

前面我們大致實現了鳥的一圈軌跡(其實如果你不做這個,就用兩個矩形塊的碰撞檢測代替也可以),跟所有前面的教程一樣,草稿打完了就要設計封裝成一個類。至少到目前為止我們已經知道了鳥的屬性和方法,先不要管方法具體如何實現,也不管方法輸入輸出,我們先要設計大概有幾個方法。

鳥的初始化方法-根據前面一節導入導出一些多邊形點(這裏初始化只需要導入一堆點就行了)

鳥的銷毀方法-比如鳥撞到管子上或者地底下,整個遊戲重新開始,那麽鳥肯定也要重新開始

運行方法-比如你可以定義鳥的運行是受重力影響往下掉,也可以定義是不動,或者往前勻速運行

飛行方法-不同於前面的運行方法,飛行方法是玩家控制的,你按一下按鈕他飛一下(有時間間隔,不會一直被觸發)

你還可以定義很多額外的方法(大部分酷跑遊戲對控制人物會有發射子彈,變大變小,無敵,暴走等等,其實都可以定義在這個類裏面)

技術分享

?

想一下初始化方法如何實現

傳入的類型需要是什麽:我把整個Form傳遞過去,至少可以得到整個Form的寬度和高度,這樣如果遊戲的界面發生變化,我初始化生成鳥的位置可以始終保持在比如屏幕的中間的位置

這個方法需要做什麽:1 導入一堆軌跡點,並生成到Point數組中,讓主窗口隨時準備繪制 2 設置初始的縮放和平移位置

這個方法還需要做什麽:不管如何控制鳥的運動(Transform_X和Transform_Y),要刷新真正的軌跡點位置(一起跟著變)

技術分享

?

尤其要註意導入的點都是固定的死點,隨著鳥的運動,這些點都應該隨之改變。所以不管是Fly方法還是RUN方法,或者為了測試方便的手動修改位置MoveX和MoveY方法,都應該刷新PolygonListAfterMoving這個Point數組。為了驗證每次刷新的點確實是我們需要的,最好在主程序中把這個軌跡用不同的顏色描繪出來(這也是編程提高效率的一個重要方法,想一些方法把你要驗證的東西可視化)

技術分享

?

因為FlapperBird的遊戲跟酷跑很像,比較科學的方法是場景不斷的產生管子(寬度和高度都隨機),並且管子不斷的從屏幕一端跑到另一端,鳥看起來一直在往前飛,其實鳥是前後不動的。如果不控制鳥,則鳥會一直往下掉,如果讓鳥飛一下,則可以往上走一點。那麽這個往下掉的方法就很簡單可以實現了,註意我們是單獨放在一個線程裏執行,每次給他的TransForm_Y累加一定距離(前面用try catch是一個比較偷懶的方法,第一次運行,則線程還沒有實例化無法終止,如果已經在運行了則線程可以終止,不管是不是初次運行,直接終止掉重來最為簡單暴力)

技術分享

?

飛行方法就稍微復雜一點了,要分幾個小塊去分析。

首先要想清楚如何防止重復觸發飛行方法,我們定義一個變量IfFlying,只要正在執行飛行則這個變量為TRUE,執行完成設置為FALSE,如果多次觸發,則先看是不是TRUE,是TRUE就不往下執行了。當然在飛行的過程中也要判斷是否遊戲結束,如果遊戲結束也不能再飛了(比如撞到東西了,如何定義遊戲結束小鳥這個類不該管,他就應該是標準的方法,只需要通過幾個變量告訴他該做什麽,小鳥不是裁判,不負責具體遊戲規則)

其次要想清楚如何飛行,假定每次飛行給1秒或者2秒,這個時間段內我們每隔20ms(也可以自己設定時間)修改一下Transform_Y的數值,這就不能像前面一樣疊加一個固定值了,看起來太假,跟你跳高或者跑步一樣,總歸有一個加速-減速的過程。所以可以用一些拋物線,三角函數曲線來模擬(這些值都是測試出來了,為了遊戲的動感,讀者可以自行搜索非常逼真的函數來讓鳥飛的更像真的)

技術分享

?

鳥分析完了之後,再來看怎麽做管子(我們已經暫時不考慮把管子做成多邊形軌跡點了,只需要生成一個Rectangle),相比於鳥來說,這個矩形的類屬性和方法有所不同,可以復制了之後照著改(我們重新定義了矩形的寬度,高度,X和Y的最大值最小值,是為了做碰撞檢測使用,因為如果判斷一個點是否在矩形內,只需要判斷X坐標和Y坐標是否分別在XMin-XMax/YMin-YMax之間)

技術分享

?

初始化管子的時候,寬度和高度都是隨機值,但是一定是在屏幕的一側開始生成的(為了測試先做幾個按鈕不斷重復生成,看效果是否滿意,然後調整隨機值的參數)

技術分享

?

其他方法是雷同的,矩形每次運行的時候都要刷新自己的邊界點(跟多邊形刷新所有Point數組一樣),此外管子只有一個平移方法,沒有Fly方法,這一點比鳥要簡單

技術分享

?

有了小鳥,管子,接下來就要定義一個裁判了。我做了一個額外的類叫做GameSense,他其實還幹了畫圖的事情(應該額外做一個類來專門畫圖的),裁判最重要的就是判斷是否撞了。註意我這裏定義方法的輸入輸出,由於本遊戲比較簡單,碰撞之需要判斷一個多邊形實例跟一個矩形實例是否有碰撞,內部實現方法也很簡單,遍歷多邊形實例的Point數組看他是否在矩形的四個邊角點內即可。

技術分享

?

測試不管移動哪個元素,只要兩個區域有接觸,碰撞狀態確實響應了

技術分享

?

我們再來看繪圖的過程,Form1_Paint事件中,每次繪制完成一個東西都需要重置畫筆(所謂的重置畫筆是指你一旦使用了TranslateTransform,ScaleTransform,RotateTransform方法,你可以想想你本來拿著一支筆在屏幕的左上角X=0,Y=0的位置,每一次平移這個畫筆都會移動到新的位置,每一次旋轉你的畫筆也會跟著旋轉,這裏的概念我們在應用教程中OPENGL仿真中也會講到,需要一定的空間想象能力,更需要讀者自己去驗證繪圖的整個流程,比如先繪制一個圓,然後再繪制跟他相切的一個圓怎麽實現)

技術分享

?

?

更多教學視頻和資料下載,歡迎關註以下信息:

我的優酷空間:

http://i.youku.com/acetaohai123

技術分享

?

我的在線論壇:

http://csrobot.gz01.bdysite.com/

技術分享

?

問題交流:

QQ:910358960

郵箱:[email protected]

?

?

?

?

?

?

C#基礎視頻教程7.3 如何編寫簡單遊戲