程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【cocos2d-x從c++到js】04:cocos2d-x for js中的繼承

【cocos2d-x從c++到js】04:cocos2d-x for js中的繼承

編輯:關於C語言

對於面向對象語言來說,繼承機制是代碼復用的基礎,很不幸的是javascript作為一個基於原型繼承的語言,並沒有在本身語言層面上直接作出對類繼承的支持。

但是js語言擁有很強大的表現力。所以一般是js的使用者自行設計一套繼承機制,這個機制必須包括幾個點,對私有訪問權限的模擬,對屬性和類屬性的不同實現,對方法覆蓋的支持,對父類被覆蓋方法的訪問等。

cocos2d-x中,整合了兩套繼承機制,看《MoonWarriors》例子中的源碼SysMenu.js文件 

  1. var SysMenu = cc.Layer.extend({ 
  2.     _ship:null, 
  3.  
  4.     ctor:function () { 
  5.         cc.associateWithNative( this, cc.Layer ); 
  6.     }, 
  7.     init:function () { 
  8.         var bRet = false; 
  9.         if (this._super()) { 
  10.             winSize = cc.Director.getInstance().getWinSize(); 
  11.             var sp = cc.Sprite.create(s_loading); 
  12.             sp.setAnchorPoint(cc.p(0,0)); 
  13.             this.addChild(sp, 0, 1); 
  14.  
  15.             var logo = cc.Sprite.create(s_logo); 
  16.             logo.setAnchorPoint(cc.p(0, 0)); 
  17.             logo.setPosition(0, 250); 
  18.             this.addChild(logo, 10, 1); 
  19.  
  20.             var newGameNormal = cc.Sprite.create(s_menu, cc.rect(0, 0, 126, 33)); 
  21.             var newGameSelected = cc.Sprite.create(s_menu, cc.rect(0, 33, 126, 33)); 
  22.             var newGameDisabled = cc.Sprite.create(s_menu, cc.rect(0, 33 * 2, 126, 33)); 
  23.  
  24.             var gameSettingsNormal = cc.Sprite.create(s_menu, cc.rect(126, 0, 126, 33)); 
  25.             var gameSettingsSelected = cc.Sprite.create(s_menu, cc.rect(126, 33, 126, 33)); 
  26.             var gameSettingsDisabled = cc.Sprite.create(s_menu, cc.rect(126, 33 * 2, 126, 33)); 
  27.  
  28.             var aboutNormal = cc.Sprite.create(s_menu, cc.rect(252, 0, 126, 33)); 
  29.             var aboutSelected = cc.Sprite.create(s_menu, cc.rect(252, 33, 126, 33)); 
  30.             var aboutDisabled = cc.Sprite.create(s_menu, cc.rect(252, 33 * 2, 126, 33)); 
  31.  
  32.             var newGame = cc.MenuItemSprite.create(newGameNormal, newGameSelected, newGameDisabled, function () { 
  33.                 this.onButtonEffect(); 
  34.                 flareEffect(this, this, this.onNewGame); 
  35.             }.bind(this)); 
  36.             var gameSettings = cc.MenuItemSprite.create(gameSettingsNormal, gameSettingsSelected, gameSettingsDisabled, this.onSettings, this); 
  37.             var about = cc.MenuItemSprite.create(aboutNormal, aboutSelected, aboutDisabled, this.onAbout, this); 
  38.  
  39.             var menu = cc.Menu.create(newGame, gameSettings, about); 
  40.             menu.alignItemsVerticallyWithPadding(10); 
  41.             this.addChild(menu, 1, 2); 
  42.             menu.setPosition(winSize.width / 2, winSize.height / 2 - 80); 
  43.             this.schedule(this.update, 0.1); 
  44.  
  45.             var tmp = cc.TextureCache.getInstance().addImage(s_ship01); 
  46.             this._ship = cc.Sprite.createWithTexture(tmp,cc.rect(0, 45, 60, 38)); 
  47.             this.addChild(this._ship, 0, 4); 
  48.             var pos = cc.p(Math.random() * winSize.width, 0); 
  49.             this._ship.setPosition( pos ); 
  50.             this._ship.runAction(cc.MoveBy.create(2, cc.p(Math.random() * winSize.width, pos.y + winSize.height + 100))); 
  51.  
  52.             if (MW.SOUND) { 
  53.                 cc.AudioEngine.getInstance().setMusicVolume(0.7); 
  54.                 cc.AudioEngine.getInstance().playMusic(s_mainMainMusic, true); 
  55.             } 
  56.  
  57.             bRet = true; 
  58.         } 
  59.         return bRet; 
  60.     }, 
  61.     onNewGame:function (pSender) { 
  62.         var scene = cc.Scene.create(); 
  63.         scene.addChild(GameLayer.create()); 
  64.         scene.addChild(GameControlMenu.create()); 
  65.         cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
  66.     }, 
  67.     onSettings:function (pSender) { 
  68.         this.onButtonEffect(); 
  69.         var scene = cc.Scene.create(); 
  70.         scene.addChild(SettingsLayer.create()); 
  71.         cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
  72.     }, 
  73.     onAbout:function (pSender) { 
  74.         this.onButtonEffect(); 
  75.         var scene = cc.Scene.create(); 
  76.         scene.addChild(AboutLayer.create()); 
  77.         cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene)); 
  78.     }, 
  79.     update:function () { 
  80.         if (this._ship.getPosition().y > 480) { 
  81.             var pos = cc.p(Math.random() * winSize.width, 10); 
  82.             this._ship.setPosition( pos ); 
  83.             this._ship.runAction( cc.MoveBy.create( 
  84.                 parseInt(5 * Math.random(), 10), 
  85.                 cc.p(Math.random() * winSize.width, pos.y + 480))); 
  86.         } 
  87.     }, 
  88.     onButtonEffect:function(){ 
  89.         if (MW.SOUND) { 
  90.             var s = cc.AudioEngine.getInstance().playEffect(s_buttonEffect); 
  91.         } 
  92.     } 
  93. }); 
  94.  
  95. SysMenu.create = function () { 
  96.     var sg = new SysMenu(); 
  97.     if (sg && sg.init()) { 
  98.         return sg; 
  99.     } 
  100.     return null; 
  101. }; 
  102.  
  103. SysMenu.scene = function () { 
  104.     var scene = cc.Scene.create(); 
  105.     var layer = SysMenu.create(); 
  106.     scene.addChild(layer); 
  107.     return scene; 
  108. }; 

