flappy pig小遊戲源碼分析(4)——核心pig模組(未完待續)

來源:互聯網
上載者:User

標籤:

熱身之後,我們要動點真格的了,遊戲叫flappy pig,我們的pig終於要出場了。

老規矩,看看目錄結構,讀者對著目錄結構好好回想我們已經講解的幾個模組:

其中game.js是遊戲主程式,option.js是遊戲設定檔,util是我們的通用工具庫函數。

那麼pig是什麼呢,我們先上源碼:

var flappy = (function (self) {    ‘use strict‘;//開啟strict 模式    var option = self.option,//把前面添加好的option拿出來        $ = self.util.$;//把前面添加好的util的選取器拿出來    //豬    self.pig = {//給flappy對象添加一個pig屬性        Y: 0, //豬當前高度(底邊)        init: function (overCallback, controller) {//豬的初始方法            var t = this;//            t.s = 0, //初始化小豬的位移            t.time = 0, //初始化小豬的位移時間            t.$pig = $(‘pig‘);//擷取頁面中的小豬對象            t.$pig.style.left = option.pigLeft + ‘px‘;//設定頁面中小豬距離左邊的位置            t._controller = controller;//將控制者傳入            t._addListener(overCallback);//添加監聽函數,執行的結果等價於t._overCallback = overCallback        },        //添加監聽        _addListener: function (overCallback) {            this._overCallback = overCallback;        },        //啟動        start: function () {            var t = this,                interval = option.frequency / 1000;//用20/1000            t.s = option.v0 * t.time -t.time * t.time * option.g*2; //這裡是小豬的運動軌跡公式,讀者看不懂沒關係,稍後會詳細解釋            t.Y = option.pigY + t.s;//當前高度等於之前的高度+跳起的高度            if (t.Y >= option.floorHeight) {//判斷,如果豬的當前高度比地板的高度大                t.$pig.style.bottom = t.Y + ‘px‘;//那麼就移動豬            } else {                t._dead();//否則就摔死了            }            t.time += interval;//累加時間        },        //跳        jump: function () {//小豬的跳躍方法            var t = this;//擷取小豬對象            option.pigY = parseInt(t.$pig.style.bottom, 10);//將字串解析為一個十進位整數,並賦值給配置項中pigY            t.s = 0;//將跳躍位移設為0            t.time = 0;//將time設為0        },        //撞到地面時觸發        _dead: function () {            this._overCallback.call(this._controller);//當_dead函數觸發時,執行this._overCallback函數,並將其中的this指向this._controller        },        //撞到地面的處理        fall: function () {            var t = this;//擷取小豬對象            //摔到地上,修正高度            t.Y = option.floorHeight;//小豬對象的Y軸設定為地板高度            t.$pig.style.bottom = t.Y + ‘px‘;//設定dom位置,也就是把Y值加上‘px‘變成字串        },        //撞到柱子的處理        hit: function () {            var t = this;//擷取小豬對象            //墜落            var timer = setInterval(function () {                t.$pig.style.bottom = t.Y + ‘px‘;//更新小豬DOM的位置                if (t.Y <= option.floorHeight) {//當小豬的位置小於等於地板高度時                    clearInterval(timer);//取消定時器                }                t.Y -= 12;//小豬高度遞減12            }, option.frequency);//每20毫秒執行一次        }    };    return self;//返回添加好的flappy對象,之前是flappy = {options:{xxx},util:{xxx}},現在是flappy = {options:{xxx},util:{xxx},pig:{xxx}}})(flappy || {})

嗯相信很多同學看完上面的源碼可能會暈車,我儘力帶大家理清思緒的。

首先化零為整,這是讀源碼一項必備的技能,我們用虛擬碼理一下作者幹了些啥:

var flappy = (function(self){

擷取配置項

擷取工具庫

給flappy對象添加一個pig對象,其中pig對象的具體屬性和方法是這樣的{

  Y:代表豬距離地板的高度,

  init:初始化方法,對頁面中的小豬對象進行一些初始設定,如開始位置等

  _addListener:給pig對象添加監聽函數

  start:表示讓小豬開始移動,讓小豬按照一定運動公式開始運動,並判斷小豬是否摔死

  jump:小豬有一個跳動的方法,調用jump方法時用頁面中小豬的實際位置值重設設定檔option.js中的pigY,同時重設pig.s為0,time為0

  _dead:執行傳入的overCallback函數,這裡注意一定要是call或者apply將函數中的this指向controller,還記得主程式中怎麼傳入這兩個參數的嗎,看game.js中的這麼一句話:

其中t.fall也就是game模組的fall方法,這個方法還記得嗎,第一節中我們講過,他是這樣的:

 

另外一個參數t也就是game對象了,那麼這裡_dead方法中this._overCallback.call(this._controller)就相當於執行上面圖中的這個fall方法,其中的this指向game對象。所以一旦調用pig._dead()方法,則遊戲結束,然後調用pig.fall()方法,讓小豬躺在地板上,否則小豬會距離地板還有一小段距離。

  fall:讀者可以嘗試去掉game.fall()中的pig.fall()這一句試試,自然就明白這句話的意義了

  hit:小豬有兩種死法(原諒筆者只能用這個說法了),一是掉在地上摔死了,另一種是在柱子上撞死了,hit方法就是處理小豬被撞死的情況的,當調用pig.hit()時,每20毫秒讓小豬的Y值減去12,並賦值給DOM對象的bottom值來實際控制小豬的移動,直到小豬躺在地板上。

})(flappy || {});

以上是對pig的抽象,其中的一些理解上的細節需要讀者狠下一番功夫了,先詳細解釋一下虛擬碼中紅字部分的意思。

 

flappy pig小遊戲源碼分析(4)——核心pig模組(未完待續)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.