下載量已超越千萬的爆紅遊戲2048(同名小3傳奇、1024)源代碼解密和下載(第二篇)

簡介
上一篇我們主要分析了1024原版的基本思路和簡單算法,這一篇我們將繼續分析如何實現各種版本的聚合;
運行demo需要配置好CocosEditor,暫不支持其他工具。demo基於javascript語言,cocos2d-x遊戲引擎,CocosEditor手遊開發工具完成的,可移植運行android,ios,html5網頁等。
apk演示效果


CocosEditor版源代碼下載:

cocos2d-js源代碼請到集中營下載:http://blog.makeapp.co/?p=523




效果圖:


SouthEast



代碼分析

1  建立JS數組,有三個數組 背景顏色-等級分數-版本選擇 建好之後可以在程序裏面直接調用;

版本數組裏面每一個版本名字、類型、字體大小和等級數組


[javascript]view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. COLOR = [cc.c3b(255, 255, 255),  

  2.    cc.c3b(238, 246, 246), cc.c3b(172, 141, 173), cc.c3b(255, 237, 196),  

  3.    cc.c3b(242, 197, 170), cc.c3b(191, 164, 157), cc.c3b(125, 125, 106),  

  4.    cc.c3b(247, 240, 145), cc.c3b(221, 204, 163), cc.c3b(251, 96, 191), cc.c3b(254, 128, 128),  

  5.    cc.c3b(211, 84, 113), cc.c3b(63, 130, 211),  

  6. //other

  7.    cc.c3b(100, 85, 39), cc.c3b(75, 34, 255), cc.c3b(58, 68, 104),  

  8.    cc.c3b(7, 0, 234), cc.c3b(153, 45, 85), cc.c3b(15, 254, 36), cc.c3b(78, 2, 34),  

  9.    cc.c3b(255, 125, 64), cc.c3b(237, 145, 33)  

  10. ];  

  11. SCORES = [0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048];  

  12. VERSIONS = [  

  13.    {  

  14.        num: 1,  

  15.        name: "2048原版",  

  16.        type: "number",  

  17.        labelFontSize: 50,  

  18.        array: [0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]  

  19.    },  

  20.    {  

  21.        num: 2,  

  22.        name: "歷史版",  

  23.        type: "string",  

  24.        labelFontSize: 50,  

  25.        array: [" ", "商", "周", "秦", "漢", "唐", "宋", "元", "明", "清", "民國", "天朝"]  

  26.    },  

  27.    {  

  28.        num: 3,  

  29.        name: "後宮版",  

  30.        type: "string",  

  31.        labelFontSize: 40,  

  32.        array: [" ", "宮女", "答應", "常在", "貴人", "嬪", "妃", "貴妃", "皇貴妃", "皇后", "皇太后", "太皇太后"]  

  33.    },  

  34.    {  

  35.        num: 4,  

  36.        name: "軍旅版",  

  37.        type: "string",  

  38.        labelFontSize: 40,  

  39.        array: [" ", "小兵", "班長", "排長", "連長", "營長", "團長", "旅長", "師長", "軍長", "司令", "軍委主席"]  

  40.    },  

  41.    {  

  42.        num: 5,  

  43.        name: "學歷版",  

  44.        type: "string",  

  45.        labelFontSize: 40,  

  46.        array: [" ", "幼兒", "小學", "中學", "高中", "專科", "本科", "研究", "碩士", "博士", "博士後", "院士"]  

  47.    },  

  48.    {  

  49.        num: 6,  

  50.        name: "金庸版",  

  51.        type: "string",  

  52.        labelFontSize: 40,  

  53.        array: [" ", "令狐沖", "楊過", "郭靖", "虛竹", "風清揚", "張三丰", "東方不敗", "逍遙老祖", "獨孤求敗", "掃地神僧", "達摩老祖"]  

  54.    },  

  55.    {  

  56.        num: 7,  

  57.        name: "生肖版",  

  58.        type: "string",  

  59.        labelFontSize: 40,  

  60.        array: [" ", "鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬", "龍"]  

  61.    },  

  62.    {  

  63.        num: 8,  

  64.        name: "星座版",  

  65.        type: "string",  

  66.        labelFontSize: 40,  

  67.        array: [" ", "白羊座", "金牛座", "雙子座", "巨蟹座", "獅子座", "處女座", "天秤座", "天蠍座", "射手座", "魔羯座", "水瓶座", "雙魚座"]  

  68.    },  

  69.    {  

  70.        num: 9,  

  71.        name: "甲乙丙版",  

  72.        type: "string",  

  73.        labelFontSize: 40,  

  74.        array: [" ", "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]  

  75.    },  

  76.    {  

  77.        num: 10,  

  78.        name: "豪車版",  

  79.        type: "string",  

  80.        labelFontSize: 40,  

  81.        array: [" ", "大衆", "奔馳", "悍馬", "法拉利", "奧迪", "寶馬", "蘭博基尼", "凱迪拉克", "世爵"]  

  82.    }  

  83. ];  





2 然後找到建好的版本選擇LevelLayer.js,初始化4*4版本選擇表格和點擊單個表格跳轉到不同的版本里面

#把plist加入緩存addSpriteFrames();

#雙層循環this.tables,每一個單元格放入一個新建的精靈cell=cc.MySprite.create(this.rootNode, "6.png", cc.p(px, py), 1)

#根據i,j確定cell的編號num=4*i+j;

#有了編號num可以從VERSIONS數組裏面獲取版本名字VERSIONS[num].name

#建立文字標籤cellLabel = cc.MySprite.createLabel(cell, VERSIONS[num].name);


#表格初始化之後需要添加觸摸事件;又一次雙層循環this.tables

#檢測精靈觸摸cc.rectContainsPoint(sprite.getBoundingBox(), loc)

#找到編號num,傳值到全局變量indexVersions=num;主場景就根據這個標示來確定版本;

#跳轉到主場景cc.BuilderReader.runScene("", "MainLayer");


[javascript]view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. LevelLayer.prototype.onEnter = function () {  

  2.    cc.SpriteFrameCache.getInstance().addSpriteFrames("res/main.plist");  

  3. this.initX = 9;  

  4. this.initY = 850;  

  5. this.cellSize = 162;  

  6. this.cellSpace = 18;  

  7. this.tables = new Array(4);  

  8. for (var j = 0; j < 4; j++) {  

  9. var sprites = new Array(4);  

  10. for (var i = 0; i < 4; i++) {  

  11. var px = this.initX + this.cellSize / 2 + i * (this.cellSize + this.cellSpace);  

  12. var py = this.initY + this.cellSize / 2 - j * (this.cellSize + this.cellSpace);  

  13. var cell = cc.MySprite.create(this.rootNode, "6.png", cc.p(px, py), 1);  

  14. var num = 4 * j + i;  

  15. if (num < VERSIONS.length) {  

  16. var cellLabel = cc.MySprite.createLabel(cell, VERSIONS[num].name);  

  17.                cellLabel.setFontSize(30);  

  18.            }  

  19.            sprites[i] = cell;  

  20.        }  

  21. this.tables[j] = sprites;  

  22.    }  

  23. };  

  24. LevelLayer.prototype.onTouchesBegan = function (touches, event) {  

  25.    cc.log("onTouchesBegan");  

  26. var loc = touches[0].getLocation();  

  27. for (var j = 0; j < 4; j++) {  

  28. for (var i = 0; i < 4; i++) {  

  29. var sprite = this.tables[j][i];  

  30. if (cc.rectContainsPoint(sprite.getBoundingBox(), loc)) {  

  31. var num = 4 * j + i;  

  32.                cc.log("num==" + num);  

  33. if (num < VERSIONS.length) {  

  34.                    indexVersions = num;  

  35.                    cc.BuilderReader.runScene("", "MainLayer");  

  36.                }  

  37.            }  

  38.        }  

  39.    }  

  40. };  




3 進入主場景,根據第二步得到的indexVersions,從數組VERSIONS裏面獲取版本實體this.indexVersion = VERSIONS[this.versionNum];

[javascript]view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. MainLayer.prototype.onEnter = function () {  

  2. //version

  3. this.versionNum = indexVersions;  

  4. this.indexVersion = VERSIONS[this.versionNum];  

  5. this.title.setString(this.indexVersion.name + "目標:" + this.indexVersion.array[this.indexVersion.array.length - 1] + "");}  




4 刷新按鈕事件和返回按鈕;刷新按鈕比較簡單,關鍵是返回按鈕,它是一個文字標籤,cocos裏面沒有關聯點擊事件;這裏筆者通過觸摸和創建矩形的方法來解決了這個問題;


[javascript]view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. MainLayer.prototype.onRefreshClicked = function () {  

  2.    cc.BuilderReader.runScene("", "MainLayer");  

  3. };  

  4. MainLayer.prototype.onTouchesBegan = function (touches, event) {  

  5. this.pBegan = touches[0].getLocation();  

  6. //back

  7. var backRect = cc.rectCreate(this.back.getPosition(), [50, 30]);  

  8. if (cc.rectContainsPoint(backRect, this.pBegan)) {  

  9. this.back.runAction(cc.Sequence.create(cc.ScaleTo.create(0.2, 1.1),  

  10.            cc.CallFunc.create(function () {  

  11.                cc.AudioEngine.getInstance().stopAllEffects();  

  12.                cc.BuilderReader.runScene("", "LevelLayer");  

  13.            })  

  14.        ));  

  15.    }  

  16. };  


兩篇博文完結;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章