這個extend繼承寫法由John Resig創造,John Resig是JS領域的大神,而且網上有很多粉絲給他編的段子,非常有趣。

例子中使用父類cc.Layer.extend方法來啟動繼承,傳入一個對象字面量{},這個字面量可以包含對象屬性和對象方法,最終由extend來完成接口綁定,返回一個構造函數賦值給SysMenu。

對於類方法也就是通常意義上的靜態方法),使用的是js最傳統的方式,直接給構造函數指定屬性即可。

這種編寫代碼的方式非常簡單,而且也很優美。更重要的是,這種寫法,非常符合C++或java程序員的排版審美。

關於繼承的理解。js裡面的原型繼承和基於類的繼承方式截然不同,內部是在維護一個原型鏈,鏈上的節點與節點之間是鏈接關系注意:不是賦值,也不是拷貝)。可以先看一下《權威指南》那本書是怎麼講的,不過很遺憾,那本書關於原型繼承的圖解畫的不太好……千萬不要搞代數式的替換和死記硬背,那樣你很難掌握原型鏈的本質。

另外,強烈推薦三生石上的系列文章《JavaScript繼承詳解》

JavaScript繼承詳解

JavaScript繼承詳解二)

JavaScript繼承詳解三)

JavaScript繼承詳解四)

JavaScript繼承詳解五)

JavaScript繼承詳解六)

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

本文出自 “老G的小屋” 博客,請務必保留此出處http://4137613.blog.51cto.com/4127613/1125167

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved