延續人物跳躍這個範例再加上地圖編輯,這次我們要讓人物能跳上磚塊,並且示範如何實作多關卡設計。
延續人物跳躍這個範例再加上地圖編輯,這次我們要讓人物能跳上磚塊,並且示範如何實作多關卡設計,因為整個專案牽扯範圍過大,所以這次我只會說明重要的地方,大家可以下載完整程式碼回去參考,或是有問題也可以留言給我。(範例下載)
我們先看看完成後的樣子,人物可以跳上磚塊,進入樓梯後可以到下一關。
在這裡輸入影片標題
首先,我們先看看專案裡的東西,下面這些都是在地圖編輯器章節提到的,主要是把文字檔轉成地圖。
Tile.vb用來儲存磚塊訊息做碰撞偵測用的,VirtualDpad.vb是虛擬按鍵。
level1.txt、level2.txt就是兩個關卡
變數主要分人物背景、動畫處理相關、跳躍掉落運動相關、文字檔轉地圖相關
Public Class Game1
Inherits Microsoft.Xna.Framework.Game
Private WithEvents graphics As GraphicsDeviceManager
Private WithEvents spriteBatch As SpriteBatch
'**************************************************************************************
Dim background As Texture2D '背景圖
Dim player As Texture2D '人物動畫分割圖
Dim position As Vector2 = New Vector2(57, 337) '人物位置
'**************************************************************************************
Dim frameSheet As Point = New Point(8, 2) '人物動畫圖片個數 (欄x列) 陣列從0開始
Dim frameSize As Point = New Point(40, 48) '每張動畫小圖的大小 (寬x高)
Dim currentFrame As Point = New Point(0, 0) '當前小圖片位置 (i,j)
Dim animSpeed As Integer = 50 '調整動畫速度:每隔50毫秒換下一張動畫圖片
Dim animCount As Integer = 0 '調整動畫速度:累積時間用
'**************************************************************************************
Dim isJumping As Boolean = False '人物跳躍狀態旗標
Dim isFalling As Boolean = False '人物從磚塊掉落狀態旗標
Dim V As Vector2 = New Vector2(0, -300) '跳躍時 Y方向的速度
Dim V2 As Vector2 = New Vector2(0, 0) '掉落時Y方向的速度
Dim a As Integer = 500 '重力加度 500 pixel/秒平方
'**************************************************************************************
Dim Map As Map '可以用TileSheet跟地圖文字檔組出地圖
Dim MapData As New tileLib.MapData '文字檔內容會存放在MyData.text
Dim tileSheet As Texture2D '地圖的來源分割小圖
'**************************************************************************************
Dim level As Integer = 1 '關卡
End Class
在Update()裡:
從磚塊掉落的時候Y方向的速度為0,只受重力加速度影響,掉落時有可能掉到磚塊或地板上。
跳躍的時候,當要掉落的時候要開始偵測是否與磚塊碰撞,碰撞偵測寫在Map.collision()傳入人物腳底中心點。
如果碰撞的Tile是樓梯,則轉換關卡。
在Map類別,我們宣告一個List存放磚塊
碰撞偵測只要對List裡的磚塊跟人物腳底中心點做偵測及可,Tile.Id可以知道碰撞的是哪一種磚塊。
這邊提供我的想法給大家參考,如果哪裡有誤或需要改進的也請給我批評指教,謝謝大家。