在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ cocos2d-x for js 中的繼承
cocos2d-x for js 中的繼承
JS 與 C++ 的交互 1——JS 代碼調用 C++ 代碼
迎接腳本時代的到來
解決在 vs 中修改 js 源文件無效
JS 腳本語言的優(yōu)勢與一些問題
注冊函數(shù)
回調函數(shù) 2
cxx-generator JS 綁定工具
使用 cocos2d-console 工具轉換腳本為字節(jié)碼
hybrid 開發(fā)模式
JS 與 C++ 的交互 2——JS 與 C++ 的“函數(shù)重載”問題
回調函數(shù)1——按鍵回調
Google 的繼承寫法解析
John Resiq 的繼承寫法解析
JS 與 C++ 的交互 3——C++ 和 JS 類型轉換
傀儡構造函數(shù)

cocos2d-x for js 中的繼承

對于面向對象語言來說,繼承機制是代碼復用的基礎,很不幸的是 javascript 作為一個基于原型繼承的語言,并沒有在本身語言層面上直接作出對類繼承的支持。 但是 js 語言擁有很強大的表現(xiàn)力。所以一般是 js 的使用者自行設計一套繼承機制,這個機制必須包括幾個點,對私有訪問權限的模擬,對屬性和類屬性的不同實現(xiàn),對方法覆蓋的支持,對父類被覆蓋方法的訪問等。 cocos2d-x 中,整合了兩套繼承機制,看《MoonWarriors》例子中的源碼SysMenu.js文件

var SysMenu = cc.Layer.extend({ 
    _ship:null, 

    ctor:function () { 
        cc.associateWithNative( this, cc.Layer ); 
    }, 
    init:function () { 
        var bRet = false; 
        if (this._super()) { 
            winSize = cc.Director.getInstance().getWinSize(); 
            var sp = cc.Sprite.create(s_loading); 
            sp.setAnchorPoint(cc.p(0,0)); 
            this.addChild(sp, 0, 1); 

            var logo = cc.Sprite.create(s_logo); 
            logo.setAnchorPoint(cc.p(0, 0)); 
            logo.setPosition(0, 250); 
            this.addChild(logo, 10, 1); 

            var newGameNormal = cc.Sprite.create(s_menu, cc.rect(0, 0, 126, 33)); 
            var newGameSelected = cc.Sprite.create(s_menu, cc.rect(0, 33, 126, 33)); 
            var newGameDisabled = cc.Sprite.create(s_menu, cc.rect(0, 33 * 2, 126, 33)); 

            var gameSettingsNormal = cc.Sprite.create(s_menu, cc.rect(126, 0, 126, 33)); 
            var gameSettingsSelected = cc.Sprite.create(s_menu, cc.rect(126, 33, 126, 33)); 
            var gameSettingsDisabled = cc.Sprite.create(s_menu, cc.rect(126, 33 * 2, 126, 33)); 

            var aboutNormal = cc.Sprite.create(s_menu, cc.rect(252, 0, 126, 33)); 
            var aboutSelected = cc.Sprite.create(s_menu, cc.rect(252, 33, 126, 33)); 
            var aboutDisabled = cc.Sprite.create(s_menu, cc.rect(252, 33 * 2, 126, 33)); 

            var newGame = cc.MenuItemSprite.create(newGameNormal, newGameSelected, newGameDisabled, function () { 
                this.onButtonEffect(); 
                flareEffect(this, this, this.onNewGame); 
            }.bind(this)); 
            var gameSettings = cc.MenuItemSprite.create(gameSettingsNormal, gameSettingsSelected, gameSettingsDisabled, this.onSettings, this); 
            var about = cc.MenuItemSprite.create(aboutNormal, aboutSelected, aboutDisabled, this.onAbout, this); 

            var menu = cc.Menu.create(newGame, gameSettings, about); 
            menu.alignItemsVerticallyWithPadding(10); 
            this.addChild(menu, 1, 2); 
            menu.setPosition(winSize.width / 2, winSize.height / 2 - 80); 
            this.schedule(this.update, 0.1); 

            var tmp = cc.TextureCache.getInstance().addImage(s_ship01); 
            this._ship = cc.Sprite.createWithTexture(tmp,cc.rect(0, 45, 60, 38)); 
            this.addChild(this._ship, 0, 4); 
            var pos = cc.p(Math.random() * winSize.width, 0); 
            this._ship.setPosition( pos ); 
            this._ship.runAction(cc.MoveBy.create(2, cc.p(Math.random() * winSize.width, pos.y + winSize.height + 100))); 

            if (MW.SOUND) { 
                cc.AudioEngine.getInstance().setMusicVolume(0.7); 
                cc.AudioEngine.getInstance().playMusic(s_mainMainMusic, true); 
            } 

            bRet = true; 
        } 
        return bRet; 
    }, 
    onNewGame:function (pSender) { 
        var scene = cc.Scene.create(); 
        scene.addChild(GameLayer.create()); 
        scene.addChild(GameControlMenu.create()); 
        cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
    }, 
    onSettings:function (pSender) { 
        this.onButtonEffect(); 
        var scene = cc.Scene.create(); 
        scene.addChild(SettingsLayer.create()); 
        cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
    }, 
    onAbout:function (pSender) { 
        this.onButtonEffect(); 
        var scene = cc.Scene.create(); 
        scene.addChild(AboutLayer.create()); 
        cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
    }, 
    update:function () { 
        if (this._ship.getPosition().y > 480) { 
            var pos = cc.p(Math.random() * winSize.width, 10); 
            this._ship.setPosition( pos ); 
            this._ship.runAction( cc.MoveBy.create( 
                parseInt(5 * Math.random(), 10), 
                cc.p(Math.random() * winSize.width, pos.y + 480))); 
        } 
    }, 
    onButtonEffect:function(){ 
        if (MW.SOUND) { 
            var s = cc.AudioEngine.getInstance().playEffect(s_buttonEffect); 
        } 
    } 
}); 

