精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Cocos2d-JS制作類神經(jīng)貓的游戲《你是我的小羊駝》

移動開發(fā) Android 移動應(yīng)用 游戲開發(fā)
一夜之間,微信上一款叫《圍住神經(jīng)貓》的小游戲火了。它的玩法很簡單,用最少的步數(shù)把一只神經(jīng)兮兮的貓圍死。 7月22號上線以來,3天、500萬用戶和1億訪問,想必各位程序猿都按耐不住了,想實現(xiàn)自己的神經(jīng)貓游戲。

(via:Cocos 引擎中文站

一夜之間,微信上一款叫《圍住神經(jīng)貓》的小游戲火了。它的玩法很簡單,用最少的步數(shù)把一只神經(jīng)兮兮的貓圍死。 7月22號上線以來,3天、500萬用戶和1億訪問,想必各位程序猿都按耐不住了,想實現(xiàn)自己的神經(jīng)貓游戲。

在這篇教程里,我會教大家如何用Cocos2d-JS來實現(xiàn)一個神經(jīng)貓這樣的游戲。 讓我們先看下游戲***完成了的效果圖:

你可能注意到了,神經(jīng)貓換成了可愛的小羊駝:)

在線游戲地址:http://app9.download.anzhuoshangdian.com/xyt/?from=singlemessage&isappinstalled=0

源碼地址:https://github.com/chukong/cocos-docs/blob/master/tutorial/framework/html5/how-to-make-a-cat-game/res/Catnorris-master.zip

游戲分析

三個界面基本上就是整個游戲的全部內(nèi)容:

1.左邊的是主界面,展示游戲名稱以及主角,讓玩家對游戲的整體畫風(fēng)有個大概的印象。

2.中間的是游戲界面,點擊空格防止橙色六邊形磚塊來圍堵小羊駝。

3.右邊的是游戲成功或失敗的界面。

整個游戲的主邏輯都在游戲界面中完成。

玩法是這樣:

1.游戲初始化開始,小羊駝始終是站在地圖中間,在地圖的其他區(qū)域隨機生產(chǎn)一些位置隨機的磚塊。

2.玩家點擊一個空白區(qū)域,放置一個磚塊來圍堵羊駝。

3.羊駝AI尋路移動一步。

4.循環(huán)2和3,直到羊駝被圍堵在一個圈里面(游戲成功),或羊駝到達(dá)地圖邊界(游戲失敗)

整個游戲的思路理清楚了,接下來我們開始進(jìn)入編碼階段。

開發(fā)環(huán)境與新建項目

本教程開發(fā)基于當(dāng)前***的Download v3.0RC1.  (其他版本下載地址:http://cn.cocos2d-x.org/download/

下載引擎并解壓到磁盤的某個目錄。

打開控制臺,輸入下面的命令來新建項目。

  1. $cd cocos2d-js-v3.0-rc1/tools/cocos2d-console/bin 
  2. $./cocos new -l js --no-native 
  3. $cd MyJSGame/ 
  4. $../cocos run -p web 

環(huán)境搭建并不是這篇文章的重點,更詳細(xì)的信息可以參考:《搭建 Cocos2d-JS 開發(fā)環(huán)境

主界面實現(xiàn)

游戲的入口代碼在main.js中,用編輯器打開并修改為下面的代碼。

  1. cc.game.onStart = function(){ 
  2.     // 1. 
  3.     cc.view.adjustViewPort(true); 
  4.   
  5.     // 2. 
  6.     if (cc.sys.isMobile) 
  7.         cc.view.setDesignResolutionSize(320,500,cc.ResolutionPolicy.FIXED_WIDTH); 
  8.     else cc.view.setDesignResolutionSize(320,480,cc.ResolutionPolicy.SHOW_ALL); 
  9.     cc.view.resizeWithBrowserSize(true); 
  10.   
  11.     // 3. 
  12.     cc.LoaderScene.preload(resources, function () { 
  13.         // 4. 
  14.         gameScene = new GameScene(); 
  15.         cc.director.runScene(gameScene); 
  16.     }, this); 
  17. }; 
  18.   
  19. cc.game.run(); 

關(guān)鍵點解析如下:

1.設(shè)置瀏覽器meta來適配屏幕,引擎內(nèi)部會根據(jù)屏幕大小來設(shè)置meta的viewport值,會達(dá)到更好的屏幕適配效果。

2.針對手機瀏覽器和PC瀏覽器啟用不同的分辨率適配策略。

3.預(yù)加載圖片聲音等資源。 cc.LoaderScene.preload會生成一個“加載中 x%”的界面,等待資源加載結(jié)束后,調(diào)用第二個參數(shù)傳入的匿名函數(shù)。 對于基于html的游戲,頁面是放在服務(wù)器端供瀏覽器下載的,為了獲得流暢的用戶體驗,cc.LoaderScene.preload讓瀏覽器先把遠(yuǎn)程服 務(wù)器的資源緩存到本地。需要預(yù)加載的資源定義在src/Resources.js文件中。

4.啟動游戲的***個場景。

主界面的由兩個層實現(xiàn):

1.GameLayer層,游戲主邏輯層,在未初始化地圖矩陣時,它只顯示背景地圖。

2.StartUI層,顯示logo圖片和開始游戲按鈕。

GameScene的初始化代碼如下:

  1. var GameScene = cc.Scene.extend({ 
  2.     onEnter : function () { 
  3.         this._super(); 
  4.   
  5.         var bg = new cc.Sprite(res.bg); 
  6.         bg.attr({ 
  7.             anchorX : 0.5, 
  8.             anchorY : 0.5, 
  9.             x : cc.winSize.width/2, 
  10.             y : cc.winSize.height/2 
  11.         }); 
  12.         this.addChild(bg); 
  13.   
  14.         layers.game = new GameLayer(); 
  15.         this.addChild(layers.game); 
  16.   
  17.         layers.startUI = new StartUI(); 
  18.         this.addChild(layers.startUI); 
  19.   
  20.         layers.winUI = new ResultUI(true); 
  21.         layers.loseUI = new ResultUI(false); 
  22.         layers.shareUI = new ShareUI(); 
  23.     } 
  24. }); 

由引擎提供的cc.Scene.extend方法,讓js能實現(xiàn)高級面向?qū)ο笳Z言的繼承特性。 onEnter方法是場景初始化完成即將展示的消息回調(diào),在onEnter中必須調(diào)用this._super();來確保Scene被正確的初始化。

整個游戲的設(shè)計只有一個scene,界面之間的切換由layer來實現(xiàn),這可能不是一個***的設(shè)計,但也提供另一種思路。 為了用layer來實現(xiàn)切換,全局變量layers存儲了各層的一個實例。

GameLayer我們在下一章節(jié)中詳細(xì)講解。

StartUI的實現(xiàn)如下:

  1. var StartUI = cc.Layer.extend({ 
  2.     ctor : function () { 
  3.         this._super(); 
  4.   
  5.         var start = new cc.Sprite(res.start); 
  6.         start.x = cc.winSize.width/2; 
  7.         start.y = cc.winSize.height/2 + 20; 
  8.         this.addChild(start); 
  9.     }, 
  10.     onEnter : function () { 
  11.         this._super(); 
  12.   
  13.         cc.eventManager.addListener({ 
  14.             event: cc.EventListener.TOUCH_ALL_AT_ONCE, 
  15.             onTouchesEnded: function (touches, event) { 
  16.                 var touch = touches[0]; 
  17.                 var pos = touch.getLocation(); 
  18.                 if (pos.y < cc.winSize.height/3) { 
  19.                     layers.game.initGame(); 
  20.                     layers.startUI.removeFromParent(); 
  21.                 } 
  22.             } 
  23.         }, this); 
  24.     } 
  25. }); 

cc.Layer.extend作用同cc.Scene.extend一樣,只不過是一個擴展Scene,一個擴展Layer。ctor是Cocos2d-JS中的構(gòu)造函數(shù),在ctor中必須調(diào)用this._super();以確保正確的初始化。

在onEnter中,我們?yōu)镾tartUI層綁定事件監(jiān)聽,判斷觸摸點的位置坐標(biāo)來觸發(fā)scene切換。

細(xì)心的讀者可能要問,為什么不用Menu控件? 當(dāng)前的Cocos2d-JS版本已實現(xiàn)模塊化,可以選擇只加載游戲中用到的模塊,已減少最終打包size。 為了不加入Menu模塊,這里使用了最簡單的觸摸點坐標(biāo)判斷來實現(xiàn)通用的事情。

游戲界面的實現(xiàn)

橙色塊的初始化

