《超級瑪麗》2

來源:互聯網
上載者:User

標籤:cocos2dx



第二階段:

目標:讓馬里奧接受左右移動控制和跳躍控制,以及在這個過程中執行左右行走動畫和維持騰空狀態,還有馬里奧狀態機器的設計。這個過程中也沒有碰撞檢測。

1:這是一個橫版捲軸控制動作類遊戲,雖說用滑鼠點擊類比的行動裝置上的觸摸機制,但還是不方便測試,比如同步選取兩個按鍵時,單用滑鼠觸摸就做不到了。所以為了實現開發初期的測試便利,需要把引擎稍加改造一下,讓遊戲接受來自鍵盤的訊息並響應。這一點並不難做,這裡的連結說的很清楚,照著做就OK了。【http://blog.csdn.net/a7833756/article/details/7772115】

CCGameLayer::voidprocessWin32KeyPress(UINTmessage, WPARAM wParam, LPARAM lParam);這個方法可以撲捉到來自鍵盤的訊息並且在函數內可以對不同的按鍵做處理,這一點和win32編程一致。

2:遊戲中沒有使用模擬實體環境,裡面的左右移動和跳躍是通過參數值的改變實現的。CCGameLayer類裡面關於左右移動的變數有2個,floatccMoveOffset;是在建構函式裡初始化好的固定值,floatmoveOffset;是對方便統一對外更新,在遊戲過程中如果按下了左鍵那麼moveOffset就會被附上–ccMoveOffset,如果按下來右鍵那moveOffset就會被附上ccMoveOffset。

這樣也是為了後面的修改方便,假如到處寫的都是數字,修改起來也麻煩,這樣子如果要修改的話只需要修改ccMoveOffset的值就可以了。

3:下面介紹一下遊戲中馬里奧左右行走和跳躍的核心思路。在CCGameLayer類的update(floatdt);,這是一個控制馬里奧更新的函數,這個函數的核心代碼:

這個函數每一幀都會執行一次,CCGameLayer類裡還維護了兩個bool值,標誌著是否按下了左或是右。

這四個按鍵是通過UI移駐夾上的四個按鈕控制的,當左鍵被按下時,isLeftKeyDown為真,將moveOffset設定為-ccMoveOffset。當右鍵被按下時,同理。

4:讓馬里奧在左右移動的過程中執行行走的動畫。這一點需要談到cocos2dx關於動畫的部分,這裡用到的是幀動畫,意思就是一張一張的大小一致的圖片,製作成一個動畫,並儲存到引擎內建的動畫緩衝裡。這裡面關於動畫的製作,儲存以及調用都是在AnimationManager類裡面:

這是一個單例,單例是常見的一種設計模式,原則上遊戲運行起來,只需要一個對象的類都可以設計成單例。引擎中也有很多的類設計成了單例,比如導演類CCDirector,還有各種緩衝類CCTextureCache,CCAnimationCache等等。在馬里奧類中是通過枚舉來調用動畫的。在GameEnum.h檔案中:

這個檔案裡包含了遊戲中要用到的所有枚舉,比如遊戲中的動畫,怪物的種類,地圖上的各種碰撞檢測元素等等。在上一段的基礎上,當按下左鍵時,同時馬里奧播放向左行走的動畫,最後把動畫的播放間隔和移動的速度進行調整,看起來更自然,這裡面涉及的數值並沒有直接寫在代碼裡,而是通過參數的形式,便於調試和修改。

5:跳躍的實現。這一點和前面的左右行走是一個概念,不同的是,跳躍不需要維護一個bool值,當跳躍按鍵被按下時,騰空的姿態,並且馬里奧的紋理也換成騰空圖片。這裡面涉及到一個馬里奧是否在空中的bool標識,因為當馬里奧騰空後跳躍按鍵就不能無效了,只有當馬里奧在地面上或是在地圖的磚塊物上時,才可以響應跳躍按鍵。當馬里奧落到地面上後,馬里奧的紋理根據當前馬里奧的朝向來選擇,因為馬里奧在空中是接受左右按鍵響應的,所以當馬里奧向右跳躍後,突然按下左鍵,馬里奧的轉向會改變。在這裡怎麼確定馬里奧的是否騰空狀態,就涉及到豎直方向上的碰撞檢測了,就是和地面和地圖上的某些可站立磚塊做碰撞檢測。下面是跳躍按鍵被按下後的邏輯

在CCGameLayer::collistionV()函數中的最後一行:

這樣就能夠達到一個馬里奧向上跳躍過程中的逐漸減速效果,直到jumpOffset減到0,這時馬里奧也到達了跳躍的最高,持續執行上面的減法,馬里奧又會落到地面上,執行的邏輯如下:

6:馬里奧狀態機器的維護。整個馬里奧在遊戲中的表現就是一部狀態機器在任意的切換。怎麼細化馬里奧在遊戲中的狀態呢?一個方面是從馬里奧的體型,這個體型指的是吃蘑菇前的和吃蘑菇後的,以及吃到子彈的;一個方面是從馬里奧的運動狀態,比如站立的左和右,行走的左和右,以及騰空的左和右。在馬里奧的狀態機器裡面所有的邏輯就是這麼處理的,組後要提到的一點是,馬里奧的狀態也是每一幀都要設定的,這樣子就會帶來一個問題,如果當前和上一幀的狀態是一樣的就沒必要更新馬里奧的狀態,這時候就引入了一個目前狀態和前一個狀態,狀態機器函數最開始有一個判斷:

如果目前狀態和參數傳進來的狀態是一致的,就直接返回,如果不一致,說明馬里奧狀態有改變了,然後停止馬里奧所有的動作,根據新狀態進行匹配和更新。

7:移駐夾的實現,這個沒什麼技術難度,也不難理解。就是響應win32的鍵盤訊息,根據訊息設定馬里奧的控制變數。

8:地圖的跟隨實現以及馬里奧不能往回走的實現。這個可能是一個難以理解的地方,網路上也有很多在問這個問題,在解決這個問題之前首先要深刻理解錨點概念,以及局部座標系之間的關係,這兩個不理解那本需求就很難實現。

總結:這一階段的成果:馬里奧能接受來自鍵盤的訊息並做出處理,馬里奧在地圖上行走自如,並且有真是的行走動畫,可以跳躍,可以落地,可以跳到地圖上的某些磚塊上,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.