SysMenu.create = function () { 
    var sg = new SysMenu(); 
    if (sg && sg.init()) { 
        return sg; 
    } 
    return null; 
}; 

SysMenu.scene = function () { 
    var scene = cc.Scene.create(); 
    var layer = SysMenu.create(); 
    scene.addChild(layer); 
    return scene; 
}; 

這個 extend 繼承寫法由 John Resig 創(chuàng)造,John Resig 是 JS 領域的大神,而且網(wǎng)上有很多粉絲給他編的段子,非常有趣。 例子中使用父類 cc.Layer.extend 方法來啟動繼承,傳入一個對象字面量{},這個字面量可以包含對象屬性和對象方法,最終由 extend 來完成接口綁定,返回一個構造函數(shù)賦值給 SysMenu。 對于類方法(也就是通常意義上的靜態(tài)方法),使用的是 js 最傳統(tǒng)的方式,直接給構造函數(shù)指定屬性即可。 這種編寫代碼的方式非常簡單,而且也很優(yōu)美。更重要的是,這種寫法,非常符合 C++ 或 java 程序員的排版審美。 關于繼承的理解。js 里面的原型繼承和基于類的繼承方式截然不同,內部是在維護一個原型鏈,鏈上的節(jié)點與節(jié)點之間是鏈接關系(注意:不是賦值,也不是拷貝)??梢韵瓤匆幌隆稒嗤改稀纺潜緯窃趺粗v的,不過很遺憾,那本書關于原型繼承的圖解畫的不太好……千萬不要搞代數(shù)式的替換和死記硬背,那樣你很難掌握原型鏈的本質。 另外,強烈推薦三生石上的系列文章《JavaScript 繼承詳解》

有時間的話,我會把三生石上的文章配一些詳細的原型鏈描述圖,這樣就可以很容易的掌握 js 的原型鏈了。