《超級瑪麗》3

2021-09-07 13:07:23 字數 1822 閱讀 6701



第三階段:

目標:實現水平方向和豎直方向上的碰撞,更具有真實感。

1:要想解決水平方向的碰撞,就要先明白乙個問題,地圖上的哪些東西是不能夠穿過的,也就是說要先定義好地圖上的某些可供碰撞檢測的物體磚塊型別。如圖:

水平檢測函式的開頭準備工作:

為了簡化水平方向的檢測,因為馬里奧的錨點是中心位置,所以左右兩邊的檢測都是採用左邊和右邊的中點位置來取代的。在圖中的兩個條件推斷是為了檢測馬里奧是否遲到了變大蘑菇和獎人蘑菇。

上圖中的倒數第三句是做

gl座標和磚塊座標的轉換,這個非常重要。由於遊戲採用的是

gl座標系,但

tmx地圖中採用的是磚塊座標,要將馬里奧在遊戲中的座標轉換成磚塊座標。然後再通過上圖中的最後一句求出當前磚塊座標下的磚塊型別,並做開關語句的推斷:

在上圖中能夠看到哪些磚塊是接受水平方向碰撞檢測的。哪些是不用的。當遇到障礙物時,儘管馬里奧有行走動畫,可是位置不能移動,一直停留在障礙物的前面。

以上展示的所有是馬里奧右側的檢測過程,左側和右側同理。

2:豎直方向上的碰撞檢測實現,以及站在地圖梯子上的左右平移和跳躍不尾隨實現:

豎直方向上的檢測函式的開頭:

第乙個條件句馬里奧掉入了陷阱裡,就死亡,不必進行以下的檢測。第二個條件句是控制馬里奧的頭頂不出地圖區域。

遊戲中馬里奧在豎直方向上要可以踩磚塊的邊緣,如圖:

這樣的效果就不能一股腦的用馬里奧的腳下中點作為檢測點了。應該把檢測的**放到乙個迴圈裡,從馬里奧的左下角到右下角,假設發現能夠站立,那麼就能夠站立。退出迴圈。其餘的部分和水平方向上的是一直的。

豎直方向上的檢測有馬里奧落地檢測和向上跳躍時頭頂到磚塊落下的檢測之分,上圖中的是後者情況差別是當前的

jumpofffset

正負號。當

jumpoffset

為正。說明馬里奧在起跳階段。反之就在下落階段。

馬里奧的下落檢測和上面的沒什麼差別。

最後是馬里奧站在梯子上的檢測以及尾隨梯子移動。由於梯子是通過地圖擺放物件的方式實現的。在

ccgamelayer

中有乙個梯子的陣列,裡面儲存了全部的梯子,梯子有上下移動或是左右移動的移動分量數值,還有梯子的長度數值,由於梯子都是安放在騰空的地方。所以馬里奧不可能頭頂到梯子,所以梯子的檢測僅僅有馬里奧下落的情況。

在update

函式裡的關於檢測梯子的**片段:

C語言 超級瑪麗

演算法提高 超級瑪麗 時間限制 1.0s 記憶體限制 256.0mb 問題描述 大家都知道 超級瑪麗 是乙個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數字置,分別是a1,a2,am,陷入其中則必死無疑...

演算法提高 超級瑪麗

演算法提高 超級瑪麗 時間限制 1.0s 記憶體限制 256.0mb 問題描述 大家都知道 超級瑪麗 是乙個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數字置,分別是a 1,a2,a m,陷入其中則必死...

演算法提高 超級瑪麗

演算法提高 超級瑪麗 問題描述 大家都知道 超級瑪麗 是乙個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數字置,分別是a1,a2,am,陷入其中則必死無疑。顯然,如果有兩個挨著的陷阱,則瑪麗是無論如何也...