游戲地圖區(qū)域是由9*9的六邊形方塊組成的,首先用InActive的圖片初始化一邊矩陣。相關(guān)代碼如下:

  1. var ox = x = y = 0, odd = false, block, tex = this.batch.texture; 
  2. for (var r = 0; r < ROW; r++) { 
  3.     y = BLOCK_YREGION * r; 
  4.     ox = odd * OFFSET_ODD; 
  5.     for (var c = 0; c < COL; c++) { 
  6.         x = ox + BLOCK_XREGION * c; 
  7.         block = new cc.Sprite(tex, BLOCK2_RECT); 
  8.         block.attr({ 
  9.             anchorX : 0, 
  10.             anchorY : 0, 
  11.             x : x, 
  12.             y : y, 
  13.             width : BLOCK_W, 
  14.             height : BLOCK_H 
  15.         }); 
  16.         this.batch.addChild(block); 
  17.     } 
  18.     odd = !odd; 

每次循環(huán)odd改變,已實現(xiàn)上下錯位的排布。 attr是Node基類的新方法,可以方便的一次性設(shè)置多個屬性。

橙色方塊的初始化是由initGame函數(shù)來完成。 先來看initGame的實現(xiàn):

  1. initGame : function() { 
  2.     if (this.inited) return
  3.   
  4.     this.player_c = this.player_r = 4; 
  5.     this.step = 0; 
  6.   
  7.     // 1. 
  8.     for (var i = 0, l = this.active_nodes.length; i < l; i++) { 
  9.         this.active_nodes[i].removeFromParent(); 
  10.     } 
  11.     this.active_nodes = []; 
  12.     for (var r = 0; r < ROW; r++) { 
  13.         for (var c = 0; c < COL; c++) { 
  14.             this.active_blocks[r][c] = false
  15.         } 
  16.     } 
  17.   
  18.     // 2. 
  19.     this.randomBlocks(); 
  20.   
  21.     // 3. 
  22.     this.player.attr({ 
  23.         anchorX : 0.5, 
  24.         anchorY : 0, 
  25.         x : OFFSET_X + BLOCK_XREGION * this.player_c + BLOCK_W/2, 
  26.         y : OFFSET_Y + BLOCK_YREGION * this.player_r - 5 
  27.     }); 
  28.     this.player.stopAllActions(); 
  29.     this.player.runAction(this.moving_action); 
  30.   
  31.     this.inited = true
  32. }, 

要點解析如下:

1.為了方便邏輯處理,這里用了active_nodes和active_blocks來記錄被激活的方塊。在初始化矩陣前,需要清理上一次游戲已生成的橙色方塊。active_nodes存儲精靈實例,active_blocks記錄精靈的矩陣坐標(biāo)。

2.randomBlocks函數(shù)生成隨機橙色磚塊。 首先產(chǎn)生一個7-20的隨機數(shù),也就是確定橙色塊的數(shù)量。然后循環(huán)確定每一個塊的位置坐標(biāo),當(dāng)然位置坐標(biāo)也是隨機確定的。

3.復(fù)位小羊駝的位置以及動畫。

響應(yīng)觸摸事件

按照我們之前的分析,游戲界面初始化完成后,需要等待用戶指令才能進(jìn)行下一步的游戲。

相關(guān)代碼如下:

  1. // 1. 
  2. cc.eventManager.addListener({ 
  3.     // 2. 
  4.     event: cc.EventListener.TOUCH_ALL_AT_ONCE, 
  5.     // 3. 
  6.     onTouchesBegan: function (touches, event) { 
  7.         var touch = touches[0]; 
  8.         var pos = touch.getLocation(); 
  9.         var target = event.getCurrentTarget(); 
  10.         if (!target.inited) return
  11.   
  12.         pos.y -= OFFSET_Y; 
  13.         var r = Math.floor(pos.y / BLOCK_YREGION); 
  14.         pos.x -= OFFSET_X + (r%2==1) * OFFSET_ODD; 
  15.         var c = Math.floor(pos.x / BLOCK_XREGION); 
  16.         if (c >= 0 && r >= 0 && c < COL && r < ROW) { 
  17.             if (target.activateBlock(r, c)) { 
  18.                 target.step ++; 
  19.                 target.movePlayer(); 
  20.             } 
  21.         } 
  22.     } 
  23. }, this); 

1. cc.eventManager.addListener加入新的事件監(jiān)聽。

2. 設(shè)置事件監(jiān)聽模式為TOUCH_ALL_AT_ONCE。

3. 重寫onTouchesBegan方法,判斷觸摸點的坐標(biāo),確定是哪個塊被點擊,并做響應(yīng)的處理。 activateBlock方法在對應(yīng)的矩陣位置加入橙色塊,并更新狀態(tài)數(shù)組。然后調(diào)用movePlayer移動小羊駝。

羊駝的移動

整個邏輯的關(guān)鍵是AI.js中的getDistance函數(shù),

getDistance有6個參數(shù):

1.羊駝所在行號

2.羊駝所在列號

3.前進(jìn)方向,l_choices、r_choices、t_choices或b_choices

4.激活塊的記錄數(shù)組

5.輔助記錄表,記錄在尋路算法中某個節(jié)點是不是已經(jīng)被訪問過。

6.最短路徑

返回值有三種情況:

1.羊駝到達(dá)地圖邊界,返回羊駝坐標(biāo)和最短路徑0

2.羊駝還在地圖中,返回羊駝的下一個坐標(biāo)值和最短路徑cost

3. -1表示羊駝被圈住了,但可能可以移動。

getDistance的代碼實現(xiàn)如下:

  1. var getDistance = function (r, c, dir_choices, activate_blocs, passed, cost) { 
  2.     passed[r][c] = true
  3.     if (r <= 0 || r >= ROW_MINUS_1 || c <= 0 || c >= COL_MINUS_1) { 
  4.         return [r, c, cost]; 
  5.     } 
  6.   
  7.     var odd = (r % 2 == 1) ? 1 : 0; 
  8.     var choices = dir_choices[odd]; 
  9.   
  10.     var nextr, nextc, result; 
  11.     for (var i = 0, l = choices.length; i < l; i++) { 
  12.         nextr = r + choices[i][0]; 
  13.         nextc = c + choices[i][4]; 
  14.   
  15.         if (!activate_blocs[nextr][nextc] && !passed[nextr][nextc]) { 
  16.             cost ++; 
  17.             result = getDistance(nextr, nextc, dir_choices, activate_blocs, passed, cost); 
  18.             if (result != -1) { 
  19.                 result[0] = nextr; 
  20.                 result[1] = nextc; 
  21.                 return result; 
  22.             } 
  23.         } 
  24.     } 
  25.     return -1; 
  26. }; 

在羊駝移動函數(shù)movePlayer中,首先通過getDistance來判斷上下左右4個方向,來尋找***移動方向。根據(jù)getDistance的返回結(jié)果做相應(yīng)的邏輯處理。

游戲結(jié)束界面

游戲結(jié)束的兩種情況,玩家勝利或失敗。

在ResultUI的構(gòu)造函數(shù)中,加入?yún)?shù)win,用來標(biāo)識是否勝利。而勝利和失敗僅僅是顯示文字的區(qū)別,下方的兩個按鈕均一樣。

