XNA 實作碰撞圖層與多關卡設計

  • 3573
  • 0

延續人物跳躍這個範例再加上地圖編輯,這次我們要讓人物能跳上磚塊,並且示範如何實作多關卡設計。

延續人物跳躍這個範例再加上地圖編輯,這次我們要讓人物能跳上磚塊,並且示範如何實作多關卡設計,因為整個專案牽扯範圍過大,所以這次我只會說明重要的地方,大家可以下載完整程式碼回去參考,或是有問題也可以留言給我。(範例下載)

 

 

我們先看看完成後的樣子,人物可以跳上磚塊,進入樓梯後可以到下一關。

 

 
在這裡輸入影片標題

首先,我們先看看專案裡的東西,下面這些都是在地圖編輯器章節提到的,主要是把文字檔轉成地圖。

image_thumb[1]

 

Tile.vb用來儲存磚塊訊息做碰撞偵測用的,VirtualDpad.vb是虛擬按鍵。

image_thumb[5]

 

level1.txt、level2.txt就是兩個關卡

image_thumb[8]

 

變數主要分人物背景、動畫處理相關、跳躍掉落運動相關、文字檔轉地圖相關

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,只受重力加速度影響,掉落時有可能掉到磚塊或地板上。

image_thumb[11]

 

跳躍的時候,當要掉落的時候要開始偵測是否與磚塊碰撞,碰撞偵測寫在Map.collision()傳入人物腳底中心點

image_thumb[15]

 

如果碰撞的Tile是樓梯,則轉換關卡。

image_thumb[19]

 

在Map類別,我們宣告一個List存放磚塊

image_thumb[22]

 

碰撞偵測只要對List裡的磚塊跟人物腳底中心點做偵測及可,Tile.Id可以知道碰撞的是哪一種磚塊。

image_thumb[24]

 

這邊提供我的想法給大家參考,如果哪裡有誤或需要改進的也請給我批評指教,謝謝大家。