在ctor中,根據(jù)是否勝利加載不同的圖片來顯示:

  1. ctor : function (win) { 
  2.      this._super(); 
  3.   
  4.      this.win = win; 
  5.      if (win) { 
  6.          this.winPanel = new cc.Sprite(res.succeed); 
  7.          this.winPanel.x = cc.winSize.width/2; 
  8.          this.winPanel.anchorY = 0.2; 
  9.          this.winPanel.y = cc.winSize.height/2; 
  10.          this.addChild(this.winPanel); 
  11.      } 
  12.      else { 
  13.          this.losePanel = new cc.Sprite(res.failed); 
  14.          this.losePanel.x = cc.winSize.width/2; 
  15.          this.losePanel.anchorY = 0.2; 
  16.          this.losePanel.y = cc.winSize.height/2; 
  17.          this.addChild(this.losePanel); 
  18.      } 
  19.  } 

在onEnter中,根據(jù)是否勝利加載不同的文字描述:

  1. if (this.win) { 
  2.     this.winPanel.removeAllChildren(); 
  3.   
  4.     var w = this.winPanel.width, h = this.winPanel.height; 
  5.     var label = new cc.LabelTTF("繼續(xù)刷屏!\n"+step+"步推倒我的小羊駝\n打敗"+percent+"%朋友圈的人!\n你能超過我嗎?""宋體", 20); 
  6.     label.x = w/2; 
  7.     label.y = h/4; 
  8.     label.textAlign = cc.LabelTTF.TEXT_ALIGNMENT_CENTER; 
  9.     //label.boundingWidth = w; 
  10.     label.width = w; 
  11.     label.color = cc.color(0, 0, 0); 
  12.     this.winPanel.addChild(label); 
  13. else { 
  14.     this.losePanel.removeAllChildren(); 
  15.     var w = this.losePanel.width, h = this.losePanel.height; 
  16.     label = new cc.LabelTTF("我滴小羊駝呀它又跑掉了\nT_T 快幫我抓回來!""宋體", 20); 
  17.     label.x = w/2; 
  18.     label.y = h/4+5; 
  19.     label.textAlign = cc.LabelTTF.TEXT_ALIGNMENT_CENTER; 
  20.     //label.boundingWidth = w; 
  21.     label.width = w; 
  22.     label.color = cc.color(0, 0, 0); 
  23.     this.losePanel.addChild(label, 10); 

"通知好友"按鈕加載shareUI層,這個層其實是一個幫助指導(dǎo)界面,指示用戶點擊微信右上角的分享按鈕進(jìn)行分享。

  1. gameScene.addChild(layers.shareUI, 100); 
  2. target.win ? share(1, step, percent) : share(2); 

"再來一次"實現(xiàn)很簡單,調(diào)用initGame重新初始化矩陣,并移除ResultUI層。

  1. layers.game.initGame(); 
  2. target.win ? layers.winUI.removeFromParent() : layers.loseUI.removeFromParent(); 

分享指導(dǎo)界面

在游戲結(jié)束界面我們加入了分享按鈕。現(xiàn)在我們就來實現(xiàn)分享界面。

分享界面由分享圖標(biāo)和分享說明組成。這和前面的layer創(chuàng)建一樣。很簡單,唯一的區(qū)別是,分享界面是cc.LayerColor(cc.LayerColor支持設(shè)置層的顏色)的子類。下面是實現(xiàn)代碼:

  1. ctor: function () { 
  2.     this._super(cc.color(0, 0, 0, 188), cc.winSize.width, cc.winSize.height); 
  3.   
  4.     var arrow = new cc.Sprite(res.arrow); 
  5.     arrow.anchorX = 1; 
  6.     arrow.anchorY = 1; 
  7.     arrow.x = cc.winSize.width - 15; 
  8.     arrow.y = cc.winSize.height - 5; 
  9.     this.addChild(arrow); 
  10.   
  11.     var label = new cc.LabelTTF("請點擊右上角的菜單按鈕\n再點\"分享到朋友圈\"\n讓好友們挑戰(zhàn)你的分?jǐn)?shù)!""宋體", 20, cc.size(cc.winSize.width*0.7, 250), cc.TEXT_ALIGNMENT_CENTER); 
  12.     label.x = cc.winSize.width/2; 
  13.     label.y = cc.winSize.height - 100; 
  14.     label.anchorY = 1; 
  15.     this.addChild(label); 
  16. }, 

加入touch事件用于移除分享界面:

  1. onEnter: function () { 
  2.     this._super(); 
  3.     cc.eventManager.addListener({ 
  4.         event: cc.EventListener.TOUCH_ONE_BY_ONE, 
  5.         onTouchBegan: function (touch, event) { 
  6.             layers.shareUI.removeFromParent(); 
  7.         } 
  8.     }, this); 

微信分享

我們需要的功能:

1.分享到微信朋友圈

2.分享給微信好友

3.分享到騰訊微博

4.關(guān)注指定用戶

實現(xiàn)方式

本功能已經(jīng)有大神提供了完整的庫,地址是:https://github.com/zxlie/WeixinApi ,以下我們做一個簡單的使用分析。

注:除特殊說明外,本小節(jié)實現(xiàn)均在文件 WeixinApi.js中。

現(xiàn)在我們實現(xiàn)的分享有,發(fā)給指定朋友,分享到朋友圈,分享到騰訊微博。對于不同的分享方式,實現(xiàn)方式大同小異,我們主要以分享到朋友圈為例。

分享數(shù)據(jù)

我們分享的時候需要的數(shù)據(jù)有:appid,圖片,鏈接,標(biāo)題,文字內(nèi)容,例如:

對應(yīng)在代碼中就需要以下數(shù)據(jù):

  1. "appid":theData.appId ? theData.appId : ''
  2. "img_url":theData.imgUrl, 
  3. "link":theData.link, 
  4. "desc":theData.desc, 
  5. "title":theData.title, // 注意這里要分享出去的內(nèi)容是desc 

數(shù)據(jù)來源

為了得到數(shù)據(jù),我們需要在GameScene.js中實現(xiàn)ResultUI的時候,將以上數(shù)據(jù)生成出來。 比如勝利時,我們需要顯示:

  1. var label = new cc.LabelTTF("繼續(xù)刷屏!\n"+step+"步推倒我的小羊駝\n打敗"+percent+"%朋友圈的人!\n你能超過我嗎?""宋體", 20); 

完成數(shù)據(jù)后,我們需要判斷勝利或失敗,并傳回ui中顯示:

  1. target.win ? share(1, step, percent) : share(2); 

分享回調(diào)

為了監(jiān)測分享的狀態(tài),無論分享成功與否我們回調(diào)都會上報狀態(tài),以便程序處理,我們需要的狀態(tài)有:

1.用戶取消分享

2.分享失敗

3.分享成功 所以我們需要以下實現(xiàn):

  1. WeixinJSBridge.on('menu:share:timeline'function (argv) { 
  2.     if (callbacks.async && callbacks.ready) { 
  3.         window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); 
  4.         if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { 
  5.             window["_wx_loadedCb_"] = new Function(); 
  6.         } 
  7.         callbacks.dataLoaded = function (newData) { 
  8.             window["_wx_loadedCb_"](newData); 
  9.             shareTimeline(newData); 
  10.         }; 
  11.         // 然后就緒 
  12.         callbacks.ready && callbacks.ready(argv); 
  13.     } else { 
  14.         // 就緒狀態(tài) 
  15.         callbacks.ready && callbacks.ready(argv); 
  16.         shareTimeline(data); 
  17.     } 
  18. }); 

WeixinJSBridge

在微信上,通過公眾平臺推送給用戶的文章,是在微信內(nèi)部直接打開的,用的無外乎就是一個UIWebView控件(IOS上,Android上也 差不多)。但特殊的是,微信官方在這里面加了一個默認(rèn)的Js API--WeixinJSBridge,通過它,能直接在該頁面上做分享操作。 以下代碼,拿去玩吧:

  1. WeixinJSBridge.on('menu:share:timeline'function (argv) { 
  2.     if (callbacks.async && callbacks.ready) { 
  3.         window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); 
  4.         if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { 
  5.             window["_wx_loadedCb_"] = new Function(); 
  6.         } 
  7.         callbacks.dataLoaded = function (newData) { 
  8.             window["_wx_loadedCb_"](newData); 
  9.             shareTimeline(newData); 
  10.         }; 
  11.         // 然后就緒 
  12.         callbacks.ready && callbacks.ready(argv); 
  13.     } else { 
  14.         // 就緒狀態(tài) 
  15.         callbacks.ready && callbacks.ready(argv); 
  16.         shareTimeline(data); 
  17.     } 
  18. }); 

***,趕緊寫點誘惑的東東,讓用戶分享出去吧,這是微信病毒傳播的樂趣!

后記

你可以在這里獲取本教程的全部  源碼

責(zé)任編輯:閆佳明 來源: Cocos引擎中文站
相關(guān)推薦

2014-08-28 10:20:03

游戲設(shè)計

2015-10-23 13:44:14

巴巴獵

2014-06-13 19:13:50

Cocos2d-JS

2011-08-08 11:26:39

Cocos2d 游戲 Class類

2015-03-25 20:09:21

2023-05-22 09:28:30

模型AI

2011-12-12 10:40:08

Cocos2d-X游戲開發(fā)開發(fā)環(huán)境

2014-12-08 16:56:53

2015-07-17 10:38:21

教程COCOS射箭游戲

2015-07-21 16:25:24

2014-11-26 13:31:34

2012-02-19 20:10:23

Cocos2d-x fCocos2dWindows Pho

2015-01-06 17:05:09

Html5引擎Cocos2d-JS

2013-12-06 10:47:22

宜家天貓雅座

2012-04-17 12:52:01

cocos2d-x

2011-08-04 17:01:16

iPhone游戲開發(fā) Cocos2d

2011-08-11 14:22:47

iPhone游戲Cocos2D

2011-08-09 16:08:58

IOS游戲Cocos2d

2012-04-16 13:37:57

cocos2d

2011-08-11 14:32:04

iPhone游戲Cocos2dActions
點贊
收藏

51CTO技術(shù)棧公眾號

国产xxx在线观看| 亚洲三区在线| 亚洲av无码不卡| 欧美日韩国产一区二区三区不卡| 欧美日韩免费在线视频| 红桃一区二区三区| 免费在线黄色影片| 国产麻豆成人精品| 清纯唯美日韩制服另类| 尤物在线免费视频| 中文字幕一区二区三区日韩精品| 富二代精品短视频| 欧美一级免费在线观看| 亚洲av成人无码久久精品老人 | 亚洲欧美色综合| 精品视频导航| 国产又大又黄的视频| 午夜一区在线| 欧美俄罗斯性视频| 久草福利资源在线| 婷婷综合电影| 欧美不卡一二三| 五月婷婷丁香色| 少妇视频一区| 亚洲一级在线观看| 综合视频在线观看| 国产免费av在线| 成人国产亚洲欧美成人综合网| 国产精品美女午夜av| 久久国产精品系列| 欧美阿v一级看视频| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕精品视频在线| 视频二区欧美| 欧美一区二区视频在线观看2022| 欧美黄色一级片视频| gogo久久| 亚洲午夜日本在线观看| 最新中文字幕久久| 欧美日韩xx| 中文字幕乱码一区二区免费| 免费国产在线精品一区二区三区| 成人毛片在线精品国产| 国产精品中文字幕欧美| 91久久久久久久久久| 中文字幕乱伦视频| 日本网站在线观看一区二区三区| 2019亚洲日韩新视频| 日本少妇bbwbbw精品| 欧美日韩三级| 欧美日韩成人在线视频| 青娱乐91视频| 狠色狠色综合久久| 九九久久国产精品| 国产在线一二区| 激情成人综合| 韩国亚洲精品| 中文字幕免费一区二区| 一区二区理论电影在线观看| 中文精品视频一区二区在线观看| 欧美午夜电影一区二区三区| 中文字幕亚洲在| 在线无限看免费粉色视频| 久草免费在线| 亚洲理论在线观看| 999一区二区三区| 高清在线视频不卡| 亚洲一区二区三区四区五区中文| 丁香六月激情网| 绿色成人影院| 在线观看日韩电影| www.夜夜爽| 清纯唯美激情亚洲| 亚洲精品一区二区三区在线观看| 手机在线成人av| 深爱激情综合| 欧美亚韩一区| 亚洲成人在线网| 丰满少妇一区二区三区| 欧美日韩伦理| 久久精品国产2020观看福利| 免费视频一二三区| 一本色道久久综合亚洲精品高清 | 亚洲国产欧美日韩| 久久五月精品| 婷婷六月综合网| 亚洲免费av一区二区三区| 久久人人视频| 亚洲国产第一页| 91成人在线免费视频| 国产精品7m凸凹视频分类| 久久久久久网址| 男人的天堂av网站| 国产精品自拍av| 蜜桃av久久久亚洲精品| 国产激情在线观看| 红桃av永久久久| 香港日本韩国三级网站| 91国内精品白嫩初高生| 亚洲视频在线观看网站| 欧美精品99久久久| 日韩国产一区二| 国产精品久久久久av福利动漫| 国产中文字幕在线| 亚洲自拍与偷拍| 一区二区三区视频在线观看免费| 在线日韩成人| 日韩在线视频网站| 香蕉影院在线观看| 高清不卡一区二区在线| 日韩中文字幕一区二区| 视频在线这里都是精品| 欧洲精品一区二区三区在线观看| 99riav国产精品视频| 成人影院在线| 38少妇精品导航| www.xxx国产| 国产精品欧美综合在线| 成年人午夜视频在线观看| 亚洲狼人综合| 亚洲精品永久免费| 欧美一级高潮片| 国产中文字幕精品| 亚洲精品一区二区三区av| 国模私拍一区二区国模曼安| 91精品在线观看入口| 国产精品av久久久久久无| 亚洲一区二区三区高清| 成人自拍爱视频| 1769免费视频在线观看| 欧美日韩三级在线| 女尊高h男高潮呻吟| 在线国产欧美| 粉嫩av四季av绯色av第一区| 麻豆网站在线免费观看| 欧美亚洲动漫精品| 高潮毛片无遮挡| 一区二区国产精品| 国产原创精品| 爱情岛亚洲播放路线| 日韩免费一区二区三区在线播放| 少妇高潮在线观看| 久久精品国产久精国产爱| 天堂精品一区二区三区| 小明成人免费视频一区| 国产亚洲精品美女| 国产成人精品亚洲| 国产亚洲女人久久久久毛片| 亚洲国产精品久久久久婷蜜芽| 久久精品66| 97在线日本国产| 日本精品一区二区在线观看| 亚洲韩国精品一区| 波多野结衣办公室双飞| 亚洲精品精选| 久久综合九色综合网站| 亚洲精品一区| 一区二区三区四区视频| 久久久久久无码精品大片| 国产校园另类小说区| wwwxxx黄色片| av一区二区高清| 国产精品午夜视频| 国产激情小视频在线| 日韩欧美中文字幕精品| 国产一国产二国产三| 成人avav影音| 精品国产成人av在线免| 第四色成人网| 亚洲一区二区在线播放| 毛片在线网址| 精品视频在线播放色网色视频| 成年人av网站| ...xxx性欧美| 欧美图片自拍偷拍| 在线亚洲伦理| 一区二区日本伦理| 午夜久久av| 4444欧美成人kkkk| 日本高清视频在线观看| 欧美tk丨vk视频| av网站中文字幕| 国产精品亲子伦对白| zjzjzjzjzj亚洲女人| 午夜在线a亚洲v天堂网2018| 亚洲欧美精品在线观看| 秋霞一区二区三区| 国产97色在线| 中文字幕中文字幕在线中高清免费版 | 国产偷国产偷精品高清尤物| 国产一级片中文字幕| 欧美日韩国产欧| 欧美一区二区三区在线免费观看 | 青春草视频在线| 亚洲精选中文字幕| 国产成人三级在线播放 | 国产又粗又猛又黄| 午夜精品久久久久久久99水蜜桃 | 天堂av资源网| 欧美群妇大交群中文字幕| 久久高清无码视频| 亚洲国产成人在线| 成人在线视频免费播放| 久久超碰97中文字幕| 欧美日韩在线一| 99精品在线观看| 久久免费视频1| 日韩最新av| 国产精品视频99| 亚洲人体视频| 欧美精品九九久久| 老司机午夜在线视频| 亚洲日韩欧美视频一区| 狠狠人妻久久久久久综合麻豆 | 看欧美ab黄色大片视频免费| 欧美日韩精品| 亚洲一区免费看| 一本久久青青| 国产精品区一区| 国产一区二区三区亚洲综合| 国产xxx69麻豆国语对白| 91九色在线播放| 欧美老女人性视频| 精品视频在线一区二区| 夜夜嗨av色综合久久久综合网| 六月丁香色婷婷| 欧美成人bangbros| 99国产在线播放| 欧美精品在线观看播放| 波多野结衣在线电影| 黑人巨大精品欧美一区免费视频| 精品无码人妻一区二区三| 亚洲人xxxx| 无码黑人精品一区二区| 最新久久zyz资源站| 91成人精品一区二区| 久久精品一区二区| 日本黄色网址大全| 99久久99久久精品免费看蜜桃| 亚洲欧洲国产视频| 国产麻豆精品视频| 亚洲911精品成人18网站| 国产一区二区导航在线播放| 在线视频观看一区二区| 久久精品99久久久| 国产精品嫩草影院8vv8| 久久99精品国产麻豆不卡| 色天使在线观看| 黑人巨大精品欧美一区| 涩多多在线观看| 国产高清久久久| 逼特逼视频在线观看| 成人99免费视频| 国产精品一级黄片| 2020国产精品自拍| 日韩毛片无码永久免费看| 国产人伦精品一区二区| 亚洲AV成人无码网站天堂久久| 中文字幕第一区第二区| 在线观看亚洲网站| 一区二区三区在线影院| 国产一级视频在线播放| 亚欧色一区w666天堂| 久久久精品福利| 欧美在线播放高清精品| 中文字幕人妻丝袜乱一区三区| 欧美色手机在线观看| 91精品国产乱码久久| 日韩欧美在线不卡| 天天干天天摸天天操| 亚洲另类xxxx| 秋霞a级毛片在线看| 九九久久综合网站| 夜鲁夜鲁夜鲁视频在线播放| 国产精品偷伦一区二区| 国产精品日本一区二区三区在线| 国产精品久久久久久久免费大片 | 国产丝袜一区二区| 成人精品一区二区三区免费| 久久综合久久88| 国产调教在线| 国产精品自拍偷拍| 丁香婷婷成人| 日韩精品资源| 欧美色综合网| 日本熟妇人妻中出| 福利视频网站一区二区三区| 97超碰在线免费观看| 国产福利在线看| 亚洲国产一区二区三区四区| 大片免费播放在线视频| 欧美激情久久久久| 中文字幕日本一区二区| 99在线免费观看视频| 精品一区二区三区在线| 成人小视频在线观看免费| 日韩精品五月天| 欧美xxxxx少妇| 国产精品伦一区| 国产成人在线观看网站| 欧美在线观看你懂的| 婷婷在线观看视频| www.欧美精品| 永久免费毛片在线播放| 91色琪琪电影亚洲精品久久| 亚洲综合福利| www.日本三级| 激情综合网天天干| 欧美做受高潮6| 亚洲电影一区二区三区| 国产一区二区三区四区视频| 亚洲欧美日本精品| 国产羞羞视频在线播放| 成人福利视频在线观看| 伊人久久大香线蕉无限次| 色播五月激情综合网| 在线免费观看av网址| 精品人伦一区二区色婷婷| 免费a级毛片在线播放| 欧美壮男野外gaytube| 国产调教精品| av动漫在线播放| 国产一区二区三区在线观看免费 | 成年人看片网站| 一色桃子久久精品亚洲| 97人妻精品视频一区| 精品亚洲va在线va天堂资源站| 久草在线资源站资源站| 999国产在线| 在线中文字幕亚洲| aaa一级黄色片| 国产精品欧美经典| 在线播放成人av| 伊人av综合网| 国产91精品在线| 亚洲国产午夜伦理片大全在线观看网站| 国产精品免费看| 中文字幕一区三区久久女搜查官| 亚洲综合av网| 日本xxxx人| 午夜精品久久久久久久99热 | 成年人午夜剧场| 欧美日韩电影在线| 天堂资源在线中文| 成人性生交大片免费看视频直播| 日韩在线观看| 天堂av8在线| 亚洲欧美日韩国产一区二区三区| 国产又大又黄的视频| 久久这里有精品视频| 免费精品一区| 久久久久99精品成人片| 国产99精品在线观看| 日本一二三区视频| 国产麻豆免费观看| 欧美激情高清视频| 国内精品偷拍| 日日碰狠狠躁久久躁婷婷| 久久精品在线观看| 国产精品国产一区二区三区四区| 精品久久久av| 亚洲国产欧美国产第一区| 青青青在线视频播放| 91亚洲精品一区二区乱码| 日本黄色一级视频| 日韩小视频在线观看| 视频成人永久免费视频| 日本中文字幕网址| 国产视频亚洲色图| 国产精品亚洲欧美在线播放| 欧美精品日韩www.p站| 欧美日日夜夜| 天堂网在线免费观看| 亚洲精品菠萝久久久久久久| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| …久久精品99久久香蕉国产| 清纯唯美亚洲综合一区| 亚洲精品乱码久久久久久9色| 香蕉av福利精品导航| 超碰免费在线| 999国内精品视频在线| 久久av最新网址| 永久免费看片视频教学| 精品国产乱码久久久久久牛牛| 色戒汤唯在线观看| 亚洲在线色站| www.亚洲色图| 91久久精品国产91性色69| 欧美激情videos| 欧美在线免费看视频| 午夜不卡久久精品无码免费| 欧美亚州韩日在线看免费版国语版| 50度灰在线| 日韩av电影在线观看| 国产成人av网站| 影音先锋黄色网址| 高清一区二区三区四区五区 | 日韩亚洲欧美一区二区| 国产视频在线观看一区二区三区 | av资源免